记得刚上大学时,特别喜欢用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群发消息,那么如果实现点对点发送消息呢。下一讲我们将就这一方面进行探讨。