本次实验利用TCP/IP, 语言环境为 C/C++

利用套接字Socket编程,以及线程处理,

实现Server/CLient 之间多人的聊天系统的基本功能。

结果大致如:

下面贴上代码(参考参考...)

Server 部分:

 /* TCPdtd.cpp - main, TCPdaytimed */

 #include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include "conio.h"
#include <windows.h>
#include <process.h>
#include <math.h> #define QLEN 5
#define WSVERS MAKEWORD(2, 0)
#define BUFLEN 2000 // 缓冲区大小
#pragma comment(lib,"ws2_32.lib") //winsock 2.2 library SOCKET msock, ssock; /* master & slave sockets */
SOCKET sockets[] = {NULL}; int cc;
char *pts; /* pointer to time string */
time_t now; /* current time */
char buf[]; /* buffer */
char *input;
HANDLE hThread1,hThread[] = {NULL};
unsigned int threadID,ThreadID[],number; struct sockaddr_in fsin;
struct sockaddr_in Sin; unsigned int __stdcall Chat(PVOID PM)
{
char buf1[];
char buf2[];
char buf3[];
char buf4[];
(void) time(&now);
pts = ctime(&now);
sockets[number] = ssock;
SOCKET sock = ssock;
ThreadID[number] = threadID;
unsigned int threadid = threadID;
sprintf(buf1," 时间: %s \t【我的线程号: %d 】\n",pts,threadid);
(void) send(sock,buf1, sizeof(buf1), );
sprintf(buf2," 线程号 <%d> 客户<IP:%s 端口:%d> enter \n",threadid,inet_ntoa(fsin.sin_addr),fsin.sin_port);
printf("%s ",buf2);
printf("\t将自动把此数据发送给所有客户! \n");
for(int i=;i<=number;i++)
{
if(sockets[i] != NULL && sockets[i] != sock)
{
(void) send(sockets[i],buf2, sizeof(buf2), );
printf(" 发送至线程号<%d>成功!\n",ThreadID[i]);
}
}
printf(" \n"); flag1:cc = recv(sock, buf3, BUFLEN, ); //cc为接收的字符数
if(cc == SOCKET_ERROR|| cc == )
{
(void) time(&now);
pts = ctime(&now);
sprintf( buf3," 线程号 <%d> 客户<IP:%s 端口:%d> leave ! \n \t\t时间: %s",threadid,inet_ntoa(fsin.sin_addr),fsin.sin_port,pts);
sock = NULL;
sockets[number] = NULL;
CloseHandle(hThread[number]);
printf("%s ", buf3);
printf("\t将自动把此数据发送给所有客户! \n");
for(int i=;i<=number;i++)
{
if(sockets[i] != NULL && sockets[i] != sock)
{
(void) send(sockets[i], buf3, sizeof(buf3), );
printf(" 发送至线程号<%d>成功!\n",ThreadID[i]);
}
}
printf(" \n");
} else if(cc > )
{
(void) time(&now);
pts = ctime(&now);
sprintf(buf4," 线程号 <%d> 客户<IP:%s 端口:%d>说 :%s \n \t\t时间 : %s",threadid,inet_ntoa(fsin.sin_addr),fsin.sin_port,buf3,pts); printf("%s ",buf4);
printf("\t将自动把此数据发送给所有客户! \n");
for(int i=;i<=number;i++)
{
if(sockets[i] != NULL && sockets[i] != sock)
{
(void) send(sockets[i],buf4, sizeof(buf4), );
printf(" 发送至线程号<%d>成功!\n",ThreadID[i]);
}
}
printf(" \n"); goto flag1;
}
(void) closesocket(sock); return ;
} /*------------------------------------------------------------------------
* main - Iterative TCP server for DAYTIME service
*------------------------------------------------------------------------
*/
void main(int argc, char *argv[])
/* argc: 命令行参数个数, 例如:C:\> TCPdaytimed 8080
argc=2 argv[0]="TCPdaytimed",argv[1]="8080" */
{
int alen; /* from-address length */
WSADATA wsadata;
char *service = "";
WSAStartup(WSVERS, &wsadata); //加载 winsock 2.2 library
msock = socket(PF_INET, SOCK_STREAM, ); //生成套接字。TCP协议号=6, UDP协议号=17
memset(&Sin, , sizeof(Sin));
Sin.sin_family = AF_INET;
Sin.sin_addr.s_addr = INADDR_ANY; //指定绑定接口的IP地址。INADDR_ANY表示绑定(监听)所有的接口。
Sin.sin_port = htons((u_short)atoi(service)); //atoi--把ascii转化为int,htons - 主机序(host)转化为网络序(network), s(short)
bind(msock, (struct sockaddr *)&Sin, sizeof(Sin)); // 绑定端口号(和IP地址)
listen(msock, ); //队列长度为5 printf("\t\t\t\t Chat 多人聊天程序 \n");
printf("\t\t\t\t (Server) \n");
(void) time(&now);
pts = ctime(&now);
printf("\t\t\t 时间 :%s",pts);
number = -;
while() //检测是否有按键
{
alen = sizeof(struct sockaddr);
ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
number ++;
hThread[number] = (HANDLE)_beginthreadex(NULL, ,Chat,NULL, , &threadID);
}
(void) closesocket(msock);
WSACleanup(); //卸载载 winsock 2.2 library
}

Client 部分:

 /* TCPClient.cpp  -- 用于传递struct */
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <process.h>
#include <math.h> #define BUFLEN 2000 // 缓冲区大小
#define WSVERS MAKEWORD(2, 0) // 指明版本2.0
#pragma comment(lib,"ws2_32.lib") // 指明winsock 2.0 Llibrary /*------------------------------------------------------------------------
* main - TCP client for DAYTIME service
*------------------------------------------------------------------------
*/ SOCKET sock,sockets[] = {NULL}; /* socket descriptor */
// int cc; /* recv character count */
char *packet = NULL; /* buffer for one line of text */
char *pts,*input;
HANDLE hThread;
unsigned threadID; unsigned int __stdcall Chat(PVOID PM )
{
time_t now;
(void) time(&now);
pts = ctime(&now);
char buf[]; while()
{
int cc = recv(sock, buf, BUFLEN, ); //cc为接收的字符数
if(cc == SOCKET_ERROR|| cc == )
{
printf("Error: %d.----",GetLastError());
printf("与服务器断开连接!\n");
CloseHandle(hThread);
(void)closesocket(sock);
break;
}
else if(cc > )
{
// buf[cc] = '\0';
printf("%s\n",buf);
// printf("输入数据(exit退出): \n");
}
}
return ;
} int main(int argc, char *argv[])
{
time_t now;
(void) time(&now);
pts = ctime(&now);
char *host = "127.0.0.1"; /* server IP to connect */
// char *host = "172.18.33.155";
// char *host = "172.18.33.93";
// char *host = "172.18.187.1";
char *service = ""; /* server port to connect */
// char *service = "50000";
struct sockaddr_in sin; /* an Internet endpoint address */
WSADATA wsadata;
WSAStartup(WSVERS, &wsadata); /* 启动某版本Socket的DLL */ memset(&sin, , sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short)atoi(service)); //atoi:把ascii转化为int. htons:主机序(host)转化为网络序(network), s--short
sin.sin_addr.s_addr = inet_addr(host); //如果host为域名,需要先用函数gethostbyname把域名转化为IP地址 sock = socket(PF_INET, SOCK_STREAM,); connect(sock, (struct sockaddr *)&sin, sizeof(sin)); printf("\t\t\t\tChat 多人聊天程序 \n");
printf("\t\t\t\t (Client) \n");
hThread = (HANDLE)_beginthreadex(NULL, ,Chat, NULL, , &threadID);
printf(" \t\t\t\t 【您可以自由发言】\n\n");
while()
{
char buf1[]; // scanf("%s",&buf1); gets_s(buf1);
if(!strcmp(buf1 ,"exit"))
goto end; (void) send(sock,buf1, sizeof(buf1), );
(void) time(&now);
pts = ctime(&now);
printf(" 发送成功! ------时间: %s\n",pts);
} end: CloseHandle(hThread);
closesocket(sock);
WSACleanup(); /* 卸载某版本的DLL */ printf("按回车键继续...");
getchar();
return ; /* exit */
}

【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"的更多相关文章

  1. 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯

    本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...

  2. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  3. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  4. 【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯

    本次实验利用UDP协议, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: ...

  5. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  6. 采用PHP实现”服务器推”技术的聊天室

      传统的B/S结构的应用程序,都是采用”客户端拉”结束来实现客户端和服务器端的数据交换. 本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱动化设计),来实 ...

  7. TCP服务器/客户端代码示例

    TCP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...

  8. 以C#编写的Socket服务器的Android手机聊天室Demo

    内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...

  9. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

随机推荐

  1. aspnetPage分页控件

    项目里面有一个分页,刚好知道了aspnetPage分页控件,现在就把实现步骤和代码贴出来分享一下,如有错误欢迎指正. http://www.webdiyer.com  该控件原网址.里面文档 1.首先 ...

  2. Linux下.Net Core+Nginx环境搭建小白教程

    前言 对于接触.Net Core的我们来说之前从未接触过Linux,出于资源和性能及成本的考虑我们可能要将我们的环境搬到Linux下,这对于我们从未接触过Linux的童鞋们来说很棘手,那么我今天将带你 ...

  3. mysql--多表连接查询

    一.多表连接查询 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 1.交叉连接:不适用任何匹配条件.生成笛卡尔积 sele ...

  4. MySQL大数据量的导入

    最近在公司备份数据库数据,简单的看了一下.当然我用的是简单的手动备份. 第一:其实最好的方法是直接用: mysqldump -u用户名 -p密码 数据库名 < 数据库名.sql 在linux在操 ...

  5. Java - io输入输出流 --转换流

    转换流  转换输出流 OutputStreamWriter: 说明: /* * OutputStreamWriter 这个类的作用 * 就是指定输出流的编码格式 * 这个类的构造方法 需要传递 一个输 ...

  6. springboot集成JsonRpc2.0

    导入依赖的jar: 配置AutoJsonRpcServiceImplExporter: 接口文件: 实现类: 测试:

  7. XorPay 个人支付平台增加 个人支付宝支付接口

      XorPay 今天新增 个人支付宝当面付 接口,欢迎大家使用. 「 XorPay 支付平台」 已经同时支持 个人微信支付接口 和 个人支付宝接口. 个人可用的 支付宝/微信支付 接口,支持 当面付 ...

  8. leetcode-350-Intersection of Two Arrays II(求两个数组的交集)

    题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...

  9. windows下vim中文乱码处理

    现象:gvim安装后,打开中文utf-8编码的文件中文显示乱码 处理:1.启动gvim8.0,菜单 ”编辑“->"启动设定"在文件最开始处添加如下两行set fileenco ...

  10. JS实现表格列宽拖动

    在数据表格中,有时候需要拖动表格宽度,查看完整的数据,是很常用的功能. 1 效果 可以用纯JS就可以实现,如下,是正常情况下的表格: 拖动表格标题中间线,拖动后效果如下: 查看DEMO 2 代码 HT ...