网络编程简单的聊天程序实验报告

合集下载

聊天软件实验报告

聊天软件实验报告

聊天软件实验报告篇一:简单聊天程序的设计与实现实验报告实验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/S网络聊天室程序----实验报告信科03(1)班楼欢庆I03630117 聊天室程序的设计说明1.实现思想在Internet上的聊天室程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。

因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

实现语言C++,开发环境VC/MFC。

2.功能模块总纲2.1服务器端工作流程服务器端通过socket()系统调用创建一个Sock et数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。

如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。

然后登录成功的客户就可以在服务器上聊天了。

实现方式采用异步非阻塞机制。

2.2客户端工作流程客户端程序相对简单,只需要建立一个Socket 与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

2.3 C/S实现过程服务器端:<1>首先使用WSAStartup函数来初始化网络环境。

<2>调用socket(AF_INET,SOCK_STREAM,0)函数来创建一个套接字。

<3>调用bind函数将本地地址与刚建立的套接字关联起来。

<4>调用listen函数监听发向该套接字的连接请求。

<5>客户端的连接请求放在连接请求队列里,服务器调用accept函数从连接请求队列中取出第一个请求,创建一个为之服务的新的套接字,该套接字处理所有与该客户交互操作的信息。

而服务器进程的监听套接字这时继续处理来自其他客户的连接请求,直到因队列空而等待新的连接请求的到来。

<6>调用closesocket()关闭监听套接字,释放套接字资源。

<7>调用WSACleanup函数释放相应资源。

聊天程序实验报告

聊天程序实验报告

桂林电子科技大学计算机网络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 中进行网络应用程序设计的接口。

网络编程用VB实现简单的聊天实验报告

网络编程用VB实现简单的聊天实验报告

实验3:计算机网络实验——网络编程1一、实验目的:(1)熟悉和掌握网络编程的基本方法和步骤;(2)进一步理解client/server交互模式;(3)加深学生对于网络协议概念的理解以及协议的设计和实现方法。

二、实验任务:使用任意网络编程语言(Java、C、VB、Delphi等)编写网络选课模拟程序,它由client和server 两部分组成,client和server之间的通信基于TCP协议。

实现数据的收发。

三、网络编程:大多数网络应用程序都遵从client/server交互模型。

该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。

服务器程序既可以接收信息也能发送信息,还可以成为客户。

TCP/UDP赋予每个服务一个唯一的协议端口号。

服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。

客户在发送连接请求时,必须说明服务器程序运行主机的IP 地址和协议端口号来指定它所希望的服务。

服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。

大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层交互。

用户目前可以使用两种套接口,即流套接字TCP 和数据报套接字UDP。

流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复并且无记录边界的数据流服务。

数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。

也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。

数据报套接字的一个重要特点是它保留了记录边界。

套节字API主要包括表1所示的接口。

使用面向连接的套接字编程,通过图2来表示其时序。

套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。

聊天程序课程设计实验报告

聊天程序课程设计实验报告

聊天程序课程设计实验报告聊天程序的课程设计实验是一项相对复杂的课程设计。

本次实验的主要任务是开发一个由客户端和服务器组成的,可以实现客户端间的文本聊天的程序。

实验的具体实现方法是运用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);}。

网络编程实验报告

网络编程实验报告

简单的聊天室程序电子信息系1 设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。

2 实验要求采用客户/服务器模式,分为客户端程序和服务器端程序。

服务器采用WINSOCK I/O 模型中的任一种,支持多个客户同时在线聊天。

客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。

实验要求设计并编程完成两个方面的内容:首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。

3 功能要求✧支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;✧接收客户端发送的消息,并显示在一个列表框中;✧在用户连接上后有提示,显示出连接的用户名字;✧发送信息时可以显示聊天的所有记录;4 系统主要功能和主要功能描述:服务器端聊天程序必须能够做3件事情:(1)服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。

(2)服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。

对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。

(3)服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。

这些要求可以通过CSocket类提供的功能实现。

从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。

服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。

简单的局域网聊天程序试验报告

简单的局域网聊天程序试验报告

青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:软件工程学生姓名:__班级:__软件102学号: 201007190 题目:_局域网聊天程序________起迄日期:_2012.6.18~2012.6.29设计地点:计算机学院机房指导教师:完成日期: 2012 年6月 29 日课程设计报告内容(供参考)一、需求分析当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。

在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。

聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。

聊天室适用于网上会议或闲聊的一些场合。

聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。

聊天室的设计目标本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:服务器端功能:1、初始化socket, 创建服务器端。

2、维护一个链表,保存所有用户的IP地址、端口信息。

3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。

4、接受用户传送来的连接判断命令,并向用户发出响应命令。

1.二、设计内容SOCKET连接过程根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

java聊天程序实验报告

java聊天程序实验报告

java聊天程序实验报告Java聊天程序实验报告一、引言随着互联网的快速发展,人们之间的交流方式也在不断改变。

聊天程序作为一种实时通信工具,已经成为人们日常生活中必不可少的一部分。

本实验旨在通过使用Java编程语言,设计并实现一个简单的聊天程序,以探索实时通信的原理和机制。

二、实验目的1. 学习和掌握Java编程语言的基本语法和面向对象的编程思想;2. 了解Socket编程的基本原理和实现方式;3. 设计并实现一个简单的聊天程序,实现用户之间的实时通信。

三、实验过程1. 确定程序的基本功能和界面设计。

聊天程序需要实现用户之间的即时通信,并提供简单的用户界面用于输入和显示聊天内容。

2. 使用Java编程语言,创建一个服务器端程序和多个客户端程序。

服务器端程序负责接收和转发客户端的消息,客户端程序负责发送和接收消息。

3. 使用Socket编程,建立服务器和客户端之间的连接。

服务器端程序监听指定的端口,等待客户端的连接请求;客户端程序通过指定服务器的IP地址和端口号,连接到服务器。

4. 实现消息的发送和接收功能。

客户端程序可以通过输入框输入消息,并通过Socket将消息发送到服务器;服务器端程序接收到消息后,将消息转发给其他客户端。

5. 实现消息的显示功能。

客户端程序通过界面显示接收到的消息,并可以将消息保存到本地。

四、实验结果经过实验,我们成功地实现了一个简单的Java聊天程序。

用户可以通过输入框输入消息,并通过服务器端进行消息的转发。

其他客户端可以接收到转发的消息,并在界面上进行显示。

同时,我们还实现了消息的保存功能,用户可以将接收到的消息保存到本地文件中。

五、实验总结通过本次实验,我们深入了解了Java编程语言的基本语法和面向对象的编程思想。

同时,我们也学习了Socket编程的原理和实现方式。

通过实践,我们掌握了如何使用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。

UDP网络聊天实验【范本模板】

UDP网络聊天实验【范本模板】

计算机网络原理实验报告UDP网络聊天程序设计班级:计算机1301班学号:1307010116姓名:席凤凯实验五UDP网络聊天程序设计一.实验目的:编程设计基于UDP 的简单聊天室程序,实现服务器与客户端之间的对话通信功能。

二.实验原理:网络编程一般都是基于TCP 或UDP 的,一般过程如下:(1)TCP 编程的服务器端与客户端一般步骤:服务器端:1、创建一个socket,用函数socket();2、绑定IP 地址、端口等信息到socket 上,用函数bind();3、开启监听,用函数listen();4、接收客户端上来的连接,用函数accept();5、收发数据,用函数send()和recv(),或者read()和write();6、关闭网络连接;7、关闭监听;客户端:1、创建一个socket,用函数socket();2、设置要连接的对方的IP 地址和端口等属性;3、连接服务器,用函数connect();4、收发数据,用函数send()和recv(),或者read()和write();5、关闭网络连接;(2) UDP 编程步骤如下:服务器端:1、创建一个socket,用函数socket();2、绑定IP 地址、端口等信息到socket 上,用函数bind();3、循环接收数据,用函数recvfrom();4、关闭网络连接;客户端:1、创建一个socket,用函数socket();2、设置对方的IP 地址和端口等属性;3、发送数据,用函数sendto();4、关闭网络连接;三.实验内容:编辑代码:(1)服务器源程序:#include 〈stdio。

h〉标准输入输出头文件#include 〈netinet/in.h〉互联网地址族#include 〈arpa/inet。

h〉LINUX 下C 语言程序的INTERNET 定义头文件#include 〈unistd.h> 符号常量#include <fcntl。

实验报告java聊天程序

实验报告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. 客户端程序客户端程序负责连接服务器,发送和接收消息。

网络编程基于TCP的简易聊天室实验报告

网络编程基于TCP的简易聊天室实验报告

⽹络编程基于TCP的简易聊天室实验报告⽹络编程课程设计-基于TCP的简易聊天室⼀、实验基本信息概要1.题⽬要求熟悉异步⽹络编程的基本⽅法,掌握异步⽹络编程和⽹络协议设计的⽅法。

要求采⽤select 模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠模型或完成端⼝等模型完成编程任务。

2.上机要求要求采⽤select模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠模型或完成端⼝等模型完成下⾯的任务。

3.题⽬内容内容概要:实现⼀个聊天室,⽀持多⼈聊天。

也可以增加私聊等功能。

4.开发环境操作系统:Windows 7开发语⾔:C++集成开发环境:Microsoft Visual Studio 2010⼆、系统简介1.界⾯本软件使⽤DOS控制台界⾯,界⾯风格较为朴素,没⽤使⽤复杂的颜⾊。

但是对聊天时界⾯进⾏了⼀定的控制和修正使得界⾯较为美观,易读。

服务器:客户端:2.软件功能本软件实现了聊天室基本的功能,包括公开聊天,私聊,获取在线⽤户,更改昵称,获得帮助等。

1)公开聊天在光标处直接输⼊消息后按回车即为发送公开聊天,如下图所⽰。

2)私聊使⽤命令【/m 对⽅UID 消息】即可发送私聊,私聊只有对⽅可以看到,如下图所⽰:客户端1,密聊UID为132的⽤户。

发送后客户端2,UID为132的⽤户收到私聊消息。

3)获取在线⽤户列表使⽤命令【/list】即可获得在线⽤户列表,⽤户列表会议系统消息的⽅式返回,如下图所⽰。

命令发送后4)更改昵称使⽤命令【/name 你的新昵称】即可⽴即更改昵称,成功修改后服务器会以系统消息的⽅式返回成功修改的提⽰。

命令命令发送后5)帮助信息使⽤命令【/help】即可查看服务器的欢迎信息,⾥⾯包含了该聊天室的使⽤帮助,如下图所⽰。

命令命令发送后3.系统设计开发本软件时,我使⽤了⾯向对象的思想,把服务器和客户端封装成对应的类,类设计将会在下⼀节做详细介绍。

Java聊天程序实验报告

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)熟悉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;}。

基于UDP的网络聊天程序实验报告

基于UDP的网络聊天程序实验报告

基于UDP的网络聊天程序实验报告一、实验目的这次实验是让读者学会使用Winsock控件的UDP方式实现网络聊天程序,以达到学会面向无连接方式的程序设计方法,并理解计算机网络课程中面向无连接的概念。

二、实验要求利用Visual Basic中的Winsock控件,采用UDP方式实现一个网络聊天程序。

具体要求如下:1)能够实现用户聊天程序。

2)具有聊天记录功能。

三、程序设计的思想UDP是面向无连接的协议,在发送数据之前不必建立连接,只需要将Winsock绑定到一个端口上,其他无连接协议的Winsock若想向此处发送数据,需要指明地址和端口。

(1)将 RemoteHost 属性设置为另一台计算机的名称或者IP地址。

(2)将RemotePort 属性设置为另一台计算机Winsock控件所绑定的LocalPort 属性。

(3)调用 Bind 方法,指定使用的LocalPort服务器客户端四、关键程序说明(1)创建一个新的Standard EXE 工程。

(2)将缺省的窗体的名称修改为PeerA。

(3)将窗体的标题修改为“服务器端”。

(4)在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。

(5)在Winsock 控件的“属性”页上,单击“Protocol”属性,并将该属性值修改为 UDPProtocol。

(6)在窗体中添加两个TextBox控件。

将第一个命名为 txtSend,第二个命名为 txtOutput。

(7)为窗体增加如下的代码。

UDP聊天程序的一端:Private Sub Form_Load()With udpPeerA ‘控件的名字为udpPeerB.RemoteHost= "LBLiubing" ‘客户端主机名称.RemotePort = 1001 ‘连接的端口号.Bind 1002 ‘绑定到本地的端口End WithEnd SubPrivate Sub txtSend_Change()udpPeerA.SendData txtSend.Text 在键入文本时,立即将其发送出去End SubPrivate Sub udpPeerA_DataArrival (ByVal bytesTotal As Long)Dim strData As StringudpPeerA.GetData strDatatxtOutput.Text = strDataEnd SubUDP聊天程序的另一端:(1)在工程中添加一个标准窗体。

聊天程序实验报告

聊天程序实验报告

1、熟悉Visual C++的基本操作。

2、基本了解基于对话框的windows应用程序的编写过程。

3、对于Windows Socket编程建立初步概念。

1、应用Visual C++中MFC CSocket类,实现网络数据传输。

2、仿照本实验步骤,制作实用的局域网一对一聊天程序。

1.通过分别建立服务器端的socket和客户端的socket。

然后在通过服务器端进行侦听请求,通过客户端输入本地IP地址并连接,对两个端口进行连接,然后客户端即可将消息发送到服务器端,服务器端也可以回复消息到客户端。

2.对两个端口进行融合,即用一个聊天框显示客户端和服务器端两者的对话,以及记录。

可以建立一个新的工程来完成,该工程内部包含服务器端和客户端的头文件即可。

四、实验步骤:1.服务器端口的建立头文件如下:#if !defined(AFX_SERVER_H__B8F843DD_EA8C_49E9_B1D3_5740ED967982__INCLUDED_)#define AFX_SERVER_H__B8F843DD_EA8C_49E9_B1D3_5740ED967982__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// Server.h : header file/////////////////////////////////////////////////////////////////////////////// // CServer command targetclass CServer : public CSocket{// Attributespublic:// Operationspublic:CServer();virtual ~CServer();// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CServer)public:virtual void OnAccept(int nErrorCode);virtual void OnReceive(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CServer)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_SERVER_H__B8F843DD_EA8C_49E9_B1D3_5740ED967982__INCLUDED_)其对话框为:服务器端包括侦听和发送两种功能,要使其能实现这些功能,必须定义这两个按钮的监听函数,只要在对话框的图像上双击按钮,然后在里面添加数据即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与工程学院实验报告
实验题目:基于TCP的问答程序(简单的聊天程序)
课程名称:网络编程技术
实验类型:□演示性□验证性□操作性□设计性■综合性专业:软件工程
班级:
学生姓名:
学号:
实验成绩:
指导教师签字:
一、实验目的
练习使用socket编写客户/服务程序,掌握socket的使用方法,熟悉并掌握多线程的概念
二、实验要求
1)基于Java socket编写客户端和服务器端程序,可使客户端和服务器进行通讯
2)服务器端实现接受多个客户的服务请求并为它们服务,接受客户传送来的数据并将数据分别发回给客户端。

三、实验流程图
四、实验代码
服务器端代码
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import .*;
public class ChatS extends Frame
{
TextField tf=new TextField(20);
TextArea ta=new TextArea();
ServerSocket server;
Socket client;
InputStream in;
BufferedReader br;
OutputStream out;
BufferedWriter bw;
@SuppressWarnings("deprecation")
public ChatS()
{
super("Server");
add("North",tf);
add("Center",ta);
setSize(250,250);
show();
try
{
server=new ServerSocket(5001);
client=server.accept();
ta.append("Client host:" + client.getInetAddress().getHostName()); in=client.getInputStream();
out=client.getOutputStream();
}
catch(IOException ioe){}
while(true)
{
try
{
byte[] buf=new byte[200];
in.read(buf);
String str=new String(buf);
ta.append("Client say:" + str);
ta.append("\n");
}
catch(IOException e){}
}
}
public boolean action(Event e,Object o)
{
try
{
String str=tf.getText();
byte[] buf=str.getBytes();
tf.setText(null);
out.write(buf);
ta.append("I say:" + str);
ta.append("\n");
catch(IOException ioe){}
return true;
}
public static void main(String args[])
{
new ChatS();
}
}
客户端代码
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import .*;
public class ChatC extends Frame
{
TextField tf=new TextField(20);
TextArea ta=new TextArea();
Socket client;
InputStream in;
BufferedReader br;
OutputStream out;
BufferedWriter bw;
@SuppressWarnings("deprecation")
public ChatC()
{
super("Client");
add("North",tf);
add("Center",ta);
setSize(250,250);
show();
try
{
client=new Socket("127.0.0.1",5001);
ta.append("Connect to:" + client.getInetAddress().getHostName()); in=client.getInputStream();
br=new BufferedReader(new InputStreamReader(in));
out=client.getOutputStream();
bw=new BufferedWriter(new OutputStreamWriter(out));
}
catch(IOException ioe){}
while(true)
try
{
byte[] buf=new byte[200];
in.read(buf);
String str=new String(buf);
ta.append("Server say:" + str);
ta.append("\n");
}
catch(IOException e){}
}
}
public boolean action(Event e,Object o)
{
try
{
String str=tf.getText();
byte[] buf=str.getBytes();
tf.setText(null);
out.write(buf);
ta.append("I say:" + str);
ta.append("\n");
}
catch(IOException ioe){}
return true;
}
public static void main(String args[])
{
new ChatC();
}
}
五、实验心得
此次实验是对Java Socket的一个应用,让我更深的了解了Socket函数的作用及使用方法。

通过这次实验能够感受到网络只是在实际当中的运用,通过这次的实验,使我对网络编程有了更深的概念,也更加巩固了java的知识。

同时让我发现自己知识结构的欠缺。

虽然基本功能已经实现,但还是存在很多不稳定的问题尚待解决。

实验过程中遇到了很多的问题,有的是自己的知识储备不足,有的是自己对问题的考虑不够周全,之所以能顺利实现基本功能,离不开老师和同学们的帮助。

此次最大的收获是学会了如何解决实际运用中碰到的一些问题。

相关文档
最新文档