java socket聊天室
程序员文章站
2022-07-12 17:31:38
...
一个java版本的控制台版的聊天室,记录一下。以便后续使用
服务端
package com.tcp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * 1.创建服务器端口 * 2.接收客户端连接 * 3.发送数据 * @author jacktan * */ public class Server { public List<MyCall> all = new ArrayList<>(); public static void main(String[] args) throws IOException { new Server().start(); } public void start() throws IOException { //1.创建服务器端口,指定端口 ServerSocket serverSocket = new ServerSocket(8888); //2.接收客户端连接,阻塞 while ( true ) { Socket socket = serverSocket.accept(); MyCall my = new MyCall(socket); //将客户端添加到容器中 all.add(my); new Thread(my).start(); } } private class MyCall implements Runnable { private BufferedReader br = null; private BufferedWriter bw = null; private boolean isRunning = true; private String name; public MyCall(Socket socket) { try { bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); this.name = br.readLine(); this.send(this.name+"欢迎您进入聊天室"); this.sendOther(this.name+"进入聊天室"); } catch (IOException e) { isRunning = false; } } /** * 读取消息 * @return */ public String receive() { String lineText = ""; try { lineText = br.readLine(); } catch (IOException e) { isRunning = false; CloseUtils.closeAll(br); all.remove(this); } return lineText; } /** * 发送数据 * @param msg */ public void send(String msg) { if ( msg == null || "".equals(msg) ) { return; } //私聊只需要改这里的代码就可以了 try { bw.write(msg); bw.newLine(); bw.flush(); } catch (IOException e) { isRunning = false; CloseUtils.closeAll(bw); all.remove(this); } } /** * 发送给其他人 */ public void sendOther(String msg) { //发送消息给所有人,不包含自己 for ( MyCall m : all ) { if ( m != this ) { m.send(msg); } } } @Override public void run() { while ( isRunning ) { sendOther(receive()); } } } }
客户端:
package com.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; /** * 1.创建连接 * 2.接收数据 * @author jacktan * */ public class Client { public static void main(String[] args) throws UnknownHostException, IOException { System.out.println("请输入您的名称:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String name = br.readLine(); Socket client = new Socket("localhost",8888); new Thread(new Send(client,name)).start(); new Thread(new Receive(client)).start(); } }
发送数据:
package com.tcp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; /** * 发送数据的线程 * * @author jacktan * */ public class Send implements Runnable { // 1.获取控制台输入流 private BufferedReader console; // 2.获取输出流 private BufferedWriter bw; // 3.当前线程标识 private boolean isRunning = true; // 4.客户名称 private String name; public Send() { console = new BufferedReader(new InputStreamReader(System.in)); } public Send(Socket socket,String name) { this(); this.name = name; try { bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //客户端一进入就给服务器发送一条消息 send(this.name); } catch (IOException e) { // 不让线程再运行 isRunning = false; CloseUtils.closeAll(console,bw); } } //从控制台接收数据 private String getMsgFromConsole() { try { return console.readLine(); } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } return ""; } //发送数据 public void send(String msg) { if ( msg != null && !msg.equals("") ) { try { bw.write(msg); //换行并强制刷新 bw.newLine(); bw.flush(); } catch (IOException e) { //发送失败退出 isRunning = false; CloseUtils.closeAll(console,bw); } } } @Override public void run() { while (isRunning) { send(getMsgFromConsole()); } } }
接收数据:
package com.tcp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import javax.sound.sampled.ReverbType; /** * 接收数据的线程 * @author jacktan * */ public class Receive implements Runnable { //1.获取输入流 private BufferedReader br = null; //2设置标识符 private boolean isRunning = true; public Receive(Socket socket) { try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { isRunning = false; CloseUtils.closeAll(br); } } /** * 接收数据 */ public String receive() { String lineText = ""; try { lineText = br.readLine(); } catch (IOException e) { isRunning = false; CloseUtils.closeAll(br); } return lineText; } @Override public void run() { while ( isRunning ) { System.out.println(receive()); } } }
关闭资料功能类
package com.tcp; import java.io.Closeable; import java.io.IOException; public class CloseUtils { /** * 关闭所有流 * * @param io */ public static void closeAll(Closeable... io) { for (Closeable temp : io) { if (temp != null) { try { temp.close(); } catch (IOException e) { // TODO Auto-generated catch block } } } } }
下一篇: Win 10 C 盘突然爆满,怎么清理?