用java socket做一个聊天室,实现多人聊天的功能。看了极客学院的视频后跟着敲的。(1DAY)
服务端:
1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好
2. 实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket。启动线程后就把线程交给ChatManager管理
3. 在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端
4. ChatManager里面用vector来管理socket线程实例ChatSocket,并实现发送信息给其他的客户端
客户端:
1. 新建一个继承JFrame的MainWindow.java类,主要实现聊天窗口的UI,以及事件响应。
2. 新建StartClient.java类,把MainWindow中生成MainWindow主方法部分代码拷贝过来,这样就能在主程序中把窗体执行出来了。
3. 新建ChatManager(需要单例化的类)管理socket,实现聊天的输入输出功能。最后记得在1中新建窗口后,传一份frame的引用到ChatManager中,才能实现ChatManager对界面的显示。
工程结构如图
以下为代码
服务端:
1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好
package com.starnet.testserversocket.main;
public class MyServerSocket {
public static void main(String[] args) {
new ServerListener().start();
}
}
2.实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket。启动线程后就把线程交给ChatManager管理
package com.starnet.testserversocket.main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class ServerListener extends Thread {
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(23456);
while (true) {
// block
Socket socket = serverSocket.accept();
// 建立链接
JOptionPane.showMessageDialog(null, "有客户端连到本机23456端口");
//将socket传递给新的线程
ChatSocket cs= new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端
package com.starnet.testserversocket.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
/*每一个连上的客户端,服务器都有一个线程为之服务*/
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("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//服务器会不断地从客户端读取内容,把读取到的内容发给集合内所有的客户端。
public void