自己写的Socket多人聊天 解决了客户端退出引起的服务器的SocketException ,以及服务器退出引起的客户端异常
这里是客户端代码(用的时候把socket端口号改一下,因为我是写的一整个项目,用手机卡注册以后进入聊天室,可以手动输入房间号)
不要搞错运行顺序哦 先开服务器端再开客户端
package Item;
import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
/**
- @program: JavaSE
- 描述:
- @author: ZJY
- @create: 2020-08-15 22:46
**/
public class Client {
static Socket socket;
static int port;
public Client(int port){
this.port=port;
}
public static void main(String[] args) {
try {
socket = new Socket(“127.0.0.1”, 8888);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
new ClientThread().start();
String msg;
while ((msg=br.readLine())!=null){
System.out.println(msg);
}
socket.close();
}
catch (SocketException e){
System.out.println(“房主退出房间 聊天室关闭”);
}catch (IOException e) {
e.printStackTrace();
}
}
static class ClientThread extends Thread{
@Override
public void run() {
Scanner sc=new Scanner(System.in);
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
String msg;
while((msg=sc.next())!=null){
pw.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
然后是服务器端代码
package Item;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Scanner;
/**
-
@program: JavaSE
-
描述:
-
@author: ZJY
-
@create: 2020-08-15 14:58
**/
public class Server {
static int port;
static ArrayList list = new ArrayList<>();
static int i=1;public Server(int port) {
this.port = port;
}public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8888);
System.out.println(“欢迎进入”+port+“房间”);
System.out.println(“群聊已开启 请畅所欲言吧”);
while (true) {
Socket socket = serverSocket.accept();
i++;
System.out.println(“第”+i+“个人进入房间”);
list.add(socket);
new receiveThread(socket).start();
new sendThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//接收线程
static class receiveThread extends Thread {
Socket socket;
String msg;public receiveThread(Socket socket) { this.socket = socket; } @Override public void run() { int a=0; try { a=i; InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); msg = "欢迎第" + a + "个人进入聊天室,目前有" + (list.size()+1) + "人在线"; send(); while ((msg = br.readLine()) != null) { msg = "第"+a+"个人说:" + msg; send(); } socket.close(); } catch (SocketException e){ msg=a+"号退出了房间,目前有"+list.size()+"人在线"; send(); } catch (IOException e) { e.printStackTrace(); } list.remove(socket); } public void send() { System.out.println(msg); for (int i = 0; i < list.size(); i++) { try { PrintWriter pw = new PrintWriter(list.get(i).getOutputStream(), true); pw.println(msg); } catch (IOException e) { e.printStackTrace(); } } }
}
//发送线程
static class sendThread extends Thread {
Socket socket;public sendThread(Socket socket) { this.socket = socket; } @Override public void run() { Scanner sc = new Scanner(System.in); try { String msg; while ((msg = sc.next()) != null) { msg = "房主说:" + msg; System.out.println(msg); for (int i = 0; i < list.size(); i++) { PrintWriter pw = new PrintWriter(list.get(i).getOutputStream(), true); pw.println(msg); } } } catch (IOException e) { e.printStackTrace(); } }
}
}
没怎么写注释 但是我猜大家应该看得懂。。。