Socket多人聊天,已解决客户端异常退出引起的SocketException

该博客展示了如何使用Java的Socket实现一个简单的多人聊天室。客户端和服务器端的代码分别给出,处理了客户端退出和服务器端异常的情况,确保了聊天室的稳定运行。用户可以输入房间号进入聊天室,并通过键盘输入消息进行交流。
摘要由CSDN通过智能技术生成

自己写的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();
         }
     }
    

    }
    }

没怎么写注释 但是我猜大家应该看得懂。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值