文章目录

  • 1. 实现图解
  • 2. 聊天室服务端:TCP_Server_Chat.cpp
  • 3. 聊天室客户端:TCP_Client_Chat.cpp

1. 实现图解

2. 聊天室服务端:TCP_Server_Chat.cpp

#include <winsock2.h> // winsock2的头文件
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;// stdcall的线程处理函数
DWORD WINAPI ThreadFun(LPVOID lpThreadParameter);int main()
{WSADATA wd;if(WSAStartup(MAKEWORD(2,2), &wd) != 0){cout << "WSAStartup Error:" << WSAGetLastError() << endl;return 0;}// 1. 创建流式套接字SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){cout << "socket error:" << WSAGetLastError() << endl;return 0;}// 2. 绑定端口和ipsockaddr_in addr;memset(&addr, 0, sizeof(sockaddr_in));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 << "bind Error:" << WSAGetLastError() << endl;return 0;}// 3. 监听listen(s,5);// 主线程循环接收客户端的连接while(true){sockaddr_in addrClient;len = sizeof(sockaddr_in);// 4.接受成功返回与client通讯的SocketSOCKET c = accept(s, (SOCKADDR*)&addrClient, &len);if(c != INVALID_SOCKET){// 创建线程,并且传入与client通讯的套接字HANDLE hThread = CreateThread(NULL, 0, ThreadFun, (LPVOID)c, 0, NULL);CloseHandle(hThread); // 关闭对线程的引用}}// 6.关闭监听套接字closesocket(s);// 清理winsock2的环境WSACleanup();return 0;
}DWORD WINAPI ThreadFun(LPVOID lpThreadParameter)
{// 5.与客户端通讯,发送或者接受数据SOCKET c= (SOCKET)lpThreadParameter;cout << "欢迎" << c << "进入聊天室!" << endl;// 发送数据char buf[100] = {0};sprintf(buf,"欢迎 %d 进入聊天室!",c);send(c,buf, 100, 0);// 循环接收客户端数据int ret=0;do {char buf2[100] = {0};ret = recv(c, buf2, 100, 0);cout << c << " 说:" << buf2 << endl;} while (ret!=SOCKET_ERROR && ret!=0);cout << c << "离开了聊天室!";return 0;
}

启动聊天室服务端:

3. 聊天室客户端:TCP_Client_Chat.cpp

#include<winsock2.h>//winsock2的头文件
#include<iostream>
using  namespace std;//勿忘,链接dll的lib
#pragma comment(lib, "ws2_32.lib")int  main()
{//加载winsock2的环境WSADATA  wd;if (WSAStartup(MAKEWORD(2, 2), &wd) != 0){cout << "WSAStartup  error:" << GetLastError() << endl;return 0;}//1.创建流式套接字SOCKET  s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (s == INVALID_SOCKET){cout << "socket  error:" << GetLastError() << endl;return 0;}//2.链接服务器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 << "connect  error:" << GetLastError() << endl;return 0;}//3接收服务端的消息char buf[100] = { 0 };recv(s, buf, 100, 0);cout <<  buf << endl;//3随时给服务端发消息int  ret = 0;do{char buf[100] = {0};cout << "请输入聊天内容:";cin >> buf; ret = send(s, buf, 100, 0); } while (ret != SOCKET_ERROR&& ret != 0);//4.关闭监听套接字closesocket(s);//清理winsock2的环境WSACleanup();return 0;
}

启动2个客户端

c++ socket 多线程 网络聊天室相关推荐

  1. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  2. Linux C/TCP多线程网络聊天室

    多线程TCP网络聊天室 我们都知道TCP是一种基于连接的传输协议,使用多线程来实现其实步骤很简单. 首先说明一下项目:服务端开启后,直接运行客户端可以加入聊天室,同时其他客户端可以接收到某某客户端进入 ...

  3. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  4. 基于Socket通信的在线网络聊天室

    文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...

  5. 使用socket实现基于select模型的网络聊天室

    假期闲来无事,便写了个小小的网络聊天室程序.以前一直都是写MFC的有界面的程序,时间长了,便失去了兴趣,感觉有些东西经过MFC的封装,反而失去了意义,让人学不到东西,所以,丢开MFC那层的东西,直接使 ...

  6. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  7. C语言实现网络聊天室 socket的简单应用

    C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...

  8. python socket + tkinter实现网络聊天室

    个人博客文章链接:http://www.huqj.top/article?id=169 最近突然想用socket做个聊天室程序,之前用java写过一个文件传输的程序,这次就用python做一下,顺便也 ...

  9. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

最新文章

  1. matlab拟合曲线后求导,高手留步:MATLAB五阶拟合函数,求导后离散化,输出结果是星号...
  2. C、C++中的转义符
  3. javascript基础 (2)
  4. Scala \和%运算小案例
  5. python与用户交互、数据类型
  6. 如何用python做一个会聊天的女朋友_520来啦~教你用Python给自己造了一个女朋友!...
  7. 【模拟】Codeforces 711A Bus to Udayland
  8. 2013年总结(4)-人脉
  9. Github copilot: AI协助编程尝试
  10. python时间模块小结
  11. element-ui的分页,添加首页、尾页,跳转按钮
  12. apache beam java api_Apache Beam的基本概念
  13. ios系统软件迁移到安卓_苹果一键换机到安卓(苹果安卓一键迁移的软件)
  14. 小米重大变革:成立十个一级部门大量启用80后 向雷军汇报
  15. 关于一个大学生如何利用编程赚钱
  16. 人工智能培训市场前景如何?
  17. python爬虫-世界今日疫情爬虫
  18. [华为机试真题]69.姓名的夫妻相
  19. 爬取链家二手挂单房屋 - 匹配百度地图API坐标 - python出地图【2】(end) echarts调用百度地图画自己喜欢的底图,最终python出地图
  20. 使用layui时报错l.push is not a function

热门文章

  1. 浅谈const int *,int const *与int *const
  2. h5清理微信浏览器网页缓存
  3. model.named_parameters()与model.parameters()
  4. Linux语言和字体的自定义设置
  5. EMD——EEMD——CEEMD
  6. 如何在云服务器粘贴文件,云服务器粘贴文件
  7. android 反编译解析.
  8. Excel插入XactiveX提示出错“不能插入对象”解决
  9. 学号20189220余超 2018-2019-2 《密码与安全新技术专题》第七周作业
  10. 动态规划——什么是动态规划?