android的socket通信
一台PC和两部手机,手机作为客户端和服务器之间以socket方式通信,PC作为服务器在客户端之间转发消息,实现两个客户端之间的通信。
(一)客户端实现:
- 初始化工作:
指定IP和端口,新建socket对象。这个IP和端口都要和服务器那边的socket一样。
Socket mSocket = new Socket(ip, port);
然后通过客户端socket对象获取writer和reader:
mReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "utf-8"));
mWriter = new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "utf-8"));
- 读取消息:
mReader.readLine()方法是阻塞式的,就是说有消息传来才会进入下一步。
规定以JSON对象来传输消息,于是根据mReader.readLine()读出的String构建JSON:
JSONObject json = new JSONObject((String)mReader.readLine());
最后将json中的数据读出来即可。
- 发送消息:
构建一个JSON对象,将数据放入其中,然后使用下面语句发送:
mWriter.write(json.toString()+"\n");
mWriter.flush();
(二)服务器端实现:
服务器端有两个功能,监控客户端和服务器之间的连接,并维护一个消息队列。
- 处理消息队列线程:
一个线程用于监控消息队列长度,当长度大于0时,按顺序从队列中取出前面的消息,构建JSON对象,然后通过
writer.write(json.toString()+"\n");
writer.flush();
语句发送消息,其中writer是根据socket获取的bufferwriter:
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
- 监听客户端对服务器的连接:
初始化时,新建服务器端socket:
ServerSocket mServer = new ServerSocket(port);
并通过调用阻塞方法
Socket socket = mServer.accept();
获得一个socket对象,这行代码只会在有客户端连上服务器后才执行,于是我们可以得知,添加了新的客户端。
之后的流程与客户端一样,通过reader读取客户端的数据,并添加到消息队列;处理消息队列线程发现有新消息送来,于是将该消息发送出去:
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
String data = reader.readLine();//阻塞语句,有数据送到服务器才会往下执行
JSONObject json = new JSONObject(data);
从json中读出数据,再重新打包成自定义的消息类,最后添加到消息队列中去。