简单的TCP控制台聊天室程序

本文介绍了一个简单的TCP控制台聊天室程序,包括服务器类TcpServer、客户端类TcpClient及若干线程类,用于消息转发、接收和发送。程序支持多客户端连接,可以进行私聊和退出操作,并附有运行截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器类TcpServer

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class TcpServer {
    public static List<ServerThread> list = new ArrayList<ServerThread>(); 
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9527);
        System.out.println("服务器正在监听。。。");
        while (true) {
            Socket socket = server.accept();
            System.out.println("一个客户端成功连接");
            ServerThread st = new ServerThread(socket);
            list.add(st);
            st.start();
        }
        
    }
}

客户端类TcpClient

package com.qf.g_hmwk;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1",9527);
        
        new WriteThread(socket).start();
        
        new ReadThread(socket).start();
    }
}

服务器负责转发消息的线程类ServerThread

package com.qf.g_hmwk;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.List;

import com.qf.utils.CloseAll;

public class ServerThread extends Thread {
    private Socket socket;
    private BufferedReader br;
    private BufferedWriter bw;

    public ServerThread(Socket socket) throws IOException {
        this.socket = socket;
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    }

    @Override
    public void run() {
        welcome();
        try {
            while (true) {
                String msg = br.readLine();
                if (msg.startsWith("@") && msg.contains("#")) {
                    String[] msgs = msg.substring(1).split("#");
                    String name = msgs[0];
                    String content = msgs[1];
                    sendToAnother(name,content);
                } else {
                    sendToOthers(msg);
                }
            }
        } catch (IOException e) {
            sendToOthers("【温馨提示】:用户"+getName()+"退出了聊天室。");
        } finally {
            CloseAll.closeAll(socket,br,bw);
        }
    }

    private void sendToOthers(String msg) {
        for(ServerThread st : TcpServer.list) {
            if (st != this) {
                st.sendMsg(getName()+"说:"+msg);
            }
        }
    }

    private void sendToAnother(String name, String content) {
        for(ServerThread st : TcpServer.list) {
            if (st.getName().equals(name)) {
                st.sendMsg(getName()+"悄悄对你说:"+content);
            }
        }
    }

    private void welcome() {
        try {
            String msg = br.readLine();
            setName(msg);
            for(ServerThread st : TcpServer.list) {
                st.sendMsg("【温馨提示】:欢迎"+msg+"进入聊天室");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void sendMsg(String msg)  {
        try {
            bw.write(msg);
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

接收服务器转发的信息并打印的线程类ReadThread

package com.qf.g_hmwk;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import com.qf.utils.CloseAll;

public class ReadThread extends Thread{
    private Socket socket;
    private BufferedReader br;
    
    public ReadThread(Socket socket) throws IOException {
        this.socket = socket;
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    
    @Override
    public void run() {
        try {
            while (true) {
                String msg = br.readLine();
                System.out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            CloseAll.closeAll(socket,br);
        }
    }
}

接收控制台输入信息发给服务器的线程类WriteThread

package com.qf.g_hmwk;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import com.qf.utils.CloseAll;

public class WriteThread extends Thread{
    private Socket socket;
    private BufferedReader br;
    private BufferedWriter bw;
    
    public WriteThread(Socket socket) throws IOException {
        this.socket = socket;
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    }

    @Override
    public void run() {
        try {
            System.out.println("请输入用户名:");
            while (true) {
                String msg = br.readLine();
                bw.write(msg);
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            CloseAll.closeAll(socket,br,bw);
        }
    }
}

运行截图

启动服务器以及三个客户端(展示三个客户端)

在这里插入图片描述

输入用户名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发送消息

在这里插入图片描述

私聊

在这里插入图片描述

退出提示

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值