基于Java+socket实现多线程聊天室-控制台版

一、系统介绍

首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。

client发送exit指令可以下线,所有的client端,以及server端都会收到它的下线通知。

原理
socket 通信是基于TCP/IP 网络层上的一种传送方式。

首先,服务端初始化ServerSocket,然后对指定的端口(这里是65000)进行绑定,接着对端口进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接,就创建了一个客户端线程。

然后就是客户端的启动和连接了,在服务端socket启动之后,启动客户端连接ServerSocket,这里实现了多线程,可以同时连接多个客户端。这里多线程方面使用了线程池,线程池的作用是:

  • 线程复用,减少创建线程耗时;
  • 防止短时间内高并发,指定线程池大小,超过数量将等待,防止短时间创建

大量线程导致资源耗尽,服务挂掉。

二、功能展示

1.运行效果

在这里插入图片描述

三、代码展示

package wechat;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
 

import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class WeChatClient {

    Socket clientSocket = null;
    BufferedReader reader = null;
    private static final int PORT = 65000;

    public static void main(String[] args) throws IOException {
        new TCPClient();
        System.exit(0);  //client退出后自动结束此进程
    }

	//客户端逻辑写在构造方法中
    public TCPClient() {
        clientSocket = new Socket();
        try {
            clientSocket.connect(new InetSocketAddress("localhost", PORT));
            new getInputStream().start();
            System.out.println("Client started!");
            reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String receiveStr = null;
            while ((receiveStr = reader.readLine()) != null) {
                //接收服务端发来的数据
                if (receiveStr.equals("exit")) {
                //如果发送exit,服务端会回传exit,这里判断回传的是不是exit。是的话就结束此线程
                    break;
                }
                System.out.println(receiveStr);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	//exit -> 关闭客户端套接字、线程、BufferReader
            try {
                if (reader != null) {
                    reader.close();
                }
                if (clientSocket != null) {
                    clientSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

	//客户端线程,用于向服务端写入从客户端控制台输入的数据
    class getInputStream extends Thread {
        @Override
        public void run() {
            BufferedReader is = null;
            PrintWriter os = null;
            try {
                is = new BufferedReader(new InputStreamReader(System.in));
                os = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
                String str = null;
                while ((str = is.readLine()) != null) {
                    os.println(str);
                    os.flush();
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

四、其它

1.其他系统实现

Java+Swing实现学生选课管理系统
Java+Swing实现学校教务管理系统
Java+Swing+sqlserver学生成绩管理系统
Java+Swing用户信息管理系统
Java+Swing实现的五子棋游戏
基于JavaSwing 银行管理系统
Java+Swing+mysql仿QQ聊天工具
Java+Swing 聊天室
Java+Swing+dat文件存储实现学生选课管理系统
Java+Swing可视化图像处理软件
Java+Swing学生信息管理系统
Java+Swing图书管理系统
Java+Swing图书管理系统2.0
基于java+swing+mysql图书管理系统3.0
大作业-基于java+swing+mysql北方传统民居信息管理系统

2.获取源码

点击下载
基于Java+socket实现多线程聊天室-控制台版

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值