毕业设计-c++基于socket的网络聊天室
c#实现网络聊天室(socket)仿QQ课程设计【范本模板】

Visual C#程序设计课程设计(报告)题目:网络聊天室专业班级:地信131学生姓名:胡宏勇学号:1220130912完成时间:_________ 2015.7。
12______________________任务书项目四网络聊天室4。
1、目的与要求1. 目的:1)要求学生达到熟练掌握.NET基本结构以及C#语言的基本知识和技能;2)基本掌握面向对象程序开发的基本思路和方法;3)掌握网络程序开发的基本知识;4)能够利用所学的基本知识和技能,进行简单的网络通信程序设计。
2。
要求基本要求:1)要求利用C#的编程思想以及套接字开发原理来完成系统的设计;2)突出C#语言与其它语言不同点(即体现C#的高级功能,如属性概念、接口、事件、委托等);3)体现可视化编程基本东西,如系统带有菜单、工具栏、状态栏以及一些常用的高级控件。
创新要求:在基本要求达到后,可进行创新设计,如加入文件传输功能,以及远程控制功能。
4.2、信息描述有关该系统基本信息的描述,如:客户端实例的信息等。
类似于QQ。
4.3、功能描述1。
聊天室服务器端的创建。
2。
聊天室客户端的创建.3。
实现客户与服务器的连接通讯。
4. 实现客户之间的私聊。
5。
实现客户端的在线信息显示.6。
实现服务器端当前在线客户信息.7. 保存谈话记录。
4.4、解决方案1. 首先进行需求分析,搞清楚系统功能和任务.2. 然后总体设计中确定模块结构,划分功能模块,将软件功能需求分配给所划分的最小单元模块。
确定模块间的联系,确定数据结构、文件结构、数据库模式,确定测试方法与策略.3。
详细设计中为每个模块确定采用的算法,选择适当的工具表达算法的过程(流程图),描述模块的详细过程;确定每一模块使用的数据结构;确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的接口。
4. 依据分析编写C#代码。
目录1.需求分析—— - - - —— - - — - — - —— - - - — - 11。
C#基于Socket实现简单聊天室功能

C#基于Socket实现简单聊天室功能因为这段时间在学习Socket,所以就试着写了⼀个简单的聊天室。
主要分为服务器端和多个客户端。
利⽤服务器端作数据中转站,实现消息群发。
1、服务器端有两个类:using System.Collections.Generic;using ;using .Sockets;namespace 聊天室_Socket_TCP_服务器端{class Program{static List<Client> clients = new List<Client>();static List<Client> notClients = new List<Client>();/// <summary>/// ⼴播消息/// </summary>/// <param name="message"></param>public static void CastMessageTOAllConnetedClients(string message){foreach (var client in clients){if (client.Conneted){client.CastMessage(message);}else{notClients.Add(client);}}foreach (var temp in notClients){clients.Remove(temp);}}static void Main(string[] args){Socket tcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);tcpSever.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.2"), 8899));tcpSever.Listen(100);//监听是否有客户端发起连接Console.WriteLine("Begin to listen...");while (true){Socket clientSocket = tcpSever.Accept();if (clientSocket!=null){Console.WriteLine("A client has connneted...");Client client = new Client(clientSocket);//将每个新创建的连接通信放于client类做通信clients.Add(client);}}Console.ReadKey();}}}using System;using .Sockets;using System.Text;using System.Threading;namespace 聊天室_Socket_TCP_服务器端{/// <summary>/// 利⽤该类和客户端做通信/// </summary>class Client{public Socket clientSocket;private Thread mesManageTherad;private byte[] bufffer=new byte[20];public Client(Socket soc){clientSocket = soc;//由于消息是不断发送的,需要多次进⾏处理。
C#基于socket的聊天工具与其源码

C#基于socket的聊天工具与其源码本例为家猫本人原作,做此工具时刚从学校毕业,那会比较爱学习,所以此工具代码有点点乱,此工具本是基于局域网的聊天工具,无需建立服务端,直接通过协议同步网内用户后来扩展了外网功能,后面会讲到主要是用于公司内部交流用,集成了涂鸦,表情,截图等简单功能当启动nettalk工具后,可以在菜单个人设置中简单地设置下名称和分组下面是涂鸦效果图:功能都比较简单,,可以用来学习,,用到的知识点还是很广的局域网聊天很简单,服务端都不用启用,直接每个人启动客户端即可下面来说说怎么部署到外网:首先得有一台外网能访问的机器,一般家庭网络的做法是通过路由器映射一个端口到您当做服务器的IP上,我默认用的端口是:60000你可以改为你需要的端口,如果改端口得到server端的app.config中的配置改为你的端口,port为服务端采用的端口server就是您的外网IP,我这里用的是花生壳域名,因为我没有静态IP1<?xml version="1.0" encoding="utf-8" ?>2<configuration>3<configSections>4</configSections>5<connectionStrings>6</connectionStrings>7<appSettings>8<!-- 是否自动启动并开启服务器-->9<add key="AUTOSTART" value="false"/>10<!--是否对本地用户监听-->11<add key="LISTENLOCAL" value="false"/>12<!--是否为二级服务器-->13<add key="LEVELSERVER" value="false"/>14<!--如果为二级服务器此地址才会有效,为主服务器的地址-->15<add key="SERVER" value=""/>16<!--如果为主服务器,此项为主服务器的监听端口,,如果为二级服务器,此端口为远程主服务器的端口,与SERVER项一起使用-->17<add key="PORT" value="60000"/>18</appSettings>19</configuration>配置好服务端后启动程序:点控制菜单中的启动服务即可成功启动后,,其它客户端就可以登录此服务端了外网需要注册用户,,在服务端工具菜单有注册用户。
基于socket简易聊天程序毕业设计(论文)

简单的socket程序虽然很简单,但还是调试了很长时间。
本科时候接触过socket——那个帅帅的刘老师的课,现在重新再捡起来。
程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。
代码贴上来,如果还能保留VA View那样的颜色区别就好看了,但是试了好几遍都不行server:#include <WINSOCK2.H>#include <stdio.h>#define PORT 6000 //服务器端口#define MSGSIZE 1024 //收发缓冲区的大小#pragma comment(lib, "ws2_32.lib") //链接静态库DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据SOCKET sClient; //连接所用套节字SOCKET sListen; //监听套接字SOCKADDR_IN client; //保存客户的地址信息int iaddrSize = sizeof(SOCKADDR_IN);int main(){WSADATA wsaData;SOCKADDR_IN local;char s_Message[MSGSIZE]; //收发缓冲区WSAStartup(0x0202, &wsaData); //Initialize Windows socket librarysListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。
TCP协议local.sin_family = AF_INET; //AF_INET指明使用TCP/IP协议族local.sin_port = htons(PORT);//指明连接服务器的端口号local.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机地址bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字listen(sListen, 1);//开始监听sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//建立连接printf("Accepte client:%s:%d\n", inet_ntoa(client.sin_addr),ntohs(client.sin_port));HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);//创建接收线程CloseHandle(hThread);while (TRUE){printf("Server Send:");//从键盘输入gets(s_Message);//发送数据send(sClient, s_Message, strlen(s_Message), 0);}return 0;}DWORD WINAPI FunThread(LPVOID){char c_Message[MSGSIZE]; //收发缓冲区int ret; //接收字节的个数while (TRUE){ret = recv(sClient, c_Message, MSGSIZE, 0);//接收数据if(ret==SOCKET_ERROR){printf("\nclient is closed!");sClient = accept(sListen, (struct sockaddr *)&client,&iaddrSize);//重新开始监听printf("\nAccepte new client:%s:%d",inet_ntoa(client.sin_addr), ntohs(client.sin_port));memset(c_Message,0,1024);//将原来的client message归零continue;}c_Message[ret] = '\0';printf("\nReceived: %s\n", c_Message);}return 0;}client:#include <WINSOCK2.H>#include <stdio.h>#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址#define PORT 6000#define MSGSIZE 1024#pragma comment(lib, "ws2_32.lib")DWORD WINAPI FunThread(LPVOID);SOCKET sClient;SOCKADDR_IN server;int main(){WSADATA wsaData;char c_Message[MSGSIZE];WSAStartup(0x0202, &wsaData);sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);memset(&server, 0,sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0server.sin_family =PF_INET; //声明地址格式是TCP/IP地址格式server.sin_port =htons(PORT); //指明连接服务器的端口号server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //连到刚才指明的服务器上HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);CloseHandle(hThread);while (TRUE){printf("Client Send:");gets(c_Message);send(sClient, c_Message, strlen(c_Message), 0);if(!strcmp(c_Message,"exit"))//client自身退出exit(1);}// 释放连接和进行结束工作closesocket(sClient);WSACleanup();return 0;}DWORD WINAPI FunThread(LPVOID){char s_Message[MSGSIZE];int ret;while (TRUE){ret = recv(sClient, s_Message, MSGSIZE, 0);if(ret==SOCKET_ERROR){printf("\nServer is closed!\n");exit(1);}s_Message[ret] = '\0';printf("\nReceived: %s\n", s_Message);if(!strcmp(s_Message,"exit"))//server让client退出exit(1);}return 0;}程序在VC++ 6.0环境下编译通过。
C++基于socketUDP网络编程实现简单聊天室功能

C++基于socketUDP⽹络编程实现简单聊天室功能本⽂实例为⼤家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供⼤家参考,具体内容如下0.通信步骤流程图(左:服务器;右:客户端;)1.服务器代码1.1服务器类头⽂件(CServer_UDP.h)#pragma once#include <winsock2.h>class CServer_UDP{public:CServer_UDP();void SendMsg(const char sendBuf[]);void RecMsg();~CServer_UDP();private:SOCKET m_sServer;struct sockaddr_in m_SocAddrClient; //建⽴连接时,⽤于保存客户端信息bool m_terminal;};1.2服务器类源⽂件(CServer_UDP.cpp)#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CServer_UDP.h"#include <iostream>#pragma comment(lib, "ws2_32.lib")CServer_UDP::CServer_UDP():m_terminal(false){//必须进⾏如下初始化,否则socket()会返回10093错误//初始化WSAWORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0) //通过⼀个进程初始化ws2_32.dll{std::cout << "Initialize WSA failed" << std::endl;return;}//初始化UDDP套接字m_sServer = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in m_SocAddrserver;m_SocAddrserver.sin_addr.S_un.S_addr = 0;//htonl(INADDR_ANY);m_SocAddrserver.sin_family = AF_INET;m_SocAddrserver.sin_port = htons(8090);int ret = bind(m_sServer, (sockaddr*)&m_SocAddrserver, sizeof(m_SocAddrserver));if (ret == -1){std::cout << "bind failed!" << std::endl;WSACleanup();}else{//此处必须赋初值,不然会导致服务器端⽆法正常发送int len_Client = sizeof(sockaddr);char recBuf[1025];int len = recvfrom(m_sServer, recBuf, 1024, 0, (sockaddr*)&m_SocAddrClient, &len_Client);if (len > 0){recBuf[len] = '\0';std::cout << "Client say:" << recBuf << std::endl;}}}void CServer_UDP::SendMsg(const char sendBuf[]){int ret = sendto(m_sServer, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_SocAddrClient, sizeof(m_SocAddrClient)); if (ret == -1){std::cout << "send failed" << std::endl;std::cout << GetLastError()<< std::endl;}}void CServer_UDP::RecMsg(){char recBuf[1025];while (!m_terminal){//std::cout << "Begin rec...(server)" << std::endl;int len = recvfrom(m_sServer, recBuf, 1024, 0, 0, 0);if (len > 0){recBuf[len] = '\0';std::cout << "Client say:" << recBuf << std::endl;}}}CServer_UDP::~CServer_UDP(){closesocket(m_sServer);WSACleanup();}1.3服务器主函数#include <iostream>#include <thread>#include <string>#include "CServer_UDP.h"using namespace std;int main(){CServer_UDP server_UDP;thread recProc(&CServer_UDP::RecMsg, &server_UDP);while (1){//cout << "Pleaes input content:" << endl;string content;cin >> content;server_UDP.SendMsg(content.c_str());}recProc.join();cout << "I love china!" << endl;system("pause");return 0;}2.客户端代码2.1客户端类头⽂件(CClient.h)#pragma once#include <winsock2.h>class CClient{public:CClient();void RecMsg();void SendMsg(const char sendBuf[]);~CClient();private:SOCKET m_sockClient;sockaddr_in m_TargetServer;};2.2客户端类源⽂件(CClient.cpp)#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CClient.h"#include <iostream>#pragma comment(lib, "ws2_32.lib")CClient::CClient(){//必须进⾏如下初始化,否则socket()会返回10093错误//初始化WSAWORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0) //通过⼀个进程初始化ws2_32.dll{std::cout << "Initialize WSA failed" << std::endl;return;}m_sockClient = socket(AF_INET, SOCK_DGRAM, 0);m_TargetServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");m_TargetServer.sin_family = AF_INET;m_TargetServer.sin_port = htons(8090);if (m_sockClient == -1){std::cout << "Create socket failed!" << std::endl;WSACleanup();}else{//发送信息与服务器建⽴连接(必须加)sendto(m_sockClient, "hello server", strlen("hello server"), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer)); }}void CClient::SendMsg(const char sendBuf[]){sendto(m_sockClient, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer));}void CClient::RecMsg(){char recBuf[1025];while (1){//std::cout << "Begin rec...(client)" << std::endl;int len = recvfrom(m_sockClient, recBuf, 1024, 0, 0, 0);if (len > 0){recBuf[len] = '\0';std::cout << "Server say: " << recBuf << std::endl;}}}CClient::~CClient(){closesocket(m_sockClient);WSACleanup();}2.3客户端主函数#include <iostream>#include <string>#include <thread>#include "CClient.h"using namespace std;int main(){CClient client_UDP;thread RecProc(&CClient::RecMsg, &client_UDP); while (1){//cout << "Please input content:" << endl;string content;cin >> content;client_UDP.SendMsg(content.c_str());}RecProc.join();cout << "I love china!" << endl;system("pause");return 0;}3.效果图(win7+VS2017)3.1服务端3.2客户端以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C++课程设计:基于Socket通信的聊天室

C++课程设计:基于Socket通信的聊天室课程设计报告课程名称: 高级语言课程设计设计题目: 基于Socket通信的聊天室专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月 10 日1(需求分析1.1聊天室程序的开发背景近年来,互连网发展日新月异,网络使空间的距离不再成为人们沟通的障碍,世界各个角落的人们可以通过Internet收发邮件、实时聊天、获取最新的资讯。
因此本次毕业设计以“面向连接的Winsock网络会话程序开发”为题,制作一个C/S聊天室程序,通过制作该程序还能更好的学习网络socket编程的相关知识。
1.2聊天室的设计目标本课题是建立聊天通信模型,设计一个聊天室软件,只是简单的利用Socket来实现端到端的通信,主要功能为:服务器端功能:1、初始化socket, 进行单对单的点对点连接模式2、输入远程用户的IP地址可以进行socket连接。
3、接受用户传送来的聊天信息,然后显示在列表上。
4、接受用户传送来的连接判断命令,并向用户发出响应命令。
2.总体设计2.1 功能要求, 支持点到点的连接,在服务器和多个客户端之间进行数据传输;, 接收客户端发送的消息,并显示在一个列表框中;, 显示出连接的用户计算机名字;2.2系统主要功能和主要功能描述:聊天程序必须能够做3件事情:(1) 聊天程序要在待定的端口上通过socket发送聊天文字,并发送到开启相同程序的客户端。
(2) 聊天程序要及时接受从其他地方发送过来的信息,然后把这些信息显示在列表框中去。
(3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。
这些要求可以通过CSocket类提供的功能实现。
从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。
服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。
用MFC CSocket类实现的网络聊天室
12、为对话框CTsDlg的“监听”和“停止服务”两个按钮添加消息响应函数。(方法可以在对话框资源编辑窗口双击对应按钮,或使用类向导)
voidCTsDlg::OnBnClickedButtonListen()
{
// TODO: Add your control notification handler code here
}
}
5、从CSocket类派生两个套接字类,一个名为CLSocket,专用于监听客户机端的连接请求;另一个名为CCSocket,用于与客户机建立连接并交换数据。操作步骤为:选择菜单“项目”->“添加类”,在弹出的对话框中选择“MFC类”项,单击“添加”按钮;然后在弹出的“MFC添加类向导”窗口中输入类名,并选择基类为CSocket,如图所示。
if(msg.m_bClose)
{
pSocket->Close();
POSITION pos,temp;
CCSocket *pTemp;
for(pos=m_connList.GetHeadPosition();pos!=NULL;)
{
temp=pos;
pTemp=(CCSocket*)m_connList.GetNext(pos);
Sort
False
6
IDC_STATIC_NUM
Caption
聊天室在线人数:0
3、打开“MFC类向导”,按照下表设置控件在CTsDlg类中的成员变量,效果如图所示;
控件ID
成员变量名称
类别
变量类型
IDC_STATIC_NUM
m_strNum
Value
CString
IDC_EDIT_PORT
基于Socket的网络聊天程序设计报告
学生学号实验课成绩武汉理工大学学生实验报告书实验课程名称高性能计算机网络实验题目基于Socket的网络聊天程序设计指导老师姓名学生姓名学生专业班级2011 —2012 学年第一学期实验课程名称:高性能计算机网络第一部分:实验分析与设计一、实验内容描述(问题域描述)内容:综合运用网络协议、编程语言、API和图形界面实现基于socket建立、监听、连接、发送数据和接收数据的网络通信程序。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)本程序采用基于面向无连接的UDP协议。
需要用到的函数有bind()、 sendto()、 recvfrom()等设计一个基本的网络服务器有以下几个步骤:1、初始化Windows Socket2、创建一个监听的Socket3、设置服务器地址信息,并将监听端口绑定到这个地址上4、开始监听5、接受客户端连接6、和客户端通信7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似三、主要仪器设备及耗材Windows XP 操作平台Microsoft Visual C++ 6.0 开发环境第二部分:实验调试与结果分析一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)上机前编写好代码,用VC 6.0 编译时发现出现链接错误二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)经分析,应该在“工程”-“设置”-“连接”下的“对象/库模块”中添加“ws2_32.lib”在运行时应该先启动服务器端程序,再启动客户端程序。
源代码以及运行结果截图见附页。
三、实验小结、建议及体会通过本次实验,巩固了自己的编程能力,把课堂上学习到的通信协议用到了实践中,对于各种通信协议的理解很有好处。
不足的的对于图形界面编程能力不足,今后应该在这方面多多下功夫。
服务器端代码:#include <stdio.h>#include <WINSOCK2.H>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData );if (err != 0 ){return;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){WSACleanup();return;}SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6666); //设置端口号为6666 bind(sockSrv, (sockaddr*)&addrSrv, sizeof(sockaddr));char sendBuf[100];char recvBuf[100];char tempBuf[200];int len = sizeof(sockaddr);SOCKADDR_IN addrClient;while(1){recvfrom(sockSrv, tempBuf, strlen(tempBuf), 0,(sockaddr*)&addrClient, &len);if('q' != tempBuf[0]){sprintf(recvBuf, "%s say: %s", inet_ntoa (addrClient.sin_addr), tempBuf);printf("%s\n", recvBuf);printf("please input your data: ");gets(sendBuf);sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*) &addrClient, len);}else // 若接收到'q',则退出聊天{printf("%s request to quit the chat platform.\n",inet_ntoa(addrClient.sin_addr));sendto(sockSrv, "q", strlen("q") + 1, 0, (sockaddr*)&addrClient, len);break;}}closesocket(sockSrv);WSACleanup();}客户端代码:#include <stdio.h>#include <WINSOCK2.H>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return;}if(LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1 ){WSACleanup();return;}SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//htonl htons inet_addr inet_ntoaaddrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6666); //设置同样的端口号6666 char sendBuf[100];char tempBuf[200];char recvBuf[100];int len = sizeof(sockaddr);while(1){printf("please input your data: ");gets(sendBuf);sendto(sockClient, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*)&addrSrv, len);recvfrom(sockClient, tempBuf, strlen(tempBuf), 0, (sockaddr*)&addrSrv, &len);if('q' != tempBuf[0]){sprintf(recvBuf, "%s say: %s", inet_ntoa(addrSrv.sin_addr), tempBuf);printf("%s\n", recvBuf);}else // 若接收到'q',则退出聊天{printf("the server has been closed!\n");sendto(sockClient, "q", strlen("q") + 1, 0, (sockaddr*)&addrSrv, len);break;}}closesocket(sockClient);WSACleanup();}运行结果截图:。
基于Socket的聊天室
设计报告课程设计名称基于Socket的聊天室专业班级同组人姓名同组人学号实验日期指导教师成绩年月日一、设计目的和要求1、实验目的网络聊天系统主要对象是局域网内的用户,使用交流更简单。
设计本系统的目标如下:(1)一台电脑上能够同时登陆多个不同的用户。
(2)进入聊天页面后用户在用户列表中可以看到在线用户。
(3)用户登陆成功后如果需要私聊可以在界面中勾选“悄悄话”选择框进行私聊。
(4)若用户需要群聊,可以在好友列表中选择所有人进行群聊。
2、实验要求可以实现用户显示、公共聊天、私人聊天、系统消息提示等功能。
二、设计说明(包括设计分析,系统运行环境,设计中的重点和难点,输入和输出输出条件等)聊天室主要由聊天室服务器和聊天室客户端组成。
聊天室服务器负责管理与客户端的连接并发送消息给客户端;聊天室客户端负责接收或者发送聊天消息,登录聊天室服务器等。
一个简单的服务器/客户机聊天室模型如图:聊天室客户端(商用PC)服务器聊天室客户端(其他)聊天室客户端(笔记本)其他服务器1.首先启动聊天室服务器,使得TcpListener开始监听端口,此时TcpListener会进入Pending状态,等待客户端连接;2.其次,当有客户端连接后,通过AccepSocket返回与客户端连接的Socket 对象,然后通过读写Socket对象完成与聊天室客户端的数据传输。
聊天室客户端成功启动后,首先创建一个Socket对象,然后通过这个Socket对象连接聊天室服务器,连接成功后开通Socket完成数据的接收和发送处理。
聊天室服务器和聊天室客户端消息的传递是这样进行的:2.1聊天协议的应答:聊天命令客户端服务器OK /ERR应答信号在本聊天协议中只定义了两种应答:OK和ERR。
客户端收到OK应答时,表示前面发送的聊天命令执行成功;收到ERR应答时,表示前面发送的聊天命令执行失败;2.1.1聊天状态:聊天状态:CLOSED和CONNECTED状态。
C++基于socket编程实现聊天室功能
C++基于socket编程实现聊天室功能本⽂实例为⼤家分享了C++基于socket编程实现聊天室的具体代码,供⼤家参考,具体内容如下服务端// server.cpp : 此⽂件包含 "main" 函数。
程序执⾏将在此处开始并结束。
//#include "pch.h"#include <iostream>#include "winsock2.h"#include "stdlib.h"#include "stdio.h"#include "string"#pragma comment (lib, "ws2_32.lib")using namespace std;SOCKET clientSocket[1024];int k = 0;void communication(LPVOID n){char buff[256];int r;int i = (int)n;//cout << i << ":" << endl;while (1){memset(buff, 0, 256);r = recv(clientSocket[i - 1], buff, 255, NULL);if (r > 0){cout << i << ":" << buff << endl;for (int j = 0; j < k; j++){send(clientSocket[j], buff, strlen(buff), NULL);}}}}int main(){//加载socket库版本号WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){cout << "请求版本失败!\n" << endl;return -1;}cout << "请求版本成功!\n" << endl;//创建socket//sockSer = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//AF=Address family ,ipv4,TCP,0SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (serverSocket == INVALID_SOCKET){cout << "创建socket失败!\n" << endl;return -1;}cout << "创建socket成功!\n" << endl;//addrSer.sin_addr.S_un.S_addrSOCKADDR_IN addr = { 0 };//初始化地址addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// htonl(INADDR_ANY);//inet_addr("192.168.0.13");//dec--->2进制-->⽹络字节序 addr.sin_family = AF_INET;addr.sin_port = htons(10086);//端⼝号~65535//绑定Socketint r = bind(serverSocket, (SOCKADDR*)&addr, sizeof(addr));if (r == -1){cout << "bind失败!\n" << endl;return -1;}cout << "bind成功!\n" << endl;//listenr = listen(serverSocket, 10);if (r == -1){cout << "listen失败!\n" << endl;return -1;}cout << "listen成功!\n" << endl;//连接//地址族SOCKADDR_IN cAddr = { 0 };int len = sizeof cAddr;//SOCKET clientSocket[1024];int i = 0;while (i < 1024){clientSocket[i++] = accept(serverSocket, (sockaddr*)&cAddr, &len);k++;if (clientSocket[i - 1] == SOCKET_ERROR){cout << "错误的客户端!\n" << endl;closesocket(serverSocket);WSACleanup();return -1;}cout << "有客户端接⼊进来!" << inet_ntoa(cAddr.sin_addr) << endl;CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)communication, (LPVOID)i, NULL, NULL); }//closesocket(clientSocket);//closesocket(serverSocket);//WSACleanup();return 0;}客户端#include "pch.h"#include <iostream>#include "winsock2.h"#include "stdlib.h"#include "stdio.h"#include "string"#pragma comment (lib, "ws2_32.lib")//#include "graphics.h"using namespace std;SOCKET serverSocket;//服务器void recvAndShow(){int r, i = 0;char buff[256];//ofstream out;while (1){memset(buff, 0, 256);r = recv(serverSocket, buff, 255, NULL);if (r > 0){// out.open("QQ.txt", ios::app||ios::_Nocreate);// out << buff << endl;//outtextxy(0, i * 20, buff);i++;//out.close();}}}int main(){//initgraph(300, 300, SHOWCONSOLE);//加载socket库版本号WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){cout << "请求版本失败!\n" << endl;return -1;}cout << "请求版本成功!\n" << endl;//创建socketserverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (serverSocket == INVALID_SOCKET){cout << "创建socket失败!\n" << endl;return -1;}cout << "创建socket成功!\n" << endl;//地址族SOCKADDR_IN addr = { 0 };//初始化地址addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// htonl(INADDR_ANY);//inet_addr("192.168.0.13");//dec--->2进制-->⽹络字节序 addr.sin_family = AF_INET;addr.sin_port = htons(10086);//端⼝号~65535尽量⼤于1W//连接到服务器int r = connect(serverSocket, (SOCKADDR*)&addr, sizeof addr);if (r == -1){cout << "连接服务器失败!\n" << endl;return -1;}cout << "连接服务器成功!\n" << endl;CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvAndShow, NULL, NULL, NULL);char buff[256];while (1){memset(buff, 0, 256);cout << "你要发啥?\n" << endl;cin >> buff;r = send(serverSocket, buff, strlen(buff), NULL);if (r > 0){cout << "发送" << r << "字节到服务器成功!\n" << endl;}}//closesocket(serverSocket);//WSACleanup();return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。