关于IO流的代码
添加输出流
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
PrintWriter pw = new PrintWriter(osw,true);
allOut.add(out);
监听输入流
BufferedReader读满缓冲区或者读到换行符才返回,实际上readLine()是一个阻塞函数,所以执行完一重循环并不会立即跳出来,而是在没有数据读取时,一直阻塞在那,这样就实现了while(1)的效果
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String message = null;
while((message = br.readLine())!=null) {//无字符丢失地得到一行
for(PrintWriter out:allOut) {
out.println(message);
}
}
思路
Ⅰ、服务端
两个按钮,两个事件
n+1个线程:一个线程等socket连接,n个线程等n个用户写消息到socket输出流
一、开启
- 初始化输出流集合、new ServerSocket(8888)
- 开线程①用server.accept()接收客户端socket
- 每成功连接一个客户端就开一个服务线程,它做两件事:拿到socket输出流、阻塞监听socket输入流并广播(通过socket输出流发送)
二、关闭
server.close()
对比读写
Ⅱ、客户端
三个按钮,三个事件
三个线程:创建socket、监听服务器发的广播、监听用户输入
一、发送
点击发送会把用户输入的聊天内容写到socket输出流
二、连接
- 弹出AlertDialog
- 点击确定开线程①建立连接->new Socket(ip, serverPort)
- 确认socket创建后,开线程②阻塞监听socket输入流拿到广播消息并显示,开线程③监听用户输入并通过socket输出流发送出去
三、断开
socket.close()
对比读写:
最终效果