记得刚上大学时,特别喜欢用qq聊天,用qq发送消息,那时特别惊讶,qq怎么能够实现那么快接收消息功能,而且还是点对点的发送接收消息。
现在回想起来,其实也不是那么难,只是接触的早晚问题,毕竟在那个年代知道编程的人本来就少。
这里我们就怎么设计一个简要的群发聊天程序做个简要介绍。
一、定义需求,实现基于java版的socket聊天程序,能够实现群发消息。
二、程序流程:
三、程序实现
1、socket服务端代码:监听9000端口,当监听到有客户端接入时,把接收到的socket封装成一个
ChatSocket类,启动线程,监听socket有没消息过来,当有消息过来时,把消息群发给其他客户端。
监听程序:
public class ServerListener implements Runnable { @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(9000); while (true) { Socket socket = serverSocket.accept(); ChatSocket cs = new ChatSocket(socket); cs.start(); ChatManager.getChatManager().add(cs); } } catch (Exception e) { e.printStackTrace(); } } }
接收消息程序:
public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket s) { this.socket = s; } public void out(String out) { try { socket.getOutputStream().write(out.getBytes("GBK")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket .getInputStream(), "GBK")); String line = null; //循环不断读取流 while ((line = br.readLine()) != null) { System.out.println(line); ChatManager.getChatManager().publish(this, line); } br.close(); } catch (IOException e) { //处理连接关闭 e.printStackTrace(); } } }
2、socket客户端先启动连接socket服务器端,再循环获取服务端发送过来的消息,同时客户端也可以通过文本发送消息。
public class ClientManager { private ChatClientWindow window; private Socket socket; private String ip; private int port; private BufferedReader bReader; private PrintWriter pWriter; public ClientManager(String ip,int port) { this.ip = ip; this.port = port; } public void setWindow(ChatClientWindow window) { this.window = window; } /** * 启动连接线程 */ public void connect() { new Thread() { @Override public void run() { try { socket = new Socket(ip, port); pWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"GBK")); bReader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK")); String line = null; while ((line = bReader.readLine()) != null) { window.appendText("收到: " + line); } pWriter.close(); bReader.close(); pWriter = null; bReader = null; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } public void send(String sendMsg) { if (pWriter != null) { pWriter.write(sendMsg + "\n"); pWriter.flush(); } } }
总结:这里简易介绍了怎么用socket群发消息,那么如果实现点对点发送消息呢。下一讲我们将就这一方面进行探讨。