简单聊天程序的设计与实现实验报告
聊天软件实验报告
聊天软件实验报告篇一:简单聊天程序的设计与实现实验报告实验2.7 简单聊天程序的设计与实现班级:计科1301 学号:201350080105姓名:张蓉一、实验目的1,掌握Socket 程序设计方法2,掌握基于Socket 的聊天程序设计方法3,进一步熟悉C语言或其他程序设计语言二、实验设备硬件:运行Windows操作系统的计算机软件:C语言或其他程序设计语言开发环境三、实验内容1,使用基于Socket 的程序设计方法设计聊天客户端和服务器客户端程序2,程序应能实现传输文字信息和聊天功能四、基本原理聊天程序是指能提供两人或多人聊天的应用程序,QQ 程序采用的是C/S通信模式,服务器跟客户之间主要有一对多和多对多模式,一对多模式是在服务器和客户端之间用客户端程序登录,验证用户密码,获取在线好友等信息,多对多模式则是在客户端与客户端之间,在线好友直接通信聊天,每个客户端上有实现服务端和客户端两个功能的部分,前者用于接收聊天数据,后者用于发送聊天数据。
用C/S模式进行通信时,作为客户端在请求与服务器连接时需要知道服务器端的IP地址和端口号,腾讯公司的服务器有固定公用网址,客户能很容易的回去服务器的相关信息,在客户端与客户端之间通信时,可以通过登录QQ,让QQ服务器端获得该用户的IP地址和端口号信息,然后通知其他要与该用户进行通信的用户,其他用户就可以连接该用户并与之通信。
五、程序实现本程序采用基于面向无连接的UDP协议。
需要用到的函数有bind()、sendto()、recvfrom()等设计一个基本的网络服务器有以下几个步骤:1、初始化Windows Socket2、创建一个监听的Socket3、设置服务器地址信息,并将监听端口绑定到这个地址上4、开始监听5、接受客户端连接6、和客户端通信7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似程序源代码:(1)服务器端代码:#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); //设置端口号为6666bind(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();}(2)客户端代码:#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();}六、实验结果分析篇二:QQ模拟聊天系统实验报告题目:Q Q模拟聊天系统学院:班级:指导教师:姓名:学号:学年、学期:目录1.引言................................................................................................... . (3)1.1 需求分析................................................................................................... . (3)1.2聊天室程序的开发背景................................................................................................... .. (3)1.3聊天室的设计目标................................................................................................... . (4)2.总体设计................................................................................................... . (4)2.1 功能要求................................................................................................... (4)2.2系统主要功能和主要功能描述:............................................................................................... . (5)3.详细设计................................................................................................... (6)3.1设计流程图................................................................................................... .. (6)3.2客户端的实现.................................. ................................................................ (7)3.3服务端的实现................................................................................................... (14)4.运行结果................................................................................................... . (21)4.1 客户端................................................................................................... . (21)4.2 服务器端................................................................................................... (22)4.3 客户端登陆到服务器端................................................................................................... .. (22)4.4 进行对话................................................................................................... (23)4.5 退出服务器端与客户端................................................................................................... .. (23)5.心得体会................................................................................................... (26)6.参考文献................................................................................................... .. (26)1. 引言计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
聊天程序实验报告
桂林电子科技大学计算机网络C 实验报告实验名称聊天程序的设计电子工程与自动化系测控技术与仪器专业14008104 班第实验小组作者张业标学号1400810427 同作者实验日期2016 年12 月日辅导员意见辅导员成绩签名【实验目的】1、熟悉Visual C++的基本操作;2、基本了解基于对话框的windows应用程序的编写过程;3、对于Windows Socket编程建立初步概念,并实现聊天程序的编写。
【实验要求】1、能编写基于对话框的windows应用程序;2、能用Visual C++中的MFC CSocket类,实现网络传输数据;3、制作实用的局域网一对一聊天程序;【实验原理】一、Windows Socket和套接口的基本概念网际协议(Internet Protocol,IP)是一种用于互联网的网络协议,已广为人知。
它可以广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如小型办公网络,小型宿舍网络)和广域网WAN(例如互联网)。
从它的设计来看,IP是一个无连接的协议,并不能保证数据投递万无一失。
两个上层协议(TCP和UDP)依赖IP协议进行数据通信。
如果希望在Microsoft Windows下通过TCP和UDP协议建立网络应用程序,则需要使用Winsock套接口编程技术。
套接口,就是指向传输提供者的句柄。
Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。
Windows Socket描述并定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket的基础上发展而来的,为Windows TCP/IP提供了一个BSD 型的套接字规范,除与4.3BSD Unix Socket完全兼容外,还包括一个扩充文件,通过一组附加的API实现Windows式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。
聊天程序课程设计实验报告
聊天程序课程设计实验报告聊天程序的课程设计实验是一项相对复杂的课程设计。
本次实验的主要任务是开发一个由客户端和服务器组成的,可以实现客户端间的文本聊天的程序。
实验的具体实现方法是运用socket通信编程,使用C语言和JavaScript编写客户端和服务器端,利用html和css 构建聊天室的网页界面,实现客户端之间的聊天。
本次实验主要分为三部分:网络编程、网页构建和程序测试。
首先,实验者使用C语言编写客户端和服务器端,实现客户端之间的文本通信;接着,使用html和css构建聊天室网页界面,实现客户端的界面编程;最后,对实现的程序进行测试,确保程序实现所需要的功能。
本次实验实现了以上要求,实现了客户端之间的文本聊天和网页界面的构建,且程序在测试过程中没有发现任何问题,程序可以正常运行。
从这次实验中,实验者掌握了聊天程序的课程设计的相关知识,比如socket通信编程、html和css构建网页界面以及测试程序功能的方法,这些都可以在今后的聊天程序开发中发挥重要作用。
关键词:聊天程序;客户端;服务器;socket编程;HTML;CSS 1. 介绍聊天程序课程设计实验是一项通过计算机实现网络通信的一种实验项目,它包括客户端和服务器两部分,客户端主要是实现聊天室的界面,服务器则是负责网络通信的协调过程。
本次实验的主要任务是开发一个可以实现用户间文本聊天的程序,该程序包括客户端和服务器,可以使多个客户端之间进行文本聊天。
2.验准备本次实验的主要要求是实现一个可以实现多个客户端之间的文本聊天程序,因此需要考虑网络编程、网页构建以及程序测试等内容。
为了实现这一要求,首先要掌握socket编程,以及C语言和JavaScript等开发编程语言;其次,需要掌握HTML和CSS等网页构建语言;最后,也要掌握测试程序功能的方法。
3.验过程本次实验主要分为三部分:网络编程、网页构建和程序测试。
首先,实验者使用C语言开发客户端和服务器端,实现客户端之间的文本通信,同时也使用JavaScript语言实现客户端界面编程;接着,使用HTML和CSS构建聊天室网页界面,使聊天室更有趣;最后,对实现的程序进行测试,确保程序实现所需要的功能。
课程设计我的聊天程序
实验报告实验报告名称:简易聊天程序学生姓名:学生学号:实验日期:2013 –12—20实验报告内容一.简介本程序是一个简易的聊天程序,在程序里涉及到了网络通信基本理和Socket编程技术。
由于程序是在IP环境下运行,所以分服务器端和客户端,服务器端和客户端是通过建立Socket链接来实现聊天功能。
套接字(Socket)是一种双向的通信接口,可以通过这个端口与任何一个具有Socket端口的计算机通信,套接字是网络通信的基础。
使用Socket进行网络通信必须包含下面的几种信息:双方认可的协议,本地主机的IP地址,对方主机的IP地址,本地进程的协议端口,对方进程的协议端口。
下面是文本聊天部分所要完成的功能:1.在这个系统中只要在线就可以和所有使用此程序的且已经在线的朋友进行聊天,每个人有可以有一个昵称,当开始进入时,会在每个人的窗口弹出“有一个游客已经进入”。
2.当输入完聊天信息以后进行发送,当发送没有结束时,不能进行新的聊天内容的输入。
一般聊天内容一次不能超过500个字符。
3.工作流程图大致如下:4. 进行聊天需要建立服务器端Socket和客户端Socket,并且要连接上,这样才能进行信息的传送。
二.操作步骤1.创建对话框类chat,在向导的第2步骤中,选中windows Sockets.2.设计对话框“我的聊天程序”,添加相应的控件及其控件变量3.添加并设计服务端端口类和客户端端口类三:通信模块关键代码分析:(1)//服务器端对客户端Socket的处理代码void CChatDlg::ProcessPendingAccept(){CClientSocket* pSocket = new CClientSocket();if (m_pListenSocket.Accept(*pSocket)){CPackMessg msg;msg.m_strText="一个游客进入聊天室了";// m_strShowMessage+="一个游客进入聊天室了\n";SetDlgItemText(IDC_SHOWMESSAGE,"一个游客进入聊天室了\n");POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t->SendMessage(&msg);}pSocket->Init(this);m_connectionList.AddTail(pSocket);}elsedelete pSocket;}(2)//客户端连接到服务器的消息相应函数void CChatDlg::OnConnect(){// TODO: Add your control notification handler code hereif(!m_bInit){BYTE f0,f1,f2,f3;CString name;((CIPAddressCtrl*)(GetDlgItem(IDC_IPADDRESS)))->GetAddress(f0,f1,f2,f3);CString ip;ip.Format("%d.%d.%d.%d",f0,f1,f2,f3);m_bClient=true;m_clientsocket.Create();if(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT))){m_clientsocket.Init(this);SetDlgItemText(IDC_SHOWMESSAGE,"客户端连接成功!");m_bInit=true;}else{m_clientsocket.Close();AfxMessageBox("客户端连接失败!");m_bInit=false;}}}(3)//建立服务器端的消息相应函数void CChatDlg::OnSetserver(){// TODO: Add your control notification handler code hereif(!m_bInit){m_bClient=false;m_bInit=true;if(m_pListenSocket.Init(GetDlgItemInt(IDC_PORT),this)==FALSE){m_bInit=false;return;}}}(4)CServerSocket是服务器端Socket类,关于这部分的核心代码为:BOOL CServerSocket::Init(UINT port, CChatDlg* dlg){ //服务器端初始化m_uPort=port;m_dlg=dlg;if(Create(m_uPort)==FALSE){AfxMessageBox("服务器套接字创建失败!");return FALSE;}if(this->Listen()==FALSE){AfxMessageBox("服务器监听错误!");return FALSE;}m_dlg->SetDlgItemText(IDC_SHOWMESSAGE,"服务器创建成功!");return TRUE;}//有连接接入的时候触发该事件void CServerSocket::OnAccept(int nErrorCode){// TODO: Add your specialized code here and/or call the base classm_dlg->ProcessPendingAccept();CSocket::OnAccept(nErrorCode);}(5)CClientSocket是客户端Socket类,核心代码:1.//通信Socket的初始化,一些关于传输数据可序列化的操作:void CClientSocket::Init(CChatDlg * dlg){m_sfSocketFile= new CSocketFile(this);m_aSessionIn=new CArchive(m_sfSocketFile,CArchive::load);m_aSessionOut=new CArchive(m_sfSocketFile,CArchive::store);m_bClose=false;this->m_dlg=dlg;}2.//Socket 接收到传输过来的数据的消息映射函数:void CClientSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classCSocket::OnReceive(nErrorCode);do{CPackMessg temp;temp.Serialize(*m_aSessionIn);m_dlg->m_sMsgList+=temp.m_strText+"\r\n";m_dlg->SetDlgItemText(IDC_SHOWMESSAGE,m_dlg->m_sMsgList);int linenum=((CEdit *)(m_dlg->GetDlgItem(IDC_SHOWMESSAGE)))->GetLineCount();((CEdit*)(m_dlg->GetDlgItem(IDC_SHOWMESSAGE)))->LineScroll(linenum);//如果是服务端还需要将接收到的数据转发到其他客户端if(!m_dlg->m_bClient){for(POSITIONpos=m_dlg->m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t = (CClientSocket*)m_dlg->m_connectionList.GetNext(pos);if(t->m_hSocket!=this->m_hSocket){t->SendMessage(&temp);}}}}while (!m_aSessionIn->IsBufferEmpty());}3.//发送数据到另一端BOOL CClientSocket::SendMessage(CPackMessg * msg) {if (m_aSessionOut != NULL){msg->Serialize(*m_aSessionOut);m_aSessionOut->Flush();return TRUE;}else{//对方关闭了连接m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();return FALSE;}}4.//关闭Socket,需要将可序列化相关的内存释放void CClientSocket::CloseSocket(){if(m_aSessionIn){delete m_aSessionIn;m_aSessionIn=NULL;}if(m_aSessionOut){delete m_aSessionOut;m_aSessionOut=NULL;}if(m_sfSocketFile){delete m_aSessionOut;m_sfSocketFile=NULL;}Close();m_bInit=false;m_bClose=true;}5.//Socket 接收到对方Socket关闭的消息后的响应函数void CClientSocket::OnClose(int nErrorCode){CSocket::OnClose(nErrorCode);m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();CSocket::OnClose(nErrorCode);}。
简单的局域网聊天程序试验报告
青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:软件工程学生姓名:__班级:__软件102学号: 201007190 题目:_局域网聊天程序________起迄日期:_2012.6.18~2012.6.29设计地点:计算机学院机房指导教师:完成日期: 2012 年6月 29 日课程设计报告内容(供参考)一、需求分析当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。
在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。
聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。
聊天室适用于网上会议或闲聊的一些场合。
聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。
聊天室的设计目标本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:服务器端功能:1、初始化socket, 创建服务器端。
2、维护一个链表,保存所有用户的IP地址、端口信息。
3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。
4、接受用户传送来的连接判断命令,并向用户发出响应命令。
1.二、设计内容SOCKET连接过程根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
程序设计报告之简易聊天软件的设计与实现
程序设计报告之简易聊天软件的设计与实现----bf7c647e-7162-11ec-b191-7cb59b590d7d(2021/2021学年第二学期)标题:简单聊天软件的设计与实现学生姓名班级学号指导教师指导单位:计算机科学与技术系,计算机科学学院,日期:2022年3月28日简易聊天软件的设计与实现二、主题内容和要求1、课题内容:本课程设计主要是设计并实现一个简单的聊天程序,创建基于多线程的聊天室程序。
2.主题要求:需要实现基本的聊天功能。
该聊天室允许两台电脑进行聊天,但需要获取两台电脑之间的IP地址进行聊天,才能实现一对一的聊天。
1、该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。
客户端程序:它可以连接到服务器,向服务器发送消息,并接受服务器发送的消息。
服务器端程序:负责发送用户列表,转发客户端发送的消息。
这个程序涉及服务器和客户端,使用相同的套接字。
2、该聊天软件是采用udp连接,udp是osi参考模型中一种无连接的传输层协议,它提供了简单不可靠的信息传送服务。
由于udp比较简单,udp包含很少的字节,所以它在速度方面有很大优势。
很多常用的即时通软件,如qq程序,都会使用udp实现很多基本功能。
udp是“面向非连接”的网络协议,它与“面向连接”的tcp协议对应。
在发送数据之前,并不与对方建立连接,而是直接把数据报发出去,不保证可靠的传输。
udp相对tcp简单,在速度方面有很大优势,因为它的网络开销少,对传输可靠性要求不是很高的情况下,udp的使用是网络程序的首选。
3.为了实现聊天功能,我们必须获取两台计算机的IP地址。
在IP地址控制栏中输入参与聊天对象的计算机的IP地址。
4、本程序的核心在于将消息的发送的和接收发在了两个不同的线程中,接收放在新创建的副进程中,因为其要一直处于响应状态,也就是需要一个while循环;发送放在主线程中。
这样消息的接收和发送就不存在先后顺序了,且一直处于循环中的接收也不会影响到发送。
java聊天程序实验报告
java聊天程序实验报告Java聊天程序实验报告一、引言随着互联网的快速发展,人们之间的交流方式也在不断改变。
聊天程序作为一种实时通信工具,已经成为人们日常生活中必不可少的一部分。
本实验旨在通过使用Java编程语言,设计并实现一个简单的聊天程序,以探索实时通信的原理和机制。
二、实验目的1. 学习和掌握Java编程语言的基本语法和面向对象的编程思想;2. 了解Socket编程的基本原理和实现方式;3. 设计并实现一个简单的聊天程序,实现用户之间的实时通信。
三、实验过程1. 确定程序的基本功能和界面设计。
聊天程序需要实现用户之间的即时通信,并提供简单的用户界面用于输入和显示聊天内容。
2. 使用Java编程语言,创建一个服务器端程序和多个客户端程序。
服务器端程序负责接收和转发客户端的消息,客户端程序负责发送和接收消息。
3. 使用Socket编程,建立服务器和客户端之间的连接。
服务器端程序监听指定的端口,等待客户端的连接请求;客户端程序通过指定服务器的IP地址和端口号,连接到服务器。
4. 实现消息的发送和接收功能。
客户端程序可以通过输入框输入消息,并通过Socket将消息发送到服务器;服务器端程序接收到消息后,将消息转发给其他客户端。
5. 实现消息的显示功能。
客户端程序通过界面显示接收到的消息,并可以将消息保存到本地。
四、实验结果经过实验,我们成功地实现了一个简单的Java聊天程序。
用户可以通过输入框输入消息,并通过服务器端进行消息的转发。
其他客户端可以接收到转发的消息,并在界面上进行显示。
同时,我们还实现了消息的保存功能,用户可以将接收到的消息保存到本地文件中。
五、实验总结通过本次实验,我们深入了解了Java编程语言的基本语法和面向对象的编程思想。
同时,我们也学习了Socket编程的原理和实现方式。
通过实践,我们掌握了如何使用Java编写一个简单的聊天程序,实现用户之间的实时通信。
然而,本实验只是一个简单的聊天程序,还有很多可以改进和扩展的地方。
聊天程序实训报告总结(3篇)
第1篇一、实训背景随着互联网技术的飞速发展,聊天程序作为一种重要的网络应用,已经深入到人们的日常生活和工作中。
为了提高学生的实践能力,培养适应社会需求的技术人才,我们开展了本次聊天程序实训。
本次实训旨在通过实际编程,让学生掌握聊天程序的设计与实现,提高学生的编程能力和团队协作能力。
二、实训目标1. 理解聊天程序的基本原理和设计思路。
2. 掌握常用的编程语言和开发工具。
3. 能够独立设计和实现简单的聊天程序。
4. 培养良好的编程习惯和团队协作精神。
三、实训内容本次实训主要分为以下几个阶段:1. 需求分析在实训开始前,我们对聊天程序的需求进行了详细的分析。
主要包括以下功能:- 用户注册与登录- 文字消息发送与接收- 图片消息发送与接收- 多人聊天功能- 消息记录查看2. 系统设计根据需求分析,我们设计了以下系统架构:- 客户端:负责用户界面展示、消息发送与接收。
- 服务器端:负责用户管理、消息转发、数据存储等。
3. 技术选型在本次实训中,我们选择了以下技术:- 编程语言:Java- 开发工具:Eclipse- 数据库:MySQL- 消息传递:WebSocket4. 系统实现4.1 客户端实现客户端主要实现以下功能:- 用户注册与登录界面- 消息发送与接收界面- 图片消息发送与接收界面- 多人聊天界面4.2 服务器端实现服务器端主要实现以下功能:- 用户管理:包括用户注册、登录、信息修改等。
- 消息转发:负责将客户端发送的消息转发给对应的接收者。
- 数据存储:将用户信息和聊天记录存储在数据库中。
5. 系统测试在系统实现完成后,我们对聊天程序进行了详细的测试,包括功能测试、性能测试和安全性测试。
测试结果表明,聊天程序能够稳定运行,满足需求。
四、实训成果通过本次实训,我们取得了以下成果:1. 学生掌握了聊天程序的基本原理和设计思路。
2. 学生熟练掌握了Java编程语言和Eclipse开发工具。
3. 学生独立设计和实现了简单的聊天程序。
java聊天程序实验报告
java聊天程序实验报告《Java聊天程序实验报告》摘要:本实验报告旨在介绍和分析我们设计并实现的基于Java的聊天程序。
通过该程序,用户可以在网络上进行实时的文字交流,实现了简单的聊天功能。
我们将介绍程序的设计思路、实现过程、功能特点以及存在的问题和改进方向。
一、设计思路我们的聊天程序采用了客户端-服务器架构,通过Socket通信实现了用户之间的数据传输。
客户端和服务器端分别使用了Java的Socket和ServerSocket类来建立连接和进行通信。
客户端可以向服务器发送消息并接收其他用户的消息,服务器负责转发消息给其他在线用户。
二、实现过程在实现过程中,我们首先设计了程序的基本框架,包括客户端和服务器端的代码结构。
然后,我们使用Socket和ServerSocket类来建立连接和进行数据传输。
客户端和服务器端分别使用了多线程来处理连接请求和消息转发,以保证程序的稳定性和并发性。
三、功能特点我们的聊天程序具有以下功能特点:1. 用户注册和登录:用户可以注册新账号并登录到服务器,实现了用户身份的识别和管理。
2. 实时聊天:用户可以在聊天室中实时发送和接收消息,与其他在线用户进行文字交流。
3. 离线消息:服务器可以保存用户的离线消息,并在用户上线时进行推送,确保用户不会错过重要消息。
四、存在的问题和改进方向在实验过程中,我们发现了一些问题和改进方向:1. 安全性问题:目前我们的程序还没有实现用户身份验证和消息加密等安全机制,存在一定的安全风险。
2. 用户体验:目前用户界面较为简陋,可以进一步优化界面设计和交互体验。
3. 功能扩展:可以考虑增加文件传输、群聊等功能,丰富程序的功能特点。
结论:通过本次实验,我们成功设计并实现了基于Java的聊天程序,实现了简单的聊天功能。
在未来,我们将继续改进程序,提高安全性和用户体验,丰富功能特点,使程序更加完善和实用。
计算机网络--简单聊天程序的设计与实现
实验报告课程计算机网络实验名称简单聊天程序的设计与实现第 1 页一、实验目的1.熟悉VisualC++的基本操作;掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并在此基础上实现更为复杂的网络编程。
2.基本了解基于对话框的windows应用程序的编写过程。
3.对于Windows Socket编程建立初步概念。
二、实验内容1、按实验步骤中参考程序使用VC++设计出程序;2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网络程序。
三、实验原理1.Windows Socket和套接字的基本概念;程序分为服务端和客户端两个,其主要工作过程如图1所示:服务器端:服务器程序首选启动,通过调用socket()函数建立一个套接字,然后调用bind()函数使套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请示队列的长度,之后就调用accept()来接收连接。
客户机端:客户机程序也使用socket()建立套接字,然后调用connect()函数和服务器建立连接。
连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最后,等数据传送结束后,双方调用close()关闭套接字。
四、实验环境和实验工具实验环境:Windows 平台、实验工具:VC++五、实验步骤服务器端程序(1)运行VC++,选择>New,弹出如图2所示的窗口。
(2)创建一个名为CS的工程:选中Projects中的MFC AppWizard[exe],在Project name中输入Server,在Location中选择存储的目录,如本例中为D:\VC temp\.接着点击OK。
(3)在弹出的窗口中选择Dialog based,然后点击“Next”。
出现图3所示的窗口,选择WindowsSockets,并输入服务器,点击“Next”.如果忘了添加Windows Sockets选项,可以在文件头部添加下列语句进行补救:#include "Winsock.h"#include "Ws2tcpip.h"#pragma comment(lib,"Ws2_32.lib" )注:这些语句支持winsock2。
聊天系统程序设计实践报告
程序设计实践设计报告课题名称:网络聊天程序的设计和实现学生姓名:班级:班内序号:学号:日期:1.课题概述1.1课题目标和主要内容课题实现的主要内容:本程序实现一个简单的网络聊天程序,采用客户机/服务器(Client/Server)模式,将客户端和服务端功能在一个程序中实现,运行时在不同的计算机上打开此程序即可进行聊天。
程序实现一对多,多对多聊天功能,满足聊天的基本功能。
课题目标:学会使用MFC搭建基本的对话框及基本控件的使用,了解socket套接字相关知识,实现简单聊天程序。
通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。
使用的开发平台:Microsoft Visual Studio 2010、windows7采用的主要工具:计算机、相关图书资料1.2系统的主要功能功能列表或功能框图,以及功能的简要说明。
服务器端负责指定ip地址及端口号,建立服务器,有监听、接受、发送消息等功能。
客户端通过指定的ip及端口号来连接服务器,有接受和发送消息等功能。
2. 系统设计2.1 系统总体框架包括系统框架图或层次逻辑图,设计思想等首先由服务器在指定的端口开通指定的服务,然后在客户机通过指定服务器地址、端口来连接服务器以获得指定的服务。
服务器端首先由一个服务器启动一个线程监听来自客户器的Socket连接,当服务器的Socket与客户器的Socket经过TCP协议的3次握手建立了连接后,双方就可以通过这个连接来进行信息的发送和接收,并可以进行文件的传输。
在进行程序设计时,对于多个用户连接服务器采用了多线程处理,每个客户端的Socket都启动一个线程来连接服务端的Socket,服务端的Socket接受连接后,通过一个结构体保存已经连接的客户端的地址和套接字,当客户端发送一个信息到服务端,服务器接收信息后,再从结构体中取出已保存的套接字转发所收到的信息。
客户端由客户端的Socket提出连接请求,要连接的目标是服务器端的Socket。
java简单聊天程序实验报告及代码
一、实验内容实验题目:1、使用URL访问用户指定网站,获取该网页的HTML代码显示给用户,并能保存至指定文件中。
2、使用ServerSockt,Socket对象实现两个用户之间的端到端聊天。
要求:采用UI界面设计,界面友好。
二、实验过程(这是实验报告极其重要的内容。
要抓住重点,可以从理论和实践两个方面考虑。
这部分要写明依据什么知识点以及使用方法进行实验以及实验步骤。
不要简单照抄实习指导,更不可写一大堆源代码)题目1、1、分析题目,了解URL类及其方法。
2、设计一个模拟浏览器界面,有一个文本框,文本区域,一个搜索按钮,一个保存按钮。
3、在搜索事件里面写获取HTML的代码,在保存你面写将内容保存至文件中。
题目2、1、分析题目,了解import .*,包下用到的一些类,比如URL, Socket和ServerSocket,以及这些类的方法,根据要实现的功能,进行调用。
了解端到端的通讯,以及怎样建立连接。
2、设计界面:服务器界面,客户端界面。
3、写出对内容的读写代码,注意哪部分功能,在什么时候实现,应该写在哪部分。
以及怎样通信:如图三、实验结果(应先列出测试数据,要写明实验的现象,实验数据的处理等。
对于实验结果的表述,一般有三种方法:文字叙述(根据实验目的将实验结果系统化、条理化,用准确的专业术语客观地描述实验现象和结果,要有时间顺序以及各项指标在时间上的关系),图表(用表格或坐标图的方式使实验结果突出、清晰,便于相互比较,尤其适合于分组较多,且各组观察指标一致的实验,使组间异同一目了然;每一图表应有表目和计量单位,应说明一定的中心问题),屏幕截图(实验结果也可以是屏幕截图,充分表明实验的实际情况)。
在实验报告中,可任选其中一种或几种方法并用,以获得最佳效果。
)题目一、界面与结果截图:题目2、服务器端截屏:客户端截屏:四、讨论与分析(这是实验报告的主要部分。
根据相关的知识点以及编程规范和经验对所得到的实验结果进行解释和分析。
实验报告java聊天程序
实验报告java聊天程序实验报告:Java聊天程序引言:随着互联网的高速发展,聊天已经成为人们生活中不可或缺的一部分。
为了更好地理解和应用Java语言,我们进行了一项关于Java聊天程序的实验。
本实验报告将介绍实验目的、实验环境、实验内容、实验结果以及实验总结等相关内容。
一、实验目的:本实验的主要目的是通过编写Java程序实现一个简单的聊天程序,通过网络连接两个客户端,使客户端之间可以实现文字的交互。
通过实验,我们可以更好地理解网络通信的基本概念和Java语言的网络编程。
二、实验环境:1. 操作系统:Windows 102. 开发工具:Eclipse IDE3. Java版本:Java 84. 网络环境:局域网环境三、实验内容:本实验主要包括三个部分:客户端程序、服务器程序和网络通信。
1. 客户端程序:客户端程序主要负责向服务器发送消息并接收服务器发送的消息。
在客户端程序中,我们使用Java的Socket类进行网络通信,并使用多线程实现客户端的并发访问。
2. 服务器程序:服务器程序主要负责接收客户端发送的消息,并将消息广播给其他连接的客户端。
在服务器程序中,我们使用Java的ServerSocket类进行网络通信,并使用多线程实现服务器的并发处理。
3. 网络通信:通过网络通信,实现客户端和服务器之间的消息传输。
在本实验中,我们使用Java的Socket类和ServerSocket类进行网络通信,并使用TCP/IP协议建立可靠连接。
四、实验步骤:1. 客户端程序编写:首先,我们编写客户端程序。
在客户端程序中,我们创建一个Socket对象,通过该对象与服务器建立连接。
然后,我们使用输入输出流读写数据,并使用多线程实现客户端的并发处理。
2. 服务器程序编写:其次,我们编写服务器程序。
在服务器程序中,我们创建一个ServerSocket对象,通过该对象监听指定端口的连接请求。
当有客户端连接到服务器时,我们创建一个新的线程处理该连接,接收客户端发送的消息并转发给其他连接的客户端。
聊天程序设计实验报告范文
聊天程序设计实验报告范文JAVA语言,聊天室实验报告某某专业名称实验室实验课程实验名称姓名学号同组人员实验日期某某某某大学软件工程2号实验楼201室JAVA高级程序设计聊天程序设计(客户端、服务端)无2022年12月12日JAVA语言,聊天室实验报告一、实验目的掌握基于TCP、UDP协议的聊天服务器端与客户端程序设计,掌握Socket,ServerSocket,DatagramSocket,DatagramPacket类的使用。
二、实验原理TCP和UDP协议的支持。
ServerSocket和Socket的使用。
三、实验内容实验截图JAVA语言,聊天室实验报告代码importjava.awt.Point;importjava.io.BufferedReader; importjava.io.IOE某ception; importjava.io.InputStreamReader; importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.te某t.DateFormat; importjava.util.Date;importjava.util.HahMap;importjava.util.Vector;importjava.util.logging.Level; importjava.util.logging.Logger;/某某某某/publicclae某tendjava某.wing.JFrame{privateServerSocketerver;privateint=0;privatechar[]chatBuf=newchar[2048]; privateStringchatIpAddre="127.0.0.1"; privatefinalintchatPort=5200;privateHahMap<String,Vector<IMeage>>chatRecordMap;//privateHahMap<String,Integer>chatRecordHMap; publicTalkHome(){chatRecordMap=newHahMap<String,Vector<IMeage>>();//chatRecordHMap=newHahMap<String,Integer>();try{erver=newServerSocket(Integer.valueOf(chatPort));}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE, null,e某);}newThread(newRunnable(){publicvoidrun(){while(true){try{Socketocket=erver.accept();JAVA语言,聊天室实验报告BufferedReaderin=newBufferedReader(newInputStreamReader(ocket.getInputStream()));inttmp_len=-1;StringBuilderchatStrBuilder=newStringBuilder();while((tmp_len=in.read(chatBuf))!=-1){chatStrBuilder.append(chatBuf,0,tmp_len);}addMeage(ocket.getInetAddre().getHotAddre(),chatStrBuilder.toString(),fale);in.cloe();ocket.cloe();}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE,nu ll,e某);}}}).tart();}privatevoidreChatWindow(StringipAddre){Sytem.out.println(ipAddre);Vector<IMeage>chatRecord=chatRecordMap.get(ipAddre); jTe某tArea1.etTe某t("");if(chatRecord==null){chatRecord=newVector<IMeage>();chatRecordMap.put(ipAddre,chatRecord);}ele{for(IMeageiMe:chatRecord){if(iMe.imyelf){jTe某tArea1.append("我"+iMe.dateString+"}ele{jTe某tArea1.append("TA"+iMe.dateString+"}}}privatevoidaddMeage(finalStringipAddre,StringmeString,boolea nimyelf){Vector<IMeage>chatRecord=chatRecordMap.get(ipAddre);if(chatRecord==null){JAVA语言,聊天室实验报告chatRecord=newVector<IMeage>();chatRecordMap.put(ipAddre,chatRecord);}finalIMeageiMeage=newIMeage(meString,imyelf);chatRecord.add(iMeage);if(imyelf){newThread(newRunnable(){publicvoidrun(){try{SocketendMeage=newSocket(ipAddre,chatPort);PrintWriterendWindow=newPrintWriter(endMeage.getOutputStream());endWindow.print(iMeage.meString);endWindow.fluh();endWindow.cloe();endMeage.cloe();jTe某tArea1.append("我"+iMeage.dateString+"}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE,nu ll,e某);}}}).tart();}ele{jTe某tArea1.append("TA"+iMeage.dateString+"}}jCheckBo某1=newjava某.wing.JCheckBo某();jScrollPane2=newjava某.wing.JScrollPane();jTe某tArea2=newjava某.wing.JTe某tArea();jButton2=newjava某.wing.JButton();jFormattedTe某tField1=newjava某.wing.JFormattedTe某tField();jFormattedTe某tField2=newjava某.wing.JFormattedTe某tField();jLabel1=newjava某.wing.JLabel();jLabel2=newjava某.wing.JLabel();JAVA语言,聊天室实验报告jPanel3=newjava某.wing.JPanel();jLabel3=newjava某.wing.JLabel();jScrollPane3=newjava某.wing.JScrollPane();jTe某tArea1=newjava某.wing.JTe某tArea();jCheckBo某1.etTe某t("jCheckBo某1");etDefaultCloeOperation(java某.wing.WindowContant.E某IT_ON_CLOSE);etBackground(newjava.awt.Color(255,255,255));etBound(newjava.awt.Rectangle(0,0,520,520));etCuror(newjava.awt.Curor(java.awt.Curor.DEFAULT_CURSOR));etModalE某cluionType(java.awt.Dialog.ModalE某cluionType.APPLICATION_E某CLUDE);jTe某tArea2.etColumn(20);jTe某tArea2.etFont(newjava.awt.Font("微软雅黑",0,14));//NOI18NjTe某tArea2.etLineWrap(true);jTe某tArea2.etRow(5);jScrollPane2.etViewportView(jTe某tArea2);jButton2.etTe某t("发送");jButton2.addActionLitener(newjava.awt.event.ActionLitener(){ publicvoidactionPerformed(java.awt.event.ActionEventevt){jButton 2ActionPerformed(evt);}});jFormattedTe某tField1.etTe某t("127.0.0.1");jFormattedTe某tField1.etToolTipTe某t("");jFormattedTe某tField2.etTe某t("5200");jFormattedTe某tField2.etToolTipTe某t("");jLabel1.etTe某t("IP:");jLabel2.etTe某t(":");jPanel3.etBackground(newjava.awt.Color(255,255,255));JAVA语言,聊天室实验报告}});jLabel3.etTe某t("对方IP:");jLabel3.etToolTipTe某t("");java某.wing.GroupLayoutjPanel3Layout=newjava某.wing.GroupLayout(jPanel3);jPanel3.etLayout(jPanel3Layout);jPanel3Layout.etHorizontalGroup(jPanel3Layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap().addPreferredGap(ponentPlacement.UNRELATED)java某.wing.GroupLayout.PREFERRED_SIZE,131,java某.wing.GroupLayout.PREFERRED_SIZE).addContainerGap(java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)) );jPanel3Layout.etVerticalGroup(jPanel3Layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup() .addGap(22,22,22).addGroup(jPanel3Layout.createParallelGroup(java 某.wing.GroupLayout.Alignment.BASELINE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE).addContainerGap(java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)) );jTe某tArea1.etEditable(fale);jTe某tArea1.etColumn(20);JAVA语言,聊天室实验报告jTe某tArea1.etFont(newjava.awt.Font("微软雅黑",0,14));//NOI18NjTe某tArea1.etLineWrap(true);jTe某tArea1.etRow(5);jScrollPane3.etViewportView(jTe某tArea1);java某.wing.GroupLayoutlayout=newjava某.wing.GroupLayout(getContentPane());getContentPane().etLayout(layout);layout.etHorizontalGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(java某.wing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(java某.wing.GroupLayout.Alignment.TRAILING,layout.createSequentialGr oup().addGap(2,2,2).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,104,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,6,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,43,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED,123,Short.MA某_VALUE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE)JAVA语言,聊天室实验报告.addContainerGap()));layout.etVerticalGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(layout.createSeq uentialGroup().addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING,fale)java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)java某.wing.GroupLayout.DEFAULT_SIZE,358,Short.MA某_VALUE)) .addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.DEFAULT_SIZE,131,Short.MA某_VALUE) .addPreferredGap(ponentPlacement.RELATED).addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.BASELINE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE).addGap(2,2,2)));pack();}//</editor-fold>addMeage(chatIpAddre,jTe某tArea2.getTe某t(),true);jTe某tArea2.etTe某t("");}if(evt.getStateChange()==1){JAVA语言,聊天室实验报告chatIpAddre=evt.getItem().toString();reChatWindow(chatIpAddre);}}privatePoint;/某某某/publictaticvoidmain(Stringarg[]){try{for(java某.wing.UIManager.LookAndFeelInfoinfo:java某.wing.UIManager.getIntalledLookAndFeel()){if("Nimbu".equal(info.getName())){java某.wing.UIManager.etLookAndFeel(info.getClaName());break;}}}catch(ClaNotFoundE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(IntantiationE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(IllegalAcceE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(java某.wing.UnupportedLookAndFeelE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}//</editor-fold>/某Createanddiplaytheform某/java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newTalkHome().etViible(true);}});JAVA语言,聊天室实验报告}//Variabledeclaration-donotmodifyprivatejava某.wing.JButtonjButton2;privatejava某.wing.JCheckBo某jCheckBo某1;privatejava某.wing.JFormattedTe某tFieldjFormattedTe某tField1;privatejava某.wing.JFormattedTe某tFieldjFormattedTe某tField2;privatejava某.wing.JLabeljLabel1;privatejava某.wing.JLabeljLabel2;privatejava某.wing.JLabeljLabel3;privatejava某.wing.JPaneljPanel3;privatejava某.wing.JScrollPanejScrollPane2;privatejava某.wing.JScrollPanejScrollPane3;privatejava某.wing.JTe某tAreajTe某tArea1;privatejava某.wing.JTe某tAreajTe某tArea2;}claIMeage{publicbooleanimyelf;publicStringmeString;publicIMeage(Stringme,booleanimyelf){thi.imyelf=imyelf;thi.meString=me;}四、实验心得其实java已经将TCP和UDP协议高度封装了,熟练使用ServerSocket和Socket,DataGram会写出想要的网络程序,并不是很难。
聊天类程序实验报告
一、实验目的1. 熟悉Python编程语言的基本语法和常用库。
2. 掌握网络编程的基本原理和TCP/IP协议。
3. 学习使用socket编程实现客户端和服务器端的数据交互。
4. 提高团队协作能力和编程实践能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm4. 网络环境:局域网或互联网三、实验内容本次实验设计了一个简单的聊天类程序,包括客户端和服务器端。
客户端用于发送和接收消息,服务器端用于接收客户端发送的消息并广播给所有客户端。
1. 服务器端程序服务器端程序负责监听客户端的连接请求,接收客户端发送的消息,并将消息广播给所有已连接的客户端。
```pythonimport socketimport threading# 定义服务器地址和端口server_address = ('localhost', 12345)# 创建socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址和端口server_socket.bind(server_address)# 设置最大连接数server_socket.listen(5)print("服务器启动,等待客户端连接...")def broadcast_message(message, clients):"""将消息广播给所有已连接的客户端"""for client in clients:try:client.send(message.encode('utf-8'))except:client.close()clients.remove(client)def handle_client(client_socket, clients):"""处理客户端连接"""while True:try:message = client_socket.recv(1024).decode('utf-8') if message:broadcast_message(message, clients)else:breakexcept:break# 存储所有已连接的客户端clients = []try:while True:client_socket, client_address = server_socket.accept()print(f"连接成功,客户端地址:{client_address}")clients.append(client_socket)client_thread = threading.Thread(target=handle_client, args=(client_socket, clients))client_thread.start()except KeyboardInterrupt:print("服务器关闭")finally:server_socket.close()```2. 客户端程序客户端程序负责连接服务器,发送和接收消息。
计算机网络课程设计报告--聊天程序
计算机网络课程设计报告题目:网络聊天程序的设计与实现姓名:申超明学号:0705010313班级:计算机3班指导老师:文宏湖南科技大学计算机科学与工程学院2010年9月一:实验名称网络聊天程序的设计与实现二:实验目的了解Socket通信的原理,并通过程序实现通信的过程。
三:实验要求熟悉Socket程序通信过程,熟悉在通信过程中流之间的转换。
程序中熟悉灵活运用线程执行相关操作。
四:实验原理Socket通信的原理还是比较简单的,它大致分为以下几个步骤。
服务器端的步骤如下:建立服务器端的Socket,开始侦听整个网络中的连接请求。
当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下:建立客户端的Socket,确定要连接的服务器的主机名和端口。
发送连接请求到服务器,并等待服务器的回馈信息。
连接成功后,与服务器进行数据的交互。
数据处理完毕后,关闭自身的Socket连接。
五:程序截图:图1-服务器端启动服务器图2-客户端连接数据库图3-客户端发送消息图4-服务器段接收客户端发送过来的消息六:程序代码:Qserver.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using ;using .Sockets;using System.Threading;namespace WindowsApplication2{public partial class qserver : Form{public qserver(){InitializeComponent();}private string ipv4;private void Form1_Load(object sender, EventArgs e){IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());ipv4 = ip[0].ToString();bel4.Text = ipv4;}TcpListener tcpls;Socket sk;NetworkStream ns;StreamReader sr;StreamWriter sw;Thread tred;private void button1_Click(object sender, EventArgs e){tcpls = new TcpListener(1235);tcpls.Start();MessageBox.Show("服务器已启动");this.button1.Enabled = false;sk = tcpls.AcceptSocket();MessageBox.Show("客户端已连接");ns = new NetworkStream(sk);sr = new StreamReader(ns, Encoding.UTF8);sw = new StreamWriter(ns, Encoding.UTF8);}string smessage = "";private void button2_Click(object sender, EventArgs e){this.textBox1.Focus();tred = new Thread(new ThreadStart(this.acceptcm));tred.Start();this.textBox2.Focus();}private void button3_Click(object sender, EventArgs e){sendtoc();this.textBox2.Focus();}private void textBox2_KeyPress(object sender, KeyPressEventArgs e) {if (e.KeyChar == '\r')sendtoc();}private void acceptcm(){lock (this){try{if (sr.ReadLine() != null){this.textBox1.Text += sr.ReadLine();}elsereturn;}catch (System.Exception ex){}finally{tred.Abort();}}}public void sendtoc(){try{smessage = "\r\n" + this.textBox3.Text + "(" + DateTime.Now.ToLongTimeString() + ")" + " " + this.textBox2.Text;this.textBox1.Text += smessage;this.textBox2.Clear();sw.WriteLine(smessage);sw.Flush();}catch{MessageBox.Show("服务器端错误");}}private void qserver_FormClosed(object sender, FormClosedEventArgs e){if (tcpls != null)tcpls.Stop();//if (tred != null)// tred.Abort();Application.Exit();}}}客户端代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using ;using .Sockets;using System.Threading;namespace Client{public partial class qclient : Form{public qclient(){InitializeComponent();}TcpClient tcpct;NetworkStream ns;StreamReader sr;StreamWriter sw;Thread trdc;/// <summary>/// 连接服务器操作,发送socket请求/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){try{string ip = this.textBox4.Text + "." + this.textBox5.Text + "." + this.textBox6.Text + "." + this.textBox7.Text;tcpct = new TcpClient(ip, 1235);ns = tcpct.GetStream();sr = new StreamReader(ns);sw = new StreamWriter(ns);this.button1.Enabled = false;}catch{MessageBox.Show("请确认是否开启服务器...");}}string cmessage = "";/// <summary>/// 发送消息事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){try{sendtos();}catch{// MessageBox.Show("出错啦!"+"\r\n"+"1.你是否已经连接服务器?"+"\r\n"+"2.等待服务器发回消息.");}finally{this.textBox2.Focus();}}/// <summary>/// 发送函数/// </summary>public void sendtos(){if (this.textBox2.Text == "") //发送{MessageBox.Show("内容不能为空");return;}else{cmessage = "(" + DateTime.Now.ToLongTimeString() + ")" + "\r\n" + this.textBox3.Text + this.textBox2.Text;this.textBox1.Text += cmessage;this.textBox2.Clear();// savechathistrory();sw.WriteLine(cmessage);sw.Flush();}}/// <summary>/// 接收函数/// </summary>public void acceptsm(){lock (this){try //接收{this.textBox1.Text += sr.ReadLine() + "\r\n";// savechathistrory();}catch{// MessageBox.Show("出错啦!" + "\r\n" + "1.你是否已经连接服务器?" + "\r\n" + "2.没有服务器消息.");}finally{trdc.Abort();}}}/// <summary>/// 接收消息事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){this.textBox1.Focus();trdc = new Thread(new ThreadStart(acceptsm));trdc.Start();this.textBox2.Focus();}/// <summary>/// 保存历史记录,未做./// </summary>private void savechathistrory(){StreamWriter fsw = new StreamWriter(erAppDataPath + "chathistory.txt", false, Encoding.UTF8);sw.WriteLine(this.textBox1.Text);fsw.Flush();fsw.Close();}/// <summary>/// 文件关闭之后,关闭客户端,关闭活动的线程/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void qclient_FormClosed(object sender, FormClosedEventArgs e){if (tcpct != null)tcpct.Close();Application.Exit();}/// <summary>/// 历史记录查看,未做。
Java聊天程序实验报告
Java网络通信一、实验内容1、图形界面编程,利用TCP的socket或者UDP编写,客户端和服务器端程序可以进行多次对话。
2、利用程序,访问一个网站,将指定的一个页面保存到本地。
二、实验目的1、学习java网络通信中的Socket编程,熟悉TCP和UDP的应用。
2、学习网络编程的基础内容,了解TCP/IP协议的简单概念,和JAVA结合编程。
3、实现事件的处理,比如说鼠标的单击,按下等操作。
三、实验分析1、UDP中Socket中的编程也分为服务器和客户端,与TCP不同的是它无需建立、拆除连接,直接将信息打包传向指定的目的地,使用起来比TCP要简单一些。
2、第三个程序,我写了一个简单的网页浏览器,功能不是很全面,但是能实现,查看源文件,保存,全屏,还原等功能,还能自动修正输入的网络地址。
就是有时候图片显示还有点问题。
主要用到了JEditorPane中的setPage()解析html文件。
四、程序代码1、UDP服务端import java.io.*;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class UDPServer extends JFrame{JTextField jtf=new JTextField(30);JTextArea jta=new JTextArea();JButton jb=new JButton("发送");JPanel jp=new JPanel();DatagramSocket serversocket=null;DatagramPacket serverpacket=null,serverpacket1=null;InetAddress address;int port;String datagram;public UDPServer(){jp.setLayout(new FlowLayout());jp.add(jtf);jp.add(jb);this.getContentPane().add(jp,BorderLayout.SOUTH );this.getContentPane().add(new JScrollPane(jta),BorderLayout.CENTER);jta.setEditable(false);jb.addActionListener(new buttonListener());setTitle("服务器");setSize(600,400);setVisible(true);this.addWindowListener(new winAdpt());try{serversocket=new DatagramSocket(5555);jta.append("服务器已启动正在监听端口5555..."+"\n");}catch(Exception eg){}while(true){try{byte[] databuf=new byte[512];serverpacket=new DatagramPacket(databuf,512);serversocket.receive(serverpacket);address=serverpacket.getAddress();port=serverpacket.getPort();datagram=new String(serverpacket.getData());jta.append(datagram+"\n");}catch(IOException ex){jta.append(ex.toString()+"\n");}}}public static void main(String[] args) {new UDPServer();}class winAdpt extends WindowAdapter{public void windowClosing(WindowEvent e){try{serversocket.close();serversocket=null;}catch(Exception ea){}e.getWindow().dispose();System.exit(0);}}class buttonListener implements ActionListener{public void actionPerformed(ActionEvent e){try{byte[] databuf=new byte[512];datagram=jtf.getText();databuf=datagram.getBytes();serverpacket1=newDatagramPacket(databuf,databuf.length,address,port);serversocket.send(serverpacket1);}catch(IOException ex){jta.append(e.toString()+"\n");}}}}2、UDP客户端import java.io.*;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class UDPClient extends JFrame{JTextField jtf=new JTextField(30);JTextArea jta=new JTextArea();JButton jb=new JButton("发送");JPanel jp=new JPanel();DatagramSocket socket=null;DatagramPacket packet=null,packet1=null;String datagram=null;InetAddress address=null;public UDPClient(){jp.setLayout(new FlowLayout());jp.add(jtf);jp.add(jb);this.getContentPane().add(jp,BorderLayout.SOUTH );this.getContentPane().add(new JScrollPane(jta),BorderLayout.CENTER);jta.setEditable(false);jb.addActionListener(new buttonListener());setTitle("客户端");setSize(600,400);setVisible(true);this.addWindowListener(new winAdpt());try{socket=new DatagramSocket(6666);address=InetAddress.getByName("127.0.0.1");}catch(IOException eg){}while(true){try{byte[] databuf=new byte[512];packet=new DatagramPacket(databuf,512);socket.receive(packet);datagram=new String(packet.getData());jta.append(datagram+"\n");}catch(Exception e){}}}public static void main(String[] args) {new UDPClient();}class buttonListener implements ActionListener{public void actionPerformed(ActionEvent e){try{datagram=jtf.getText();byte[] databuf=datagram.getBytes();packet1=newDatagramPacket(databuf,databuf.length,address,5555);socket.send(packet1);}catch(IOException ex){jta.append(e.toString()+"\n");}}}class winAdpt extends WindowAdapter{public void windowClosing(WindowEvent e){try{socket.close();socket=null;}catch(Exception ea){}e.getWindow().dispose();System.exit(0);}}}3、浏览器程序MyWebBrowser.java文件import .*;import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.io.*;public class MyWebBrowser implements ActionListener{/////////窗口////////////////////////////////////JFrame mainwindow=new JFrame("我的浏览器"); //主窗口Container contentpane=mainwindow.getContentPane();//内容窗格JWindow fullscreen=new JWindow(mainwindow); //建立全屏窗格Container contentpane1=fullscreen.getContentPane();///////////菜单///////////////////JMenuBar menuBar=new JMenuBar(); //创建菜单条JMenu menu_file=new JMenu("文件"); //创建“文件”菜单项JMenuItem file_saveas=new JMenuItem("另存为"); //“另存为”菜单项子项JMenuItem file_exit=new JMenuItem("退出");JMenu menu_edit=new JMenu("编辑"); //创建“编辑”菜单项JMenuItem edit_cut=new JMenuItem("剪切"); //“剪切”菜单项子项JMenuItem edit_copy=new JMenuItem("复制");JMenuItem edit_paste=new JMenuItem("粘贴");JMenu menu_view=new JMenu("视图"); //创建“视图”菜单项JPopupMenu fromto=new JPopupMenu("转到"); //“转到”菜单项子项JMenuItem pop_backward=new JMenuItem("后退"); //”后退“JMenuItem pop_forward =new JMenuItem("前进"); //“前进”JMenuItem view_reload=new JMenuItem("刷新");JMenuItem view_getsource=new JMenuItem("源文件");JMenuItem view_fullscreen=new JMenuItem("全屏");JMenu menu_help=new JMenu("帮助"); //“帮助”菜单项JMenuItem aboutme=new JMenuItem("关于");///////////////////////工具条////////////////JToolBar toolbar=new JToolBar(); //定义工具条JButton tool_backward=new JButton("后退"); //“后退”JButton tool_forward=new JButton("前进"); //“前进”JLabel prompt=new JLabel("地址:"); //地址标签JTextField address=new JTextField(10); //文本框,用于输入URLJButton go=new JButton("转到/刷新"); //转到按钮JButton stop=new JButton("停止");JButton recover= new JButton("还原"); //从最大化还原成最小化时的按钮,构造时不添加////////////////////////////////内容框////////////////////////// JEditorPane editorpane= new JEditorPane ();JScrollPane scrollpane= new JScrollPane ();JTabbedPane tabbedpane=new JTabbedPane(); //创建//////////////////////其他变量//////////////////////////String url;ArrayList history=new ArrayList(); //用于保存历史记录int historyindex;Dimension initsize=new Dimension(900,600);Dimension maxsize = Toolkit.getDefaultToolkit().getScreenSize();//屏幕大小////////构造函数///////////////////////////public MyWebBrowser(){menu_file.add(file_saveas); //将菜单子项加入到菜单项menu_file.addSeparator(); //加一条分割线menu_file.add(file_exit);menuBar.add(menu_file); //将“文件”菜单项加入到菜单条中menu_edit.add(edit_cut);menu_edit.add(edit_copy);menu_edit.add(edit_paste);menuBar.add(menu_edit);fromto.add(pop_backward);fromto.add(pop_forward);menu_view.add(fromto);menu_view.add(view_reload);menu_view.addSeparator(); //分割线menu_view.add(view_getsource);menu_view.add(view_fullscreen);menuBar.add(menu_view);menu_help.add(aboutme);menuBar.add(menu_help);mainwindow.setJMenuBar(menuBar); //把菜单条加入到整个JFrame容器中toolbar.add(tool_backward);toolbar.add(tool_forward);toolbar.add(prompt);toolbar.add(address);toolbar.add(go);toolbar.add(stop);contentpane.add(toolbar,BorderLayout.NORTH); //添加工具条editorpane.setEditable(false); //设置文本区域不能写scrollpane.getViewport().add(editorpane);//窗格可视区添加JEditorpanecontentpane.add(scrollpane,BorderLayout.CENTER);//添加滚动窗格file_saveas.addActionListener(this);//添加事件监听file_exit.addActionListener(this);edit_cut.addActionListener(this);edit_copy.addActionListener(this);edit_paste.addActionListener(this);pop_backward.addActionListener(this);pop_forward.addActionListener(this);view_reload.addActionListener(this);view_getsource.addActionListener(this);view_fullscreen.addActionListener(this);aboutme.addActionListener(this);tool_backward.addActionListener(this);tool_forward.addActionListener(this);address.addActionListener(this);go.addActionListener(this);stop.addActionListener(this);mainwindow.setSize(initsize);mainwindow.setVisible(true); }/////////事件处理函数//////////////////////public void actionPerformed(ActionEvent e){url=address.getText().trim(); //获取URLif(e.getActionCommand()=="转到/刷新"||e.getSource()==address||e.getActionCommand()=="刷新"){if(url.length()>0){if(!url.startsWith("http://"))url="http://"+url;if(!url.endsWith("/"))url=url+"/";try{editorpane.setPage(url);address.setText(url);history.add(url);historyindex=history.size()-1;}catch(Exception ex){JOptionPane.showMessageDialog (mainwindow,"无法打开该搜索页","网页浏览器",JOptionPane.ERROR_MESSAGE);}}}else if(e.getActionCommand()=="后退"){historyindex--;if(historyindex<0)historyindex=0;try{url=(String)history.get(historyindex);editorpane.setPage(url);address.setText(url);}catch(Exception ex){JOptionPane.showMessageDialog (mainwindow,"无法打开该搜索页","网页浏览器",JOptionPane.ERROR_MESSAGE);}}else if(e.getActionCommand()=="前进"){historyindex++;if(historyindex>=history.size())historyindex=history.size()-1;try{url=(String)history.get(historyindex);editorpane.setPage(url);address.setText(url);}catch(Exception ex){JOptionPane.showMessageDialog (mainwindow,"无法打开该搜索页","网页浏览器",JOptionPane.ERROR_MESSAGE);}}else if(e.getActionCommand()=="源文件"||e.getSource()==view_getsource){if(url.length()>0)new sourcefile(url);}else if(e.getActionCommand()=="全屏"){mainwindow.setVisible(false);toolbar.add(recover);contentpane1.add(toolbar,BorderLayout.NORTH);contentpane1.add(scrollpane, BorderLayout.CENTER);recover.addActionListener(new ActionListener (){public void actionPerformed(ActionEvent e1){contentpane1.remove(scrollpane);toolbar.remove(recover);contentpane1.remove(toolbar);fullscreen.setVisible (false);//还原mainwindow.add(toolbar,BorderLayout.NORTH); //添加工具条mainwindow.add(scrollpane,BorderLayout.CENTER);mainwindow.setSize(initsize);mainwindow.setVisible(true);}});fullscreen.setSize (maxsize);fullscreen.setVisible (true);}else if(e.getActionCommand()=="关于"){JOptionPane.showMessageDialog (mainwindow,"我的浏览器\n版本:1.0","关于",JOptionPane.CLOSED_OPTION);}}public static void main(String[] args) {new MyWebBrowser();}}Source_file.java文件import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;public class sourcefile {JFrame source=new JFrame("源文件");Container containpane=source.getContentPane();JTextArea showfile= new JTextArea ();JScrollPane scrollpane= new JScrollPane ();JPanel panel=new JPanel(); //用于存放下面两个按钮JButton save=new JButton("保存");JButton exit=new JButton("退出");private String inline;public sourcefile(String str){showfile.setEditable(false);scrollpane.getViewport().add(showfile);containpane.add(scrollpane,BorderLayout.CENTER);panel.setLayout(new FlowLayout());panel.add(save);panel.add(exit);containpane.add(panel,BorderLayout.SOUTH);try{URL myurl=new URL(str);BufferedReader dis=new BufferedReader(new InputStreamReader(myurl.openStream()));while((inline=dis.readLine())!=null){showfile.append(inline+"\n");}}catch(MalformedURLException e){JOptionPane.showMessageDialog (source,"无法打开搜索页","网页浏览器",JOptionPane.ERROR_MESSAGE);}catch(IOException e){JOptionPane.showMessageDialog (source,"无法打开搜索页","网页浏览器",JOptionPane.ERROR_MESSAGE);}source.setSize(600,400);source.setVisible(true);}}。
网络聊天程序的设计和实现报告
网络聊天程序的设计和实现报告一、引言网络聊天程序是一种基于互联网的即时通信工具,它允许用户通过网络实时交流信息。
本报告旨在介绍网络聊天程序的设计和实现过程,包括需求分析、系统设计、功能实现和测试等方面的内容。
二、需求分析1. 用户需求网络聊天程序的用户需求主要包括:- 实时聊天:用户可以通过程序实时发送和接收信息。
- 多人聊天:用户可以同时与多个人进行聊天。
- 好友管理:用户可以添加、删除和查看好友列表。
- 聊天记录:程序应该能够保存聊天记录,方便用户查看历史消息。
- 图片和文件传输:用户可以发送和接收图片、文件等多媒体内容。
- 安全性:程序应该具备一定的安全性,保护用户的聊天信息不被泄露。
2. 系统需求网络聊天程序的系统需求主要包括:- 跨平台兼容性:程序应该能够在不同操作系统上运行,如Windows、Mac、Linux等。
- 稳定性和可靠性:程序应该具备良好的稳定性和可靠性,不易崩溃或丢失数据。
- 用户界面友好:程序的用户界面应该简洁明了,方便用户操作。
- 高并发处理能力:程序应该能够处理大量用户同时在线的情况,保证系统的稳定性和响应速度。
三、系统设计1. 架构设计网络聊天程序的架构设计主要包括客户端和服务器端两部分。
- 客户端:负责用户界面的展示和用户输入的处理,与服务器端进行通信。
- 服务器端:负责接收客户端的请求,处理聊天信息的传输和存储。
2. 数据库设计为了保存用户的聊天记录和好友列表等信息,需要设计数据库来存储这些数据。
数据库的设计应该包括用户表、聊天记录表和好友关系表等。
3. 通信协议设计为了实现实时聊天功能,需要设计通信协议来规定客户端和服务器端之间的数据传输格式和通信规则。
常用的通信协议包括TCP/IP协议和WebSocket协议。
四、功能实现1. 用户注册和登录功能用户在使用网络聊天程序之前,需要进行注册和登录操作。
用户注册时需要提供用户名、密码等信息,并对用户输入进行合法性验证。
计算机网络实验报告(聊天程序)
计算机通信与网络上机报告实验一聊天程序【实验目的】(1)熟悉Microsoft Visual Studio 6.0的基本操作(2)了解通信程序的设计方法【实验要求】(1)学习流式套接字对象的使用(2)实现点对点通讯【实验原理】采用客户/服务模式,分为服务器端程序和客户端程序。
由于服务端只能支持一个客户,实际上是一个点对点的通信程序,客户端可用过服务器端的IP地址发送连接请求,然后进行通信。
【实验步骤】第一步:建立连接第二步:用户向服务端发送消息主要程序:// Client.cpp : implementation file// CClientCClient::CClient(){}CClient::~CClient(){}#if 0BEGIN_MESSAGE_MAP(CClient, CSocket)END_MESSAGE_MAP()#endif // 0/////////////////////////////////////////////////////////////////////////////// CClient member functionsvoid CClient::OnReceive(int nErrorCode){((CLx1Dlg*)(AfxGetApp()->m_pMainWnd))->ShowMsg();CSocket::OnReceive(nErrorCode);}// lx2.cpp : Defines the class behaviors for the application.(server.cpp)// CLx2AppBEGIN_MESSAGE_MAP(CLx2App, CWinApp)ON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()// CLx2App constructionCLx2App::CLx2App(){}// The one and only CLx2App objectCLx2App theApp;// CLx2App initializationBOOL CLx2App::InitInstance(){if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endifCLx2Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){}else if (nResponse == IDCANCEL){}return FALSE;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2.7 简单聊天程序的设计与实现
班级:计科1301 学号:201350080105 姓名:张蓉
一、实验目的
1,掌握Socket 程序设计方法
2,掌握基于Socket 的聊天程序设计方法
3,进一步熟悉C语言或其他程序设计语言
二、实验设备
硬件:运行Windows操作系统的计算机
软件:C语言或其他程序设计语言开发环境
三、实验内容
1,使用基于Socket 的程序设计方法设计聊天客户端和服务器客户端程序
2,程序应能实现传输文字信息和聊天功能
四、基本原理
聊天程序是指能提供两人或多人聊天的应用程序,QQ程序采用的是C/S通信模式,服务器跟客户之间主要有一对多和多对多模式,一对多模式是在服务器和客户端之间用客户端程序登录,验证用户密码,获取在线好友等信息,多对多模式则是在客户端与客户端之间,在线好友直接通信聊天,每个客户端上有实现服务端和客户端两个功能的部分,前者用于接收聊天数据,后者用于发送聊天数
据。
用C/S模式进行通信时,作为客户端在请求与服务器连接时需要知道服务器端的IP地址和端口号,腾讯公司的服务器有固定公用网址,客户能很容易的回去服务器的相关信息,在客户端与客户端之间通信时,可以通过登录QQ,让QQ服务器端获得该用户的IP地址和端口号信息,然后通知其他要与该用户进行通信的用户,其他用户就可以连接该用户并与之通信。
五、程序实现
本程序采用基于面向无连接的UDP协议。
需要用到的函数有bind()、sendto()、recvfrom()等
设计一个基本的网络服务器有以下几个步骤:
1、初始化Windows Socket
2、创建一个监听的Socket
3、设置服务器地址信息,并将监听端口绑定到这个地址上
4、开始监听
5、接受客户端连接
6、和客户端通信
7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似
程序源代码:
(1)服务器端代码:
#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();
}
(2)客户端代码:
#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_ntoa
addrSrv.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();
}
六、实验结果分析。