网络编程——利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。

基于Java的简易多人聊天室开发实战项目 简介:本项目介绍了一个使用Java开发的简易多人聊天室,旨在帮助初学者掌握Java多线程与网络编程的核心概念。聊天室支持群聊与私聊功能,并能动态更新在线用户列表,具备基本的并发处理能力。尽管当前版本存在无密码验证、用户名重复等安全缺陷,但提供了清晰的改进方向,如引入登录机制、SSL加密通信和消息历史记录等。该项目是学习Socket编程、多线程控制及客户端-服务器架构的理想实践案例。 阅读详情

目录:

目录

目录:

一、使用到的知识点:循环,判断,集合,IO,多线程,网络编程等

二、总结缺点:

三、知识点:

在 Properties 对象中,键值对是根据以下规则分配的:

四、文件构造

1.客户端:Client,java

 2.聊天记录:ClientMyRunnable.java

3.服务端:Server.java

4.多线程:MyRunnable

5.配置文件:userinfo.txt


一、使用到的知识点:循环,判断,集合,IO,多线程,网络编程等

二、总结缺点:

1.应该使用Properties prop = new Properties(); 双列集合,
获取配置文件中的名称和密码(否则需要的变量太多,太乱)
2.太多异常需要捕获,应该抽出一个方法,尽量进行抛出,需要捕获的异常尽量放一块
3.一个类中 不要放太多输入输出流,可以的话就写一个,然后,需要用就作为参数传递。
4.字符串的拼接尽量用 StringBuilder进行拼接,方便而且节省运行时间
5.需要使用多线程的方法,优先放进多线程的run方法中。

三、知识点:

在 Properties 对象中,键值对是根据以下规则分配的:

1.键:每一行的第一个部分,直到遇到第一个等号(=)或冒号(:)为止。键通常是字符串类型。
2.值:等号或冒号之后的部分,直到行尾。值可以是字符串、数字、布尔值等。
3.注释:以 # 开头的行被视为注释,不会被加载为键值对。

四、文件构造

1.客户端:Client,java
package com.itheima.client;

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 10001);
        System.out.println("服务器已经连接成功");


        while (true) {
            System.out.println("==============欢迎来到黑马聊天室================");
            System.out.println("1登录");
            System.out.println("2注册");
            System.out.println("请输入您的选择:");
            Scanner sc = new Scanner(System.in);
            String choose = sc.nextLine();
            switch (choose) {
                case "1" -> login(socket);
                case "2" -> register(socket);
                default -> System.out.println("没有这个选项");
            }
        }
    }
    //注册
    public static void register(Socket socket) throws IOException {
        //获取输入流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();

        //拼接
        //username=zhangsan&password=123
        StringBuilder sb = new StringBuilder();
        sb.append("username=").append(username).append("&password=").append(password);

        //第一次写的是执行注册
        bw.write("register");
        bw.newLine();//换行
        bw.flush();

        //第二次写的是用户名和密码的信息
        //往服务器写出用户名和密码
        bw.write(sb.toString());
        bw.newLine();
        bw.flush();

        //接收数据
        //获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = br.readLine();
        System.out.println(message);
        //0:注册成功  1:密码格式不正确 2:用户名格式不正确   3 用户名已存在
        if ("0".equals(message)) {
            System.out.println("注册成功,开始聊天");
            //开一条单独的线程,专门用来接收服务端发送过来的聊天记录
            new Thread(new ClientMyRunnable(socket)).start();
            //开始聊天
            talk2All(bw);
        } else if ("1".equals(message)) {
            System.out.println("密码格式错误");
        } else if ("2".equals(message)) {
            System.out.println("用户名格式错误");
        } else if ("3".equals(message)) {
            System.out.println("用户名已存在");
        }


    }

    //登录
    public static void login(Socket socket) throws IOException {
        //获取输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();

        //拼接
        StringBuilder sb = new StringBuilder();
        //username=zhangsan&password=123
        sb.append("username=").append(username).append("&password=").append(password);

        //第一次写的是执行登录操作
        bw.write("login");
        bw.newLine();
        bw.flush();

        //第二次写的是用户名和密码的信息
        //往服务器写出用户名和密码
        bw.write(sb.toString());
        bw.newLine();
        bw.flush();

        //接收数据
        //获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = br.readLine();
        System.out.println(message);
        //1:登录成功  2 密码有误   3 用户名不存在
        if ("1".equals(message)) {
            System.out.println("登录成功,开始聊天");
            //开一条单独的线程,专门用来接收服务端发送过来的聊天记录
            new Thread(new ClientMyRunnable(socket)).start();
            //开始聊天
            talk2All(bw);
        } else if ("2".equals(message)) {
            System.out.println("密码输入错误");
        } else if ("3".equals(message)) {
            System.out.println("用户名不存在");
        }

    }

    //往服务器写出消息
    private static void talk2All(BufferedWriter bw) throws IOException {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您要说的话");
            String str = sc.nextLine();
            //把聊天内容写给服务器
            bw.write(str);
            bw.newLine();
            bw.flush();
        }
    }
}

 2.聊天记录:ClientMyRunnable.java
package com.itheima.client;

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

class ClientMyRunnable implements Runnable{
    Socket socket;
    public ClientMyRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        //循环,重复的接受
        while (true) {
            try {
                //接收服务器发送过来的聊天记录
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = br.readLine();
                System.out.println(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

3.服务端:Server.java
package com.itheima.server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Properties;

public class Server {

    static ArrayList<Socket> list = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10001);

        //1.把本地文件中正确的用户名和密码获取到
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("D:\\java\\Project\\base2-code\\sockethomework\\servicedir\\userinfo.txt");
        prop.load(fis);
        System.out.println(prop.get("lisi"));
        fis.close();

        //2.只要来了一个客户端,就开一条线程处理
        while (true) {
            Socket socket = ss.accept();
            System.out.println("有客户端来链接");
            new Thread(new MyRunnable(socket, prop)).start();
        }
    }
}


4.多线程:MyRunnable
package com.itheima.server;

import java.io.*;
import java.net.Socket;
import java.util.Properties;
import java.util.Set;

class MyRunnable implements Runnable {
    Socket socket;
    Properties prop;

    public MyRunnable(Socket socket, Properties prop) {
        this.prop = prop;
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (true) {
                String choose = br.readLine();
                switch (choose) {
                    case "login" -> login(br);
                    case "register" -> register(br);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取用户注册时,传递过来的信息。
    //并进行判断
    public void register(BufferedReader br) throws IOException {
        System.out.println("用户选择了注册操作:");
        String userinfo = br.readLine();
        //username=zhangsan&password=123
        String[] userInfoArr = userinfo.split("&");
        String usernameInput = userInfoArr[0].split("=")[1];
        String passwordInput = userInfoArr[1].split("=")[1];
        System.out.println("用户输入的用户名为:" + usernameInput);
        System.out.println("用户输入的密码为:" + passwordInput);
        if(!prop.containsKey(usernameInput)){
            //如果用户名不存在,继续判断
            //判断用户名格式
            boolean flag1 = usernameInput.matches("[a-zA-Z]{6,18}");
            if(flag1){
                //用户名格式正确,继续判断
                //判断密码格式
                boolean flag2 = passwordInput.matches("[a-zA-Z]\\d{2,7}");
                if(flag2){
                    //将用户写道配置文件中
                    //zhangsan=123
                    StringBuilder sb = new StringBuilder();
                    sb.append(usernameInput).append(passwordInput);
                    prop.put(usernameInput,passwordInput);
                    pezhi(prop);
                    //密码格式正确,提示用户开始聊天
                    writeMessage2Client("0");
                    //注册成功的时候,就需要把客户端的连接对象Socket保存起来
                    Server.list.add(socket);
                    //写一个while(){}表示正在聊天
                    //接收客户端发送过来的消息,并打印在控制台
                    talk2All(br, usernameInput);
                }else{
                    //密码格式不正确,直接回写
                    writeMessage2Client("1");
                }
            }else{
                //用户名格式不正确,直接回写
                writeMessage2Client("2");
            }
        }else{
            //如果用户名存在,直接回写
            writeMessage2Client("3");
        }


    }

    //获取用户登录时,传递过来的信息。
    //并进行判断
    public void login(BufferedReader br) throws IOException {
        System.out.println("用户选择了登录操作");
        String userinfo = br.readLine();
        //username=zhangsan&password=123
        String[] userInfoArr = userinfo.split("&");
        String usernameInput = userInfoArr[0].split("=")[1];
        String passwordInput = userInfoArr[1].split("=")[1];
        System.out.println("用户输入的用户名为:" + usernameInput);
        System.out.println("用户输入的密码为:" + passwordInput);

        if (prop.containsKey(usernameInput)) {
            //如果用户名存在,继续判断密码
            String rightPassword = prop.get(usernameInput) + "";
            if (rightPassword.equals(passwordInput)) {
                //提示用户登录成功,可以开始聊天
                writeMessage2Client("1");
                //登录成功的时候,就需要把客户端的连接对象Socket保存起来
                Server.list.add(socket);
                //写一个while(){}表示正在聊天
                //接收客户端发送过来的消息,并打印在控制台
                talk2All(br, usernameInput);
            } else {
                //密码输入有误
                writeMessage2Client("2");
            }
        } else {
            //如果用户名不存在,直接回写
            writeMessage2Client("3");
        }
    }

    private void talk2All(BufferedReader br, String username) throws IOException {
        while (true) {
            String message = br.readLine();
            System.out.println(username + "发送过来消息:" + message);

            //群发
            for (Socket s : Server.list) {
                //s依次表示每一个客户端的连接对象
                writeMessage2Client(s, username + "发送过来消息:" + message);
            }
        }
    }

    public void writeMessage2Client(String message) throws IOException {
        //获取输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }

    public void writeMessage2Client(Socket s, String message) throws IOException {
        //获取输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }
    public void pezhi( Properties prop) throws IOException {
        //获取输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\java\\Project\\base2-code\\sockethomework\\servicedir\\userinfo.txt")));
        Set<Object> set = prop.keySet();
        for(Object key: set ){
            String value = (String) prop.get(key);
            bw.write(key + "=" + value);
            bw.newLine();
            bw.flush();
        }


    }

}
5.配置文件:userinfo.txt
lisi=1234
zhaoliu=a123456
zhangsan=123
wangwu=12345
zhaoyun=a12345

 

 

 

基于Java的多人聊天室系统实现源码与解析 在实际运行中,聊天室内传输的消息种类多样,需明确分类以便差异化处理。消息类型示例来源处理逻辑文本消息普通用户广播给所有在线用户系统通知服务器自动生成并广播控制指令/quit/list用户输入触发内部动作,不广播私聊消息用户A → 用户B查找目标用户并单独发送每种消息类型可通过一个枚举类表示:CHAT, // 普通聊天PRIVATE, // 私聊SYSTEM, // 系统通知。 阅读详情

相关推荐

基于TCP/IP的网络聊天室系统

聊天室界面包含公共聊天信息和私人聊天信息,用户可以用鼠标双击聊天列表中某个聊天者的昵称,就可以和该聊天者进行私人聊天。 . 当新的用户进入聊天室时,所有的用户都可以在聊天列表中看到该用户的昵称;当某用户关闭浏览器或退出聊天室时,聊天列表将该用户的昵称删除,聊天室显示该用户离开的消息。可以改变qq头像

【项目】基于TCP的聊天系统

本片文章将给你一个思路,加上一点启发,助力你实现自己的基于TCP的聊天系统。实现本项目后,你将对于多线程,生产者消费者模型,安全队列,数据库的操作更上一步。

weixin_45897952的博客 2619

二阶系统的带宽(频域分析)

下面以典型I型系统为例,计算系统的开环截止频率和闭环截止频率。设I型系统为: 1:系统的开环截止频率为 2:系统的闭环截止频率 其实我们在工程整定时,把ζ = 0.707,也把系统的带宽近视看成自然震荡角频率即 (wb≈wc≈wnw_{b}\approx w_{c}\approx w_{n}wb​≈wc​≈wn​)对于二阶系统。 ...

wanrenqi的博客 2万+

基于TCP网络编程实现用户注册登录功能(技术点:集合、IO流、多线程、网络编程)

【代码】基于TCP网络编程实现用户注册登录功能(技术点:集合、IO流、多线程、网络编程)

m0_53579703的博客 514

电驱系统功率级“多合一”解决方案

如何提升电驱动系统的产品性能、减小能耗和进一步轻量化,以加强整车市场竞争力,是摆在国内外新能源车企面前的共同课题。为此,具有多年动力总成电子系统开发经验的美国著名半导体及电子解决方案专家——德州仪器(Texas Instrument)提出了多种功率级别“多合一”整合方案和设计思路,助力新能源车企提升技术优势。

yessunday的专栏 1370

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

基于TCP/IP协议的网络多人聊天室

TCP协议是一种一对一连接协议,它在客户端和服务端之间建立可靠的通信连接,确保数据的可靠性和有序性。多线程编程是一种并发编程的方式,允许在一个程序中同时执行多个线程,每个线程都可以执行客户端要求的任务,并且多个线程可以共享一个进程的资源,可以提高系统资源利用率并节约内存空间。服务端作为该网络聊天室的核心组件,负责接受来自客户端的连接请求,维护客户端的连接状态,并处理消息的转发。客户端是用户使用的界面,允许用户输入消息并发送给服务器,同时接收其他用户发送的消息。

weixin_53768339的博客 2792

​​瑞芯微RK系列 vs 全志系列芯片:终极选型指南(2025版)​

​。

jinxi996611的博客 1万+

Java-网络编程-基于Tcp协议的网络聊天室

利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。

ZEALERHE的博客 761

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6751

ETAS工具导入Com Arxml修改步骤

通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml文件,实现通讯协议栈的生成。通过Arxml导入相比于DBC来说,少了从DBC转为arxml的过程。而且arxml中能提供的信息也会更多。如果是DBC的话,很多信息(如PNC的映射,CANTP的配置等)都需要额外配置。不过还有连DBC都无法提供的,那就更麻烦了~

赞的博客 1541

利用TCP协议,创建一个多人聊天室

要使右边的服务器知道客户端进行的是登录操作还是注册操作,从而让服务器进行不同的操作,我们可以从客户端发送一条信息,告诉服务器,是登录操作还是注册操作。根据客户端发来的用户名和密码,与文件中的数据进行判断是否一致,判断完之后再回写给客户端因为回写的代码是通用的,内容不一样,所以可以把它抽成一个方法。然后服务器的talk2All除了打印客户端发来的数据,还要进行群发的操作,遍历集合,给每一个socket对象发送数据。利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。

zhou_yi_ping的博客 1614

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 908

JAVA 第33天网络编程课后大作业

⑥如果成功登录,就可以开始聊天,此时的聊天是群聊,一个人发消息给服务端,服务端接收到之后需要群发给所有人。==============欢迎来到黑马聊天室================要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。如果是登录操作,就输入用户名和密码,以下面的格式发送给服务端。如果是注册操作,就输入用户名和密码,以下面的格式发送给服务端。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。

weixin_65264165的博客 855

飞腾平台(FT2000/4 D2000/8)配置GPIO引脚

飞腾平台配置CPU的引脚为GPIO工作模式的方式有永久型和暂时型: - 永久型是通过UEFI中的MmioWrite32函数来实现的,该方法可以在UEFI阶段就对复用引脚的工作模式配置为GPIO,并且在进入操作系统后仍然不会发生便会; - 临时型是通过rw工具,在系统下手动修改复用引脚的工作模式,该方法在系统重启后会失效,所以是暂时型的。

qq_30135687的博客 5612

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

day34-阶段项目实战(聊天室)

⑥如果成功登录,就可以开始聊天,此时的聊天是群聊,一个人发消息给服务端,服务端接收到之后需要群发给所有人。要求2:密码长度3~8位。​ 利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。如果是注册操作,就输入用户名和密码,以下面的格式发送给服务端。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。​ 循环,判断,集合,IO,多线程,网络编程等。

qq_63763836的博客 805

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

39-Java实现控制台版聊天室

​ 利用TCP协议,做一个带有登录,注册的无界面,控制台版的多人聊天室。

yelitoudu的博客 1154

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA实现的简单聊天室

⑥如果成功登录,就可以开始聊天,此时的聊天是群聊,一个人发消息给服务端,服务端接收到之后需要群发给所有人。==============欢迎来到黑马聊天室================要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。如果是登录操作,就输入用户名和密码,以下面的格式发送给服务端。如果是注册操作,就输入用户名和密码,以下面的格式发送给服务端。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。

weixin_65752158的博客 869

嵌入式linux项目介绍与分享-基于 Linux 下 Socket 网络编程的局域网聊天室

本项目是基于 Linux 下 Socket 网络编程的局域网聊天室,实现了账号注册与登录、私聊消息、群发消息、发送离线消息、查看聊天记录、修改昵称密码等功能,并设置管 理员,实现将用户禁言、解禁、踢出聊天室等,采用多线程并发服务器模型处理多个客户端的同时连接和请求,服务器创建并管理用户数据、在线用户数据、聊天数据、离线消息数据等 SQlite 数据库,并提供后台服务,客户端通过 TCP 协议建立与服务器的稳定连接,并通过格式化输入输出实现与用户的交互。

szq0909的博客 3612

基于TCP协议实现控制台版多人聊天室

实际体验时,发现其内置的Java环境可以直接运行这个聊天室项目,部署时自动分配的公网地址让测试更方便。特别适合用来验证网络编程项目的实际效果,免去了本地端口映射的麻烦。登录验证采用三次状态码(成功/密码错误/用户不存在)服务端维护在线用户集合实现消息广播。集合类实现用户会话管理。

MoonstoneTiger89的博客 435

记录:基于TCP协议的控制台版网络聊天室

注册用户登录用户发送信息接收信息。

Yilena的博客 939

day34-网络编程课后大作业完整需求

⑥如果成功登录,就可以开始聊天,此时的聊天是群聊,一个人发消息给服务端,服务端接收到之后需要群发给所有人。要求2:密码长度3~8位。​ 利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。如果是注册操作,就输入用户名和密码,以下面的格式发送给服务端。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。⑤ 注册,校验用户名是否唯一,校验用户名和密码的格式是否正确。​ 循环,判断,集合,IO,多线程,网络编程等。

fkx20040610的博客 479

Java网络编程,多线程,IO流综合项目一一ChatBoxes

项目目标:实现一个C/S架构,基于TCP协议的控制台版的聊天室,带有注册,登录功能,能实现在局域网内,多个客户端,在一个聊天室中聊天项目需求​客户端:拥有登录,注册,聊天功能,用户名要唯一,密码第一位必须是字母,后面是纯数字,登录成功后可以直接开始聊天​服务端:对用户,登录和注册的信息进行验证,当登录成功之后,能接收客户端发来的消息,并能向所有已经登录的用户进行转发。

blue的博客 856

w250ssm基于TCP协议的在线聊天室设计与实现

本文介绍了一个基于SSM框架的在线聊天室系统设计与实现。该系统采用Java语言开发,结合Spring、SpringMVC和MyBatis框架,使用MySQL数据库存储数据。系统实现了用户注册登录、多人实时聊天、图片和表情包发送等功能,通过TCP协议确保通信的可靠性和稳定性。文章详细阐述了系统架构设计、数据库设计、客户端与服务器端实现等关键技术,并通过测试验证了系统的功能性和稳定性。该聊天室系统具有良好的用户体验和实用价值,为实时通讯应用提供了一个可行的解决方案。

卓怡学长的博客 311

6.2 Java 网络编程 聊天室

​ 利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。​ 循环,判断,集合,IO,多线程,网络编程等在当前模块下新建txt文件,文件中保存正确的用户名和密码④按下回车,提交给服务器验证服务器会结合txt文件中的用户名和密码进行判断⑤客户端接收服务端回写的数据,根据三种情况进行不同的处理方案⑥如果成功登录,就可以开始聊天,此时的聊天是群聊,一个人发消息给服务端,服务端接收到之后需要群发给所有人提示:​ 此时不能用广播地址,因为广播是UDP独有的。

ghfdgbg的博客 398

Linux下c语言TCP多线程聊天室

开发环境:Linux,GCC 相关知识:TCP(博客:传送门),线程 附加:项目可能还有写不足之处,有些bug没调出来(如:对在线人数的控制),希望大佬赐教。 相关图片: 运行服务端 运行2个客户端 其中一个客户端发送消息 互相发送 那么话不多说,放码过来: 码云:传送门,GitHub:传送门 服务端:server.c #include <stdio....

Love丶伊卡洛斯 1332
上一篇: 此文章记录了TCP通信程序的案例——将图片上传服务器,然后从服务器下载到本地
下一篇: 今天认识到了什么叫 万物皆对象——反射
new2MySQL
博客等级 码龄5年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值