Java综合应用实验-多人聊天室(多线程实现)
1.实验目的:
编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是 “欢迎使用 XXX 聊天室应用”,其中 XXX 是自己的班级姓名学号,如“软件 171 张三 1234”。
2.实验代码:
服务端程序代码:
ServerChat.java
package works;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ServerChat {
//定义Map集合用于存储用户的Socket以及用户的名字 key:Socket Value:用户名
public final static Map<Socket,String> socketsMaps = Collections.synchronizedMap(new HashMap<Socket,String>());
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 创建服务端套接字
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("------服务端暴露-------");
while (true) {
// 监听客户端套接字,若有客户端连接,则代码不会往下执行,否则会堵塞在此处。
Socket socket = serverSocket.accept();
// 开启线程,用于读取客户端发送的信息,并转发给每一个客户端
new ThreadServer(socket).start();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
class ThreadServer extends Thread {
private Socket socket;
ThreadServer(){
};
ThreadServer(Socket socket)
{
this.socket = socket;
}
@Override
public void run() {
try {
while(true)
{
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String data = dataInputStream.readUTF();
if(data.startsWith("①②③④")&&data.endsWith("①②③④"))
{
//发送过来的是用户名<