您的位置:首页 > 移动开发 > Android开发

安卓Socket通信

2016-04-07 11:37 471 查看
进来做项目需要用到消息推送,顺手写一下Socket通信。

Socket是神马就不多说啦,说下它的特点以及和HTTP通信的区别。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。

下面先上一个Socket服务器端程序:

public class SocketServer {

//消息编码方式
public static final String bm = "utf-8";
BufferedReader reader;
BufferedReader inReader;
BufferedWriter writer;

/**
* @param args
*/
public static void main(String[] args) {
SocketServer socketServer = new SocketServer();
socketServer.StartServer();
}

private void StartServer() {
ServerSocket serverSocket = null;
Socket socket = null;
try {
//设置服务器监听端口
serverSocket = new ServerSocket(9898);
System.out.println("启动成功");
while (true) {
socket = serverSocket.accept();
System.out.println("客户端联入" + socket.hashCode());
manageConnection(socket);
sendMessage(socket);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭流
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// 向客户端发送消息
private void sendMessage(final Socket socket) {

new Thread(new Runnable() {

@Override
public void run() {
try {
// 发送的消息从命令行得到
inReader = new BufferedReader(new InputStreamReader(
System.in));
writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream(), bm));
String recivedmsg;
while ((recivedmsg = inReader.readLine()) != null) {
System.out.println("发送:" + recivedmsg);
writer.write(recivedmsg + "\n");
writer.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
inReader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();

}

// 接受客户端发来的消息
private void manageConnection(final Socket socket) {
new Thread(new Runnable() {

@Override
public void run() {
try {
// 读取信息
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream(), bm));
String recivedMsg;
while ((recivedMsg = reader.readLine()) != null) {
System.out.println(recivedMsg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}).start();
}
}


在服务器端我们主要是用到ServerSocket设置服务器监听端口,以及获得Socket对象。而我们主要的操作就是对这个Socket对象进行的操作。

下面是客户端代码:

布局部分:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">

<EditText
android:id="@+id/ip_address"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/neirong"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />

<Button
android:id="@+id/sendBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="发送"
android:textColor="#1133aa"
android:textSize="20sp" />

<TextView
android:id="@+id/receiveText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:textColor="#000000"
android:textSize="20sp" />

</LinearLayout>


SocketAvtivity类:

public class SocketAvtivity extends Activity implements View.OnClickListener {

private TextView receiveText;
private Button sendBtn;
private EditText ip_address;
private EditText neirong;

private String ip;
private Handler mHandler;
private static final int ww = 123;

private Socket socket;
private BufferedReader reader;
private BufferedWriter writer;

//设置消息编码方式
public static final String bm = "utf-8";
public String serverip = "192.168.1.115";
public int server_port = 9898;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_socket);

sendBtn = (Button) findViewById(R.id.sendBtn);
sendBtn.setOnClickListener(this);
receiveText = (TextView) findViewById(R.id.receiveText);
ip_address = (EditText) findViewById(R.id.ip_address);
neirong = (EditText) findViewById(R.id.neirong);
//服务器地址
ip_address.setText(serverip);

mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ww:
receiveText.setText((String) msg.obj);
break;
}
}
};

new Thread(new Runnable() {
@Override
public void run() {
ip = ip_address.getText().toString();
try {
socket = new Socket(ip, server_port);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), bm));
ReadServermsg(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

}

@Override
public void onClick(View v) {
if (v.getId() == R.id.sendBtn) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String msg = neirong.getText().toString();
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), bm));
writer.write(msg + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}

}

private void ReadServermsg(final BufferedReader reader) {
new Thread(new Runnable() {
@Override
public void run() {
String readerMsg;
try {
while ((readerMsg = reader.readLine()) != null) {
Message message = new Message();
message.what = ww;
message.obj = readerMsg;
mHandler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}


代码只有这么多,基本完成了Socket功能的介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息