【一】【socket聊天室】-多线程,socket编程

这篇具有很好参考价值的文章主要介绍了【一】【socket聊天室】-多线程,socket编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要实现基于socket编程的聊天室,主要分为下面三个步骤:

(1)多用户聊天:一个服务器多个客户端,客户端信息显示在公共的服务端窗口,利用多线程实现;

         ——客户端双线程:一个接受线程一个发送线程(主线程);

         ——服务器单线程:接收线程;

(2)多用户广播界面:将信息显示到所有用户界面和服务器界面,同时服务器也能发言,利用多线程实现;

         ——客户端双线程:一个接受线程一个发送线程(主线程)

         ——服务器单线程:一个接收线程(主线程)一个发送线程;其中接受线程为每个连接开了单独的线程;

目录

一、基础流程

        服务器端

        客户端

二、多用户聊天

三、多用户广播聊天

客户端

服务端

效果展示

四、参考


一、基础流程

基于socket实现聊天室的流程如下:

【一】【socket聊天室】-多线程,socket编程

对于socket编程,一般流程都为:搭建socket环境,创建套接字,进行连接后,开始通信。

服务器端:

(1)创建套接字:socket()函数;

(2)指定本机地址:bind()函数将本机地址和端口号与套接字连起来

(3)监听:listen()函数;监听连接请求,客户端发送连接请求;

(4)接受连接:accept()函数;

(5)发送接受消息:send()和recv()函数;

客户端:

(1)创建套接字:socket()函数;

(2)发送连接请求:connect()函数

         ——将套接字与主机地址和端口号连接起来:sockaddr_in addr;

         ——发送连接请求,等待服务器accept建立连接;

(3)发送接受消息:send()和recv()函数;

二、多用户聊天

首先,我们实现多个用户基于服务器聊天,所有信息都在服务器聊天框出现。

代码如下所示:

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include "afxres.h"
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#include <map>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

map<SOCKET, string> client; // 存储socket和昵称对应关系

int main()
{

	system("chcp 65001"); // 设置中文
	// 加载winsock环境
	WSAData wd;
	if(WSAStartup(MAKEWORD(2,2), &wd) != 0){
		cout << "加载网络环境失败" << endl;
		return 0;
	}
	else
		cout << "加载网络环境成功" << endl;

	// 创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET){
		cout << "创建套接字失败" << endl;
		WSACleanup();
	}
	else
		cout << "创建套接字成功" << endl;

	// 给套接字绑定ip地址和端口:bind函数
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8000);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int len = sizeof(sockaddr_in);
	if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){
		cout << "服务器绑定端口和ip失败" <<endl;
		WSACleanup();
	}
	else
		cout << "server绑定端口和Ip成功" << endl;

	// 监听端口
	if(listen(s, 5) != 0){
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else
		cout << "设置监听状态成功!" << endl;

	cout<< "服务器监听连接中,请稍等......" << endl;

    // 循环接受:客户端发来的连接
	while(true){
		sockaddr_in addrClient;
		len = sizeof(sockaddr_in);
		SOCKET c = accept(s, (sockaddr*)&addrClient, &len);
		if( c == INVALID_SOCKET ){ // 一个失败我们就撤退,也可以去掉clean和return
			cout << "与客户端连接失败" << endl;
			WSACleanup();
			return 0;
		}
		
        //连接成功,开始发送消息
        char bufrecv[100] = {0}; //用来接受和发送数据
        int ret;
        ret = recv(c, bufrecv, 100, 0);
        client[c] = string(bufrecv);
        cout << "欢迎[" << client[c] << "]加入聊天室" << endl;
        string bufsend;
        bufsend = "欢迎[" + client[c] + "]加入聊天室";
        send(c, bufsend.data(), 100, 0);

        for(auto i : client){
            if(i.first ==  c)
                continue;
            send(i.first, bufsend.data(), 100, 0);
        }
        
        ret = 0;
        do{
            char buf[100] = {0};
            ret = recv(c, buf, 100, 0);
            cout << "[" << client[c] << "]: " << buf << endl;
        }while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error

        cout << "[" << client[c] << "]离开聊天室!" << endl;

	}
	
	// 关闭连接,释放资源
	closesocket(s);
	WSACleanup();
	return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
#include "afxres.h"
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#include <map>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

map<SOCKET, string> client;

int main()
{

	system("chcp 65001");
	// 加载winsock环境
	WSAData wd;
	if(WSAStartup(MAKEWORD(2,2), &wd) != 0){
		cout << "加载网络环境失败" << endl;
		return 0;
	}
	else
		cout << "加载网络环境成功" << endl;

	// 创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET){
		cout << "创建套接字失败" << endl;
		WSACleanup();
	}
	else
		cout << "创建套接字成功" << endl;

	// 给套接字绑定ip地址和端口:bind函数
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8000);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int len = sizeof(sockaddr_in);
	if(connect(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){
		cout << "客户端连接失败" <<endl;
		WSACleanup();
        return 0;
	}
	else
		cout << "客户端连接成功" << endl;

    // 发送和接受数据即可
    string name;
    char bufrecv[100] = {0}; 
    cout << "请输入你的昵称:";
    getline(cin, name); // 读入一整行,可以有空格
    send(s, name.data(), 100, 0);
	int ret;
	ret = recv(s, bufrecv, 100, 0); // 接受欢迎信息
	cout << bufrecv << endl;
    
    // while循环发送数据
	ret = 0;
	do{
        cout << "Enter the word: ";
		char bufrecv[100] = {0};
        cin.getline(bufrecv, 100); 
		ret = send(s, bufrecv, 100, 0);
	}while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error
    
	// 关闭连接,释放资源
	closesocket(s);
	WSACleanup();
	return 0;
}

【一】【socket聊天室】-多线程,socket编程

 实现结果如上图所示,可以发现,成功建立连接,并且可以显示出信息。

但我们发现,当我们开启多个客户端,不能同时显示信息,只有关掉前面的客户端,后面的信息才能接着显示?

【一】【socket聊天室】-多线程,socket编程

 经过分析我们发现,服务端每接受一个连接,就开始陷入该连接的while里面,不断接受该连接的信息,而没有跳出while,以得到其他的连接。

我们采用多线程来解决这个问题

对于每次建立的连接,我们将该连接开启一个线程用来处理服务器与该客户的信息接受,主线程一直处于监听和接受连接状态,从线程处于信息沟通状态。一旦建立一个连接,就给该连接开启一个线程用于发送和接受信息,从而实现同步。

实现的结果如下:

【一】【socket聊天室】-多线程,socket编程

 此时,通过多线程我们成功实现了多用户同时通信。

修改代码如下:

服务端:

#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
#include "afxres.h"
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#include <map>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

map<SOCKET, string> client; // 存储socket和昵称对应关系
DWORD WINAPI Threadfun(LPVOID lpParameter);

int main()
{

	system("chcp 65001"); // 设置中文
	// 加载winsock环境
	WSAData wd;
	if(WSAStartup(MAKEWORD(2,2), &wd) != 0){
		cout << "加载网络环境失败" << endl;
		return 0;
	}
	else
		cout << "加载网络环境成功" << endl;

	// 创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET){
		cout << "创建套接字失败" << endl;
		WSACleanup();
	}
	else
		cout << "创建套接字成功" << endl;

	// 给套接字绑定ip地址和端口:bind函数
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8000);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int len = sizeof(sockaddr_in);
	if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){
		cout << "服务器绑定端口和ip失败" <<endl;
		WSACleanup();
	}
	else
		cout << "server绑定端口和Ip成功" << endl;

	// 监听端口
	if(listen(s, 5) != 0){
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else
		cout << "设置监听状态成功!" << endl;

	cout<< "服务器监听连接中,请稍等......" << endl;

	// 循环接受:客户端发来的连接
	while(true){
		sockaddr_in addrClient;
		len = sizeof(sockaddr_in);
		SOCKET c = accept(s, (sockaddr*)&addrClient, &len);
		if( c == INVALID_SOCKET ){ // 一个失败我们就撤退,也可以去掉clean和return
			cout << "与客户端连接失败" << endl;
			WSACleanup();
			return 0;
		}
		HANDLE hthread = CreateThread(NULL, 0, Threadfun, (LPVOID)c, 0, NULL);
		CloseHandle(hthread); // 关闭句柄,没用
	}
	
	// 关闭连接,释放资源
	closesocket(s);
	WSACleanup();

	return 0;
}

DWORD WINAPI Threadfun(LPVOID lpParameter){
	SOCKET c = (SOCKET)lpParameter;

	//连接成功,开始发送消息
    char bufrecv[100] = {0}; //用来接受和发送数据
    int ret;
    ret = recv(c, bufrecv, 100, 0);
    client[c] = string(bufrecv);
    cout << "欢迎[" << client[c] << "]加入聊天室" << endl;
    string bufsend;
    bufsend = "欢迎[" + client[c] + "]加入聊天室";
    send(c, bufsend.data(), 100, 0);
    
    ret = 0;
    do{
        char buf[100] = {0};
        ret = recv(c, buf, 100, 0);
        cout << "[" << client[c] << "]: " << buf << endl;
    }while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error

    cout << "[" << client[c] << "]离开聊天室!" << endl;
    return 0;
}

客户端代码不变。

三、多用户广播聊天

从上边我们可以发现,服务端只有接受信息功能,客户端只有发送信息功能,这就导致每个人只能通过服务端界面看消息,并且我们也不能实现一些小功能如:

(1)@某用户的消息提醒;

(2)用户退出提醒:某个用户退出,我们应该广播给每个用户界面,告诉该用户退出;

(3)服务器端作为管理员,也应该有说话的功能;

为了解决上面三个问题,我们进行如下探索。

客户端:

对于客户端,其建立连接后,一直处于while(true)的发送信息循环里,直到退出:

【一】【socket聊天室】-多线程,socket编程

 那么我们可以考虑创建两个线程:接受信息线程和发送信息线程,从而使客户端既能接受信息,也能同步发送消息

我们将主线程用来发送数据(因为客户端主任务是发送),创建另一个线程用来接受数据:

【一】【socket聊天室】-多线程,socket编程

 服务端:

服务端主线程是监听和接受连接,每接受一个连接就创建该连接的线程。那么为了能使服务端也作为发言方发送数据,我们创建副线程用来发送数据。同时,对于接受数据的线程,为了显示到别的用户端界面上,我们将收到的信息广播出去,让所有用户都能看见,同时广播实时用户状态,修改代码如下:

【一】【socket聊天室】-多线程,socket编程

 创建的发送线程如下:

【一】【socket聊天室】-多线程,socket编程

 那么至此,我们就修改好了两端的代码,进行尝试。

效果展示如下:

【一】【socket聊天室】-多线程,socket编程

 可以看到,实现了客户端和用户端都是读写双线程,既能接受数据也能发送数据,同时如果用户离开也会广播信息。

修改后的代码如下:

服务端:

#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
#include "afxres.h"
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#include <map>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

map<SOCKET, string> client; // 存储socket和昵称对应关系
DWORD WINAPI Threadfun(LPVOID lpParameter);
DWORD WINAPI ThreadSend(LPVOID lpParameter);

int main()
{

	system("chcp 65001"); // 设置中文
	// 加载winsock环境
	WSAData wd;
	if(WSAStartup(MAKEWORD(2,2), &wd) != 0){
		cout << "加载网络环境失败" << endl;
		return 0;
	}
	else
		cout << "加载网络环境成功" << endl;

	// 创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET){
		cout << "创建套接字失败" << endl;
		WSACleanup();
	}
	else
		cout << "创建套接字成功" << endl;

	// 给套接字绑定ip地址和端口:bind函数
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8000);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int len = sizeof(sockaddr_in);
	if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){
		cout << "服务器绑定端口和ip失败" <<endl;
		WSACleanup();
	}
	else
		cout << "server绑定端口和Ip成功" << endl;

	// 监听端口
	if(listen(s, 5) != 0){
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else
		cout << "设置监听状态成功!" << endl;

	cout<< "服务器监听连接中,请稍等......" << endl;

    // 发送消息线程
    CloseHandle(CreateThread(NULL, 0, ThreadSend, (LPVOID)s, 0, NULL));
    
	// 循环接受:客户端发来的连接
	while(true){
		sockaddr_in addrClient;
		len = sizeof(sockaddr_in);
		SOCKET c = accept(s, (sockaddr*)&addrClient, &len);
		if( c == INVALID_SOCKET ){ // 一个失败我们就撤退,也可以去掉clean和return
			cout << "与客户端连接失败" << endl;
			WSACleanup();
			return 0;
		}

		HANDLE hthread = CreateThread(NULL, 0, Threadfun, (LPVOID)c, 0, NULL);
		CloseHandle(hthread); // 关闭句柄,没用
	}
	
	// 关闭连接,释放资源
	closesocket(s);
	WSACleanup();
	return 0;
}

DWORD WINAPI ThreadSend(LPVOID lpParameter){
	SOCKET c = (SOCKET)lpParameter;

    int ret = 0;
	do{
		char bufsend[100] = {0};
        cin.getline(bufsend, 100); 
        
        // 发送给所有用户端
        string str = "[Server]: " + string(bufsend);
        for(auto i : client)
		    ret = send(i.first, str.data(), 100, 0);
	}while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error

    return 0;
}
DWORD WINAPI Threadfun(LPVOID lpParameter){
	SOCKET c = (SOCKET)lpParameter;

	//连接成功,开始发送消息
    char bufrecv[100] = {0}; //用来接受和发送数据
    int ret;
    ret = recv(c, bufrecv, 100, 0);
    client[c] = string(bufrecv);

    string bufsend;
    bufsend = "欢迎[" + client[c] + "]加入聊天室";
    cout << bufsend << endl;

    for(auto i : client)
        send(i.first, bufsend.data(), 100, 0);
    
    ret = 0;
    do{
        char buf[100] = {0};
        ret = recv(c, buf, 100, 0);
        cout << "[" << client[c] << "]: " << buf << endl << endl;

        // 将接受到的信息广播
        string str1 = "[" + client[c] + "]: " + string(buf);
        for(auto i : client)
            send(i.first, str1.data(), 100, 0);
    }while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error

    string str2 = "[" + client[c] + "]离开聊天室!";
    cout << str2 << endl;
    for(auto i : client)
        send(i.first, str2.data(), 100, 0);
    
    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
#include "afxres.h"
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#include <map>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

map<SOCKET, string> client;
DWORD WINAPI Threadfun(LPVOID lpParameter);

int main()
{
	system("chcp 65001");

	// 加载winsock环境
	WSAData wd;
	if(WSAStartup(MAKEWORD(2,2), &wd) != 0){
		cout << "加载网络环境失败" << endl;
		return 0;
	}
	else
		cout << "加载网络环境成功" << endl;

	// 创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET){
		cout << "创建套接字失败" << endl;
		WSACleanup();
	}
	else
		cout << "创建套接字成功" << endl;

	// 给套接字绑定ip地址和端口:bind函数
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8000);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int len = sizeof(sockaddr_in);
	if(connect(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){
		cout << "客户端连接失败" <<endl;
		WSACleanup();
        return 0;
	}
	else
		cout << "客户端连接成功" << endl;

    // 发送和接受数据即可
    string name;
    char bufrecv[100] = {0}; 
    cout << "请输入你的昵称:";
    getline(cin, name); // 读入一整行,可以有空格
    send(s, name.data(), 100, 0);
	int ret;
    
    // 建立连接后,创建线程用于接受数据,主线程用来发送数据
    CloseHandle(CreateThread(NULL, 0, Threadfun, (LPVOID)s, 0, NULL));
    
    // while循环发送数据
	ret = 0;
	do{
		char bufrecv[100] = {0};
        cin.getline(bufrecv, 100); 
		ret = send(s, bufrecv, 100, 0);
	}while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error
    
	// 关闭连接,释放资源
	closesocket(s);
	WSACleanup();
	return 0;
}

DWORD WINAPI Threadfun(LPVOID lpParameter){
	SOCKET c = (SOCKET)lpParameter;
    int ret = 0;
    do{
        char buf[100] = {0};
        ret = recv(c, buf, 100, 0);
        cout << buf << endl << endl;
    }while(ret!=SOCKET_ERROR && ret!=0); //如果连接被关闭,返回0,否则返回socket_error

    return 0;
}

四、参考

优秀博文:

(465条消息) Socket 多人聊天室的实现 (含前后端源码讲解)(一)_socket的聊天程序代码及理解_宾有为的博客-CSDN博客

各个接口函数的解释:

socket技术详解(看清socket编程) - 枫飞飞 - 博客园 (cnblogs.com)

视频:

​​​​​​C/C++多线程实战教程:多线程客户端聊天室的实现!腾讯QQ的核心技术,老马就靠这个技术一战成名!_哔哩哔哩_bilibili

写代码部分(服务端)_哔哩哔哩_bilibili

C++windows网络编程学习笔记【简易聊天室】(二)_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-474742.html

到了这里,关于【一】【socket聊天室】-多线程,socket编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux-Socket实现模拟群聊(多人聊天室)

    简单版本 服务端源码 客户端源码 服务器可以在特定的端口监听客户端的连接请求,若连接成功,服务器采用广播的形式向当前所有连接客户端发送该客户端登录成功消息多个客户端可以同时登录,在源码文件中可以配置最多群聊同时在线人数。服务端接收到客户端发送的群

    2024年02月10日
    浏览(93)
  • Python web实战 | 使用 Flask 实现 Web Socket 聊天室

        今天我们学习如何使用 Python 实现 Web Socket,并实现一个实时聊天室的功能。本文的技术栈包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。   Web Socket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 中的一部分,并且可以在浏览器和服务器之间创建实时的交互式

    2024年02月14日
    浏览(54)
  • 计算机网络技术与JAVA网络编程手写Socket聊天室-----JAVA入门基础教程-----计算机网络经典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    浏览(61)
  • 【你的第一个socket应用】Vue3+Node实现一个WebSocket即时通讯聊天室

    这篇文章主要是用WebSocket技术实现一个 即时通讯聊天室 ,首先先要了解为什么使用WebSocket而不是普通的HTTP协议,如果使用HTTP协议它是下面这种情况: 我发送一条消息,发送一个发送消息的请求;* 一直轮询接收别人发送的消息,不管有没有发送都要定时去调用接口。这里明

    2023年04月20日
    浏览(63)
  • Linux socket聊天室

    目录 一、运行效果 1、分别编译客户端和服务端代码 2、运行 3、使用效果  二、代码 chat.h 服务端代码  客户端代码 gcc client.c -o C -lpthread gcc server.c -o S -lpthread 先运行服务器端,8888为端口号 ./S 8888  再运行客户端,这里创建两个客户端,端口号要和服务端的一样 ./C 127.0.0.1

    2024年01月22日
    浏览(47)
  • 【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)

    需要源码请点赞关注收藏后评论区留言并且私信~~~ 下面利用Unity和C#语言做一个简单的聊天室程序,主要用到的技术就是Socket通信连接,需要一个客户端和一个服务器端,服务器端就使用C#语言的控制台完成 下面就开始搭建C#语言服务器端 1:新建一个C#语言控制台程序 2:命名

    2024年02月05日
    浏览(68)
  • 【Linux网络编程】基于UDP实现多人聊天室

    UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。 数据报格式套接字 SOCK_DGRAM 采用UDP只管发送数据而不去验证发送数据的正确性,不论传输是否被接收,数据流是否有丢失,都不再重新发

    2024年02月08日
    浏览(57)
  • 【网络编程】UDP简单实现翻译软件与网络聊天室

    在上一章【网络编程】demo版UDP网络服务器实现实现了客户端和服务端之间的数据的发送与接收,上一章我们是直接让服务端把接收到的数据打印出来。 但是服务端并不是只接收到数据就完了,它还要 处理任务 。 所以我们可以在服务端设置一个回调函数: 用来处理接收到的

    2024年02月05日
    浏览(80)
  • Python多人聊天室-基于socket UDP协议

    使用Python编写的基于socket UDP通信的多功能即时聊天室,包含Tkinter编写的图形化聊天界面,功能包括有账号注册和登录,登录成功后可以查看在线用户,并和聊天室内的其他在线用户聊天,包含私聊和群发,能发送文字、表情包,以及文件等。 登录和注册 显示在线用户 群聊

    2024年02月11日
    浏览(58)
  • 【socket.js联合express】:搭建简约版聊天室

    本次项目利用express与socket.js 实现简约版聊天室,有用户登录及提示 用户退出及提示。聊天的显示 聊天室 该页面主要有四大块区域 头部用户输入登录与退出功能 左侧用户聊天显示区域 右侧用户列表显示区域 底部用户输入聊天内容区域 2.1功能描述 当用户在头部的输入框输

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包