计算机网络TCP聊天室实验报告

合集下载

计算机网络课程设计实验报告

计算机网络课程设计实验报告

计算机网络课程设计实验报告一、实验项目:网络聊天程序二、实验要求:利用Winsock控件,采用TCP或UDP方式实现一个网络聊天程序。

具体要求如下:(1)能够实现一个聊天服务器(采用TCP方式时可同时允许15个用户连接),并在用户之间相互进行信息发送。

(2)具有聊天记录功能。

(3)制作一个客户端程序。

在课程设计报告中要求给出程序设计的思想、关键程序说明以及服务器和客户程序运行界面的屏幕截图。

三、实验程序功能:采用TCP方式实现的网络聊天程序:(1)以某一用户名注册进入聊天室,自动判断是否与现有聊天室人员重名,给出相关信息。

进入后启动线程,获得现有聊天室人员的列表信息;(2)点击[送出]按钮,向所有人发送信息。

双击列表中某人的名字,在弹出的窗口中可以写悄悄话,悄悄话内容只显示在这个人的屏幕上;(3)点击[刷新谈话区],可以清空聊天信息屏幕。

点击[刷新聊天者列表]可以重新从服务器读取聊天室人员列表信息;(4)点击[退出聊天室],向所有人发送离开信息,同时刷新聊天室人员列表;(5)服务器端程序先行运行,服务器读取来自客户端的信息流请求,并把相应处理结果返回客户端,完成与客户端的通信。

(6)点击[聊天记录],可以查看聊天室的聊天记录。

四、设计与分析:客户端聊天室客户/服务器通信图(《》表示信息流方向):五、设计思想:传输层协议有两种:TCP和UDP,TCP是可靠传输,它把信息包捆绑,在必要的时候,排序和重传这些信息包以获得可靠的数据传输。

UDP支持快速的、无连接的、不可靠的信息包传输。

在JAVA中,使用TCP传输,其套接字的封装函数分TCP/IP客户套接字和TCP/IP服务器套接字。

本程序使用TCP做,采用了JA V A中的流式Socket 的通信机制,流式Socket 通信过程如下图:客户套接字函数:Socket(String hostname,itn port)或Socket(InetAddress ipAddress,int port)服务端套接字函数:ServerSocket(int port)ServerSocket(int port,int maxQueue)ServerSocket(int port,int maxQueue,InetAddress localAddress)六、文件说明:文件清单:(1)客户端线程主类:chatappletthreepublic class chatserverthree implements Runnable{/*聊天室服务器端处理主类*///服务器构造初始化线程public chatserverthree(){}//服务器main()初始化public static void main(String args[]){}//服务器线程connect操作run方法public void run(){}//向聊天室所有人员发送普通话语信息public void broadcast(String msg){}//处理悄悄话,向特定人员发送悄悄话public void broadcast1(String msg){}//客户端线程类firstthreadclass firstthread extends Thread{}//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){}//监听运行线程public void run(){while(true){line=in.readUTF();//line 读取来自客户端线路的信息//线路信息前端为PEOPLE表明有新人进入了聊天室if(line.startsWith("PEOPLE")){}//线路信息前端为QUIT表明有人离开了聊天室else if(line.startsWith("QUIT")){}//线路前端为MSG表明接收到的是普通聊天话语信息e lse if(line.startsWith("MSG")) {}//线路前端为“悄悄的对”表明接收到的是悄悄话else if(line.startsWith("悄悄地对")){}//线路前端为newlist表明得到客户端刷新列表的请求else if(line.startsWith("newlist")){}}}(2) 聊天室界面AWT面板类:Apanel:/*聊天室界面北部面板Apanel类*/class Apanel extends Panel //用于构造面板{}Bpanel:/*聊天室界面中部面板Bpanel类*/class Bpanel extends Panel{}Cpanel:/*聊天室界面南部面板Cpanel类*/class Cpanel extends Panel{}(3) 发送悄悄话弹出式窗口类:Mywindow:class Mywindow extends Frame implements ActionListener{//构造方法初始化画出弹出式窗口界面Mywindow(){}//处理按钮事件的方法public void actionPerformed(ActionEvent e){}}(4)服务器端线程类:Chatserverthree:/*聊天室主类chatappletthree类*/public class chatappletthree extends Applet implements Runnable,ActionListener,ItemListener {//Applet 启动初始化画出聊天室界面,建立与服务器连接public void init() {}//启动线程public void start(){}//终止线程public void stop() {}//关闭监听端口,断开连接public void destroy() {}//客户端启动线程public void run() {}}(4)服务器为每一个客户端启动的线程类Firstthread//客户端线程类firstthreadclass firstthread extends Thread{protected Socket client;//listen读取来自客户端的消息:name 格式为:PEOPLE+名字+[性别]String line,name;protected DataOutputStream firstout,out; //定义网络数据输出流protected chatserverthree server;protected DataInputStream in; //定义网络数据输入流//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){this.server=server;this.client=client;。

网上聊天 实验报告

网上聊天 实验报告

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函数释放相应资源。

(完整word版)网络编程_基于TCP的简易聊天室_实验报告

(完整word版)网络编程_基于TCP的简易聊天室_实验报告

网络编程课程设计说明书题目名称:基于TCP/IP的网络文字聊天程序设计专业:网络工程班级:1201班学号:1220140105姓名:蒋星指导老师:陈利平完成日期:2014年12月13日目录一、实验基本信息概要31. 题目要求32. 题目内容33. 开发环境3二、流程图4三、系统简介51.界面52. 软件功能53. 系统设计94. 优点与缺点9四、系统详细设计111. ChatServer类 112. ChatClient 类133. SocketException类155. 命令协议156. 消息格式16五、系统测试161. 服务器使用错误162. 客户端使用错误173. 启动服务器174. 启动客户端175. 关闭客户端176. 启动服务器错误提示187. 公开聊天188. 私聊189. 错误的私聊1910. 更名2011. 帮助2012. 非法指令2013. 非法的指令参数2014. 连接服务器失败21六、心得体会21七、完整代码21Charserverd.cpp 服务器main函数文件21ChatServer.h 服务器类头文件22ChatServer.cpp 服务器类23ClientInfo.h 客户信息类33Charclientd.cpp 客户端main函数34ChatClient.h 客户端头文件 34ChatClient.cpp 客户端类35InitSock.cpp 初始化WINSOCK类41SockException.h 异常类41八、[参考文献] 42一、实验基本信息概要1. 题目要求1、开发平台Visual C++ 6.0。

2、对设计方法的要求使用Visual C++ 6.0开发出在Windows控制台或图形界面下运行的程序。

3、对设计内容的要求①实现网络文字聊天程序的服务器端。

②实现网络文字聊天程序的客户端。

③主程序的结构和流程。

④程序运行过程的截图。

⑤网络文字聊天程序的实现原理。

TCP聊天系统实验报告

TCP聊天系统实验报告

信息管理系《计算机网络》课程设计报告学生姓名:王法芝,王敏学号:***************222009602063010 专业班级:2009级信管1班成绩:指导教师:***二0一一年11 月 6 日目录一、背景分析: (3)二、需求分析: (3)三、开发流程: (5)四、具体实现过程: (5)一、客户端发送消息不能为空。

(5)二、在消息后面加上了发送消息的时间 (5)四、添加用户表情: (6)五、系统结构: (6)四、界面: (9)1、最初界面为: (9)2、聊天时的界面为: (9)六、程序的不足之处(尚未实现之处): (10)七、总结: (10)八、参考文献: (10)开发报告一、背景分析:本次实验基于VC++6.0平台,应用MFC和SOCKET编程技术,实现聊天室(chat server and client)的功能添加和功能实现。

关于WinSocket和MFC的一点理解和体会:Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。

WinSock以DLL的形式提供。

WinSock也是一个基于Socket模型的API,在Microsoft Windows操作系统类中使用。

Socket是网络通信过程中端点的抽象表示。

Socket在实现中以句柄的形式被创建,包含了进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

要使用socket,首先必须创建一个socket;然后,按要求配置socket;接着,按要求通过socket接收和发送数据;最后,程序关闭此socket。

实现Windows Sockets应用程序在网上的数据通信,必须在Windows 9x/NT 控制面板中的网络配置项里,添加TCP/IP协议,同时给定相应的IP地址,这些IP地址在所建的局域网中,不能有重复,一般要采用C类地址。

Windows 9x/NT带有协议。

tcp实验报告

tcp实验报告

tcp实验报告TCP实验报告一、实验目的TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在互联网通信中扮演着重要的角色。

本实验旨在通过实际操作和观察,深入理解TCP协议的工作原理和特点。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.93. 实验工具:Wireshark三、实验步骤与结果1. 建立TCP连接通过Python的socket库,我们可以轻松地创建TCP连接。

在本实验中,我们编写了一个简单的服务器端和客户端程序,通过本地主机进行通信。

2. 数据传输与流量控制在TCP连接建立后,我们进行了数据的传输实验。

首先,我们发送了一个较小的数据包,观察到数据包的传输过程中,TCP协议会自动进行流量控制,确保数据的可靠传输。

接着,我们发送了一个较大的数据包,发现TCP会将大数据包拆分成多个小数据包进行传输,并在接收端进行重组。

3. 拥塞控制为了模拟网络拥塞的情况,我们在实验中人为地降低了网络带宽。

通过Wireshark抓包分析,我们观察到TCP协议在发现网络拥塞时,会自动减少发送速率,以避免网络的过载。

同时,我们还注意到TCP协议会根据网络的状况动态调整拥塞窗口的大小,以提高网络的利用率。

4. 可靠性与重传机制为了测试TCP协议的可靠性,我们在实验中故意模拟了数据包丢失的情况。

通过Wireshark的分析,我们发现当发送端未收到确认消息时,会自动触发重传机制,确保数据的可靠传输。

同时,TCP还会根据超时时间的动态调整,以适应不同网络环境下的传输速度。

五、实验总结通过本次实验,我们深入了解了TCP协议的工作原理和特点。

TCP作为一种可靠的传输协议,在互联网通信中发挥着重要的作用。

它通过流量控制、拥塞控制和重传机制等手段,确保了数据的可靠传输,并适应了不同网络环境的变化。

在今后的学习和实践中,我们将进一步深入研究TCP协议的细节,并结合实际应用场景,优化网络通信的性能和可靠性。

计算机网络实验TCP实验报告

计算机网络实验TCP实验报告

计算机网络实验TCP实验报告大连民族学院计算机科学与工程学院实验报告实验题目:TCP协议分析课程名称:计算机网络实验类型:□演示性√验证性□操作性□设计性□综合性专业:软件工程班级:084 学生姓名:葛玲钰学号:2008082405 实验日期:2010年12月4日实验地点:实验学时:实验成绩:指导教师签字:年月日实验题目:TCP协议分析1.向gaia.cs.umass.esu服务器传送文件的客户端主机的IP地址是10.200.253.26,TCP端口号为:4277。

2.Gaia.cs.umass.esu服务器的IP地址是:10.200.253.11,TCP端口号是:445。

3.客户服务器之间用于初始化TCP连接的TCP SYN报文段是用:seq=0 ,[SYN]来表示该报文段是SYN报文段的。

4.服务器向客户端发送的SYNACK报文段序号是:0,该报文段中,ACKNOWLEDMENT字段的值是:1,Gaia.cs.umass.esu服务器由主机向服务器发送的上一条请求中的seq的值加上发送的数据长度来决定此值,是用[SNY,ACK]来标示该报文段是SYNACK报文段的.5.包含HTTP POST命令的TCP报文段的序号是:152652//6.如果将包含HTTP POST令的TCP报文段看作是TCP连接上的第一个报文段,那么该TCP连接上的第六个报文段的序号是14253.7.前六个 TCP报文段的长度各是:1,1,137,89,106,265//8.在整个跟踪过程中,接收端公示的最小的可用缓存空间是5840.缓存仍然不够用。

9.在跟踪文件中有重传的报文段。

判断依据为:发送端实体在合理的往返时延(RTT)内未收到确认。

tcp实验总结

tcp实验总结

tcp实验总结摘要:1.TCP协议简介2.TCP实验目的与过程3.TCP实验结果与分析4.TCP协议的优点与不足5.总结与建议正文:一、TCP协议简介TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠、基于字节流的传输层通信协议。

它与IP协议共同构成了TCP/IP协议族,是互联网中最常用的协议之一。

TCP协议通过三次握手建立连接,保证数据传输的可靠性,具有错误检测和纠正功能。

二、TCP实验目的与过程本次TCP实验旨在通过实际操作,了解TCP协议的工作原理,掌握TCP 连接的建立、数据传输和断开过程,以及分析TCP协议在实际应用中的性能表现。

实验过程如下:1.搭建TCP服务器和客户端2.实现TCP客户端与服务器的通信3.观察TCP连接的建立与断开4.分析TCP协议的传输性能三、TCP实验结果与分析实验结果显示,TCP协议能够实现可靠的数据传输。

通过对TCP连接的建立、数据传输和断开过程的观察,发现TCP协议具有以下特点:1.TCP连接建立:通过三次握手,客户端与服务器确认对方的存在,并为后续数据传输做好准备。

2.数据传输:TCP协议采用字节流的方式发送数据,保证了数据的顺序和完整性。

3.TCP断开:通过四次挥手,双方确认对方已接收完毕数据,并依次关闭连接。

四、TCP协议的优点与不足优点:1.面向连接,确保数据传输的可靠性2.错误检测和纠正功能,保证数据完整性3.流量控制与拥塞控制,提高网络资源利用率不足:1.相对复杂的实现,占用较多资源2.传输延迟较高,不适合实时应用3.依赖IP协议,不能单独使用五、总结与建议通过TCP实验,我们对TCP协议有了更深入的了解。

在实际应用中,应根据需求选择合适的协议,充分发挥TCP协议的优点,避免其不足。

设计聊天室实验报告

设计聊天室实验报告
strcat( str, name);
write( sockfd, str, strlen( str));
fcntl( 0, F_SETFL, O_NONBLOCK);
while ( 1) {
if ( (status = read( sockfd, str, MAX_LINE))>=0 )
{
if ( status == 0) exit(0);
sizeof( serv_addr))<0) {
printf( "client:can`t connect to server\n");
fflush( stdout);
return( 0);
}
return( sockfd);
}
运行结果:
服务器端运行结果,显示端口号并处于等待连接状态:
群聊功能,四个客户端代表四个用户,通过服务器的转发实现通信。
#include<>
#include<>
#include <>
#include <netinet/>
#include <>
#include <>
#include <>
#define MAX_LINE 500
#define MAX_NAME 100
int init_cli();
#ifndef __SELECT__
实验内容
(1)编写聊天室的客户端和服务器端,客户端主要功能是发送信息,服务器端的主要功能是将客户端发的内容转发到除发送端以外的所有客户端,实现客户端和客户端的通信。
(2)编写基于原始套接字的网络通信原型系统;

计算机网络实验报告 tcp协议

计算机网络实验报告 tcp协议

计算机网络实验报告 tcp协议计算机网络实验报告:TCP协议一、引言计算机网络是现代社会中不可或缺的一部分,而其中最重要的组成部分之一就是传输控制协议(TCP)。

TCP协议是一种可靠的、面向连接的协议,它在保证数据可靠传输的同时,提供了流量控制和拥塞控制等重要功能。

本实验旨在深入了解TCP协议的原理和工作机制,通过实际操作和观察,进一步加深对TCP协议的理解。

二、实验目的1. 了解TCP协议的基本原理和工作机制;2. 熟悉TCP连接的建立和终止过程;3. 掌握TCP的流量控制和拥塞控制机制;4. 通过实验验证TCP协议的可靠性和效率。

三、实验环境本实验使用了一台运行着Linux操作系统的计算机,通过该计算机可以模拟TCP协议的各种操作和行为。

四、实验步骤1. TCP连接的建立在本实验中,我们使用了一个简单的客户端-服务器模型来模拟TCP连接的建立过程。

首先,在服务器端启动一个监听进程,等待客户端的连接请求。

然后,在客户端发起连接请求时,服务器接受该请求,并建立一个TCP连接。

在这个过程中,可以观察到TCP三次握手的过程,即客户端发送SYN包,服务器回应SYN+ACK包,最后客户端发送ACK包,完成连接的建立。

2. TCP连接的终止TCP连接的终止过程也是一个重要的实验内容。

在本实验中,我们通过发送一个特殊的FIN包来终止一个已建立的TCP连接。

在终止过程中,可以观察到TCP四次挥手的过程,即一方发送FIN包,另一方回应ACK包,然后另一方也发送FIN包,最后再回应ACK包,完成连接的终止。

3. TCP的流量控制TCP通过使用滑动窗口机制来实现流量控制。

在本实验中,我们可以通过调整滑动窗口的大小,观察到数据发送和接收的速度变化。

当滑动窗口的大小较小时,发送方发送的数据量较小,接收方的处理速度较慢;而当滑动窗口的大小较大时,发送方发送的数据量较大,接收方的处理速度较快。

通过实验可以验证TCP流量控制的有效性。

设计聊天室实验报告

设计聊天室实验报告

设计聊天室实验报告一、实验目的本实验的目的是设计一个基于网络的聊天室,实现多用户之间的实时聊天功能。

通过这个实验,我们可以更好地理解计算机网络通信的原理和网络编程的基本知识,同时提高我们的编程能力和团队协作能力。

二、实验内容1.搭建网络环境首先,我们需要搭建一个网络环境,使得多个用户可以通过网络进行通信。

我们选择使用Socket编程,通过TCP/IP协议进行通信。

我们使用Python语言进行编程,通过socket模块中的函数来创建网络连接。

2.实现用户注册和登录功能在聊天室中,每个用户都需要有自己的账户并进行登录操作。

在实验中,我们使用MySQL数据库来存储用户的账户信息。

用户可以通过注册功能来创建自己的账户,并使用登录功能进行登录。

在用户登录成功后,系统将会为其分配一个唯一标识符,并将其保存在服务端。

3.实现聊天功能在登录成功后,用户可以进入聊天室进行聊天操作。

用户可以发送消息给其他用户,并且可以实时接收其他用户发送的消息。

在实现聊天功能时,我们使用多线程的方式,使得每个用户可以同时进行收发消息的操作。

同时,为了保证消息的有序性,我们使用队列来存储用户发送的消息,并使用互斥锁来保护队列的访问。

4.实现用户列表功能为了方便用户之间的选择和通信,我们实现了用户列表功能。

用户可以查看当前在线的用户,并选择要发送消息的目标用户。

在用户列表中,我们显示用户的昵称和状态信息。

三、实验结果通过本次实验,我们成功实现了基于网络的聊天室,并且完成了所有的实验内容。

实际测试中,我们模拟多个用户在不同的终端进行登录和聊天操作,并得到了预期的结果。

用户可以通过注册功能来创建自己的账户,并通过登录功能进行登录。

登录成功后,用户可以进入聊天室进行聊天操作,并可以看到其他用户发送的消息。

同时,用户也可以选择特定的用户进行私聊。

四、实验总结通过本次实验,我们对计算机网络通信的原理和网络编程有了更深入的了解。

我们学会了如何使用Socket编程进行网络连接,并实现了用户注册、登录、聊天和用户列表等功能。

基于tcp协议的网络聊天室

基于tcp协议的网络聊天室

班级:软件113 姓名:蒋栋学号:1108050328 成绩:实验名称: 基于TCP的网络聊天室1.实验目的:掌握TCP通讯协议、掌握QTcpSocket2.实验内容:使用Qt的QtcpSocket实现简单的网络聊天程序,范例如图:包括拂去其程序和客户端程序,服务端程序可以创建一个聊天室,客户端程序可以输入登陆的用户名、服务器地址以及使用的端口号,然后进入聊天室,聊天室中的每一位用户均可以看见发布的信息。

3.实验方法:使用Qt的QtcpSocket,参考Qt网络编程实验。

4.实验过程tcpServer端代码:#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog){ui->setupUi(this);ui->lineEdit->setText("8010");port=8010;}Dialog::~Dialog(){delete ui;}void Dialog::on_newchat_clicked(){server=new Server(this,port);connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString ,int)));ui->newchat->setEnabled(false);}void Dialog::updateServer(QString msg,int length){ui->listWidget->addItem (msg.left(length) );}tcpServer端server.cpp 代码:#include "server.h"#include <QTcpSocket>Server::Server(QObject*parent,int port):QTcpServer(parent){listen(QHostAddress::Any,port);}void Server::incomingConnection(int socketDescriptor){TcpclientSocket*tcpClientSocket=new TcpclientSocket(this);connect(tcpClientSocket,SIGNAL(updateClient(QString,int)),this,SLOT(updateClient (QString,int)));connect(tcpClientSocket,SIGNAL(disconnected(int)),this,SLOT(slotDisconnected(int )));tcpClientSocket->setSocketDescriptor(socketDescriptor);tcpClientSocketList.append(tcpClientSocket);}void Server::updateClient(QString msg, int length){emit updateServer(msg,length);for(int i=0;i<tcpClientSocketList.count();i++){QTcpSocket*item=tcpClientSocketList.at(i);if(item->write(msg.toLatin1(),length)!=length){continue ;};}}void Server::slotDisconnected(int descriptor){for(int i=0;i<tcpClientSocketList.count();i++){QTcpSocket*item=tcpClientSocketList.at(i);if(item->socketDescriptor()==descriptor){tcpClientSocketList.removeAt(i);return;}}return;}Tcpclient端代码:#include "dialog.h"#include "ui_dialog.h"#include <QMessageBox>Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog){ui->setupUi(this);ui->lineEdit_4->setText("8010");status=false;serverIP =new QHostAddress();port = 8010;ui->pb_send->setEnabled(false);}Dialog::~Dialog(){delete ui;}void Dialog::on_pb_send_clicked(){slotSend();}void Dialog::on_pb_enter_clicked(){slotEnter();}void Dialog::slotEnter(){if(!status){QString ip=ui->lineEdit_3->text();if(!serverIP->setAddress(ip)){QMessageBox::information(this,tr("error"),tr("server ip address error!"));return;}if(ui->LineEditUser->text()==""){QMessageBox::information(this,tr("error"),tr("User name error!"));return ;}userName=ui->LineEditUser->text();tcpSocket = new QTcpSocket(this);connect(tcpSocket,SIGNAL(connected()),this,SLOT(slotConnected())); connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));connect(tcpSocket, SIGNAL(readyRead()),this, SLOT(dataReceived()));tcpSocket->connectToHost ( *serverIP, port);status=true;}else{int length = 0;QString msg=userName+tr(":Leave Chat Room");if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length()){return ;}tcpSocket->disconnectFromHost();status=false;}}void Dialog::slotConnected(){int length = 0;ui->pb_send->setEnabled( true );ui->pb_enter->setText(tr("Leave"));QString msg=userName+tr(":Enter Chat Room");if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length()){return;}}void Dialog::slotDisconnected(){ui->pb_send->setEnabled( false );ui->pb_enter->setText(tr("Enter"));}void Dialog::slotSend(){if(ui->LineEditSend->text()==""){return ;}QString msg=userName+":"+ui->LineEditSend->text();tcpSocket->write(msg.toLatin1(),msg.length());ui->LineEditSend->clear();}void Dialog::dataReceived(){while (tcpSocket->bytesAvailable()>0){QByteArray datagram;datagram.resize(tcpSocket->bytesAvailable());tcpSocket->read(datagram.data(), datagram.size());QString msg=datagram.data();ui->listWidget->addItem (msg.left(datagram.size()));}}5.实验结果客户端1 服务器端客户端26.实验总结经过本次实验练习了TCP通讯协议、QTcpSocket 的使用。

计算机网络实验报告(聊天程序)

计算机网络实验报告(聊天程序)

计算机通信与网络上机报告实验一聊天程序【实验目的】(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;}。

分析tcp协议实验报告

分析tcp协议实验报告

分析tcp协议实验报告TCP协议实验报告分析在计算机网络中,TCP(Transmission Control Protocol,传输控制协议)是一种常用的传输层协议,它提供可靠的、面向连接的通信。

TCP协议的设计和实现对于网络通信的稳定性和性能至关重要。

本文将对TCP协议的实验报告进行分析,探讨其关键内容和实验结果。

实验目的和背景首先,实验报告应明确实验的目的和背景。

TCP协议的设计目标是提供可靠的数据传输,确保数据的完整性和顺序性。

通过实验,可以验证TCP协议的可靠性和性能,并分析其在不同网络环境下的适应性。

实验设计和方法实验报告中应包含实验的设计和方法。

实验设计应包括实验所使用的工具和设备,实验所涉及的网络拓扑结构,以及实验过程中的具体步骤和参数设置。

实验方法应明确实验的操作流程和数据采集方式。

实验结果和分析实验报告的重点是实验结果和分析。

实验结果可以包括数据传输速度、丢包率、延迟等性能指标的测量结果。

实验结果应以图表的形式展示,并对结果进行详细的分析。

在分析实验结果时,可以从以下几个方面进行讨论:1. 可靠性:通过实验结果可以评估TCP协议在不同网络环境下的可靠性。

例如,可以比较在高丢包率和低丢包率环境下的数据传输情况,分析TCP协议对丢包的处理能力。

2. 吞吐量:实验结果可以反映TCP协议的吞吐量性能。

通过比较不同网络条件下的吞吐量,可以评估TCP协议在不同网络带宽和拥塞程度下的性能表现。

3. 延迟:实验结果可以反映TCP协议的延迟性能。

通过测量数据传输的延迟时间,可以评估TCP协议在不同网络环境下的响应速度。

4. 拥塞控制:实验结果可以揭示TCP协议的拥塞控制机制。

通过观察拥塞窗口的变化和传输速率的调整,可以评估TCP协议对网络拥塞的响应能力。

实验总结和展望实验报告应包含对实验结果的总结和展望。

总结部分可以对实验结果进行概括,并提出对TCP协议性能的评价和改进建议。

展望部分可以探讨未来可能的研究方向和改进空间,以及对实验结果的进一步分析和验证。

计算机网络实验报告tcp

计算机网络实验报告tcp

计算机网络实验报告tcp计算机网络实验报告:TCP一、引言计算机网络是当今社会中不可或缺的一部分,而TCP(Transmission Control Protocol)作为互联网中最重要的传输协议之一,起到了关键的作用。

本实验旨在通过对TCP协议的实际操作和观察,深入了解TCP的工作原理和性能特点。

二、实验目的1. 了解TCP协议的基本原理和机制;2. 掌握TCP协议的连接建立和断开过程;3. 研究TCP协议在不同网络环境下的传输性能。

三、实验环境和工具1. 实验环境:使用两台计算机,分别作为服务器和客户端;2. 实验工具:使用Wireshark进行网络数据包的捕获和分析。

四、实验过程和结果1. 连接建立在服务器端启动TCP监听,并设置端口号为8080。

在客户端使用telnet命令连接服务器,并指定服务器的IP地址和端口号。

通过Wireshark捕获到的数据包可以观察到三次握手的过程,即SYN、SYN-ACK和ACK的交互。

2. 数据传输在客户端输入一段文本,并通过telnet发送给服务器。

在Wireshark中可以看到TCP协议中的数据包以及相应的确认包,验证了TCP的可靠传输机制。

同时,还可以观察到拥塞控制机制的运作,根据网络的情况动态调整拥塞窗口大小。

3. 连接断开在客户端输入断开连接的命令,通过Wireshark可以观察到四次挥手的过程,即FIN、ACK、FIN和ACK的交互。

这个过程中,双方都需要发送FIN和ACK来确认连接的断开。

五、实验结果分析通过实验可以得出以下结论:1. TCP协议通过三次握手建立连接,保证了连接的可靠性和稳定性;2. TCP协议具有拥塞控制机制,能够根据网络情况动态调整传输速率,避免网络拥塞;3. TCP协议的断开过程需要四次挥手,确保连接的安全关闭。

六、实验总结通过本次实验,我们深入了解了TCP协议的工作原理和性能特点。

TCP作为一种可靠的传输协议,在互联网中扮演着重要的角色。

TCP实验报告

TCP实验报告

《—计算机网络—》TCP通信实验报告姓名:班级:学号:指导老师:浙江理工大学信息电子学院二○一四年十二月一、实验目的、利用c#编写异步tcp通讯程序,掌握socket语句的用法二、实验内容TCP实现一对一单人聊天,编程实现一个聊天室系统。

该系统首先必须设立服务器,建立完成后必须建立与服务器的连接。

建立成功后可以接收客户端输入的信息。

该系统包括客户端和服务器端两部分。

用户通过客户端发送消息。

服务器端在收到消息后,显示在主界面上实验报告要求有实现过程的流程图,对主要的函数及其参数给予说明,要有实现过程的主要程序段,并对各段程序的功能及作用进行说明三、实验代码1.server端using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ;using .Sockets;using System.IO;using System.Threading;namespace frmAsyncTcpServer{public partial class TCPServer : Form{// 申明变量private const int Port = 51388;private TcpListener tcpLister = null;private TcpClient tcpClient = null;IPAddress ipaddress;private NetworkStream networkStream = null;private BinaryReader reader;private BinaryWriter writer;// 申明委托// 显示消息private delegate void ShowMessage(string str);private ShowMessage showMessageCallback;// 显示状态private delegate void ShowStatus(string str);private ShowStatus showStatusCallBack;// 清空消息private delegate void ResetMessage();private ResetMessage resetMessageCallBack;public TCPServer(){InitializeComponent();// 显示消息showMessageCallback = new ShowMessage(showMessage);// 显示状态showStatusCallBack = new ShowStatus(showStatus);// 重置消息resetMessageCallBack = new ResetMessage(resetMessage); ipaddress = IPAddress.Loopback;tbxserverIp.Text = ipaddress.ToString();tbxPort.Text = Port.ToString();}// 显示消息private void showMessage(string str){lstbxMsgView.Items.Add(tcpClient.Client.RemoteEndPoint); lstbxMsgView.Items.Add(str);lstbxMsgView.TopIndex = lstbxMsgView.Items.Count - 1;}// 显示状态private void showStatus(string str){toolStripStatusInfo.Text = str;}// 清空消息private void resetMessage(){tbxMsg.Text = string.Empty;tbxMsg.Focus();}private void toolTip1_Popup(object sender, PopupEventArgs e){}private void TCPServer_Load(object sender, EventArgs e){}private void label1_Click(object sender, EventArgs e){}private void btnStart_Click(object sender, EventArgs e){tcpLister = new TcpListener(ipaddress, Port);tcpLister.Start();// 启动一个线程来接受请求Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}private void acceptClientConnect(){statusStripInfo.Invoke(showStatusCallBack, "正在监听");Thread.Sleep(1000);try{statusStripInfo.Invoke(showStatusCallBack, "等待连接");tcpClient = tcpLister.AcceptTcpClient();if (tcpLister != null){statusStripInfo.Invoke(showStatusCallBack, "接受到连接"); networkStream = tcpClient.GetStream();reader = new BinaryReader(networkStream);writer = new BinaryWriter(networkStream);}}catch{statusStripInfo.Invoke(showStatusCallBack, "停止监听");Thread.Sleep(1000);statusStripInfo.Invoke(showStatusCallBack, "就绪");}}private void btnStop_Click(object sender, EventArgs e){tcpLister.Stop();}private void btnClear_Click(object sender, EventArgs e){lstbxMsgView.Items.Clear();}private void btnReceive_Click(object sender, EventArgs e){statusStripInfo.Invoke(showStatusCallBack, "接受消息中");try{string receivemessage = reader.ReadString();lstbxMsgView.Invoke(showMessageCallback, receivemessage);StreamWriter wr = new StreamWriter(@"历史记录.txt", true,System.Text.Encoding.Default);for (int i = 0; i < lstbxMsgView.Items.Count; i++){wr.Write(lstbxMsgView.Items[i].ToString() + Environment.NewLine); }wr.Close();}catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接");// 重新开启一个线程等待新的连接Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}}private void btnSend_Click(object sender, EventArgs e){Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMsg.Text);}private void SendMessage(object state){statusStripInfo.Invoke(showStatusCallBack, "正在发送");try{writer.Write(state.ToString());Thread.Sleep(5000);writer.Flush();statusStripInfo.Invoke(showStatusCallBack, "完毕");tbxMsg.Invoke(resetMessageCallBack, null);lstbxMsgView.Invoke(showMessageCallback, state.ToString()); }catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接");// 重新开启一个线程等待新的连接Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}}private void button1_Click(object sender, EventArgs e){if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){// 断开连接tcpClient.Close();}toolStripStatusInfo.Text = "断开连接";// 启动一个线程等待接受新的请求Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}private void button1_Click_1(object sender, EventArgs e){StreamReader file = new StreamReader(@"历史记录.txt", System.Text.Encoding.Default);string s = "";while (s != null){s = file.ReadLine();if (s != null && !s.Equals(""))lstbxMsgView.Items.Add(s);}file.Close();}}}2.client端using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ;using .Sockets;using System.Threading;using System.IO;namespace frmAsyncTcpClient{public partial class frmAsyncTcpClient : Form{// 申明变量private TcpClient tcpClient = null;private NetworkStream networkStream = null;private BinaryReader reader;private BinaryWriter writer;// 申明委托// 显示消息private delegate void ShowMessage(string str);private ShowMessage showMessageCallback;// 显示状态private delegate void ShowStatus(string str);private ShowStatus showStatusCallBack;// 清空消息private delegate void ResetMessage();private ResetMessage resetMessageCallBack;public frmAsyncTcpClient(){InitializeComponent();// 显示消息showMessageCallback = new ShowMessage(showMessage);// 显示状态showStatusCallBack = new ShowStatus(showStatus);// 重置消息resetMessageCallBack = new ResetMessage(resetMessage);}private void showMessage(string str){lstbxMsgView.Items.Add(tcpClient.Client.RemoteEndPoint); lstbxMsgView.Items.Add(str);lstbxMsgView.TopIndex = lstbxMsgView.Items.Count - 1;}private void showStatus(string str){toolStripStatusInfo.Text = str;}// 清空消息private void resetMessage(){tbxMsg.Text = "";tbxMsg.Focus();}private void toolStripLabel1_Click(object sender, EventArgs e) {}private void textBox5_TextChanged(object sender, EventArgs e) {}private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){}private void frmAsyncTcpClient_Load(object sender, EventArgs e){}private void tbxSendCount_TextChanged(object sender, EventArgs e){}private void label1_Click(object sender, EventArgs e){}private void lstbxMsgView_SelectedIndexChanged(object sender, EventArgs e) {}private void btnConnect_Click(object sender, EventArgs e){// 通过一个线程发起请求,多线程Thread connectThread = new Thread(ConnectToServer);connectThread.Start();}private void ConnectToServer(){try{// 调用委托statusStripInfo.Invoke(showStatusCallBack, "正在连接...");if (tbxSrvIp.Text == string.Empty || tbxPort.Text == string.Empty) {MessageBox.Show("请先输入服务器的IP地址和端口号");}IPAddress ipaddress = IPAddress.Parse(tbxSrvIp.Text);tcpClient = new TcpClient();tcpClient.Connect(ipaddress, int.Parse(tbxPort.Text));// 延时操作Thread.Sleep(1000);if (tcpClient != null){statusStripInfo.Invoke(showStatusCallBack, "连接成功");networkStream = tcpClient.GetStream();reader = new BinaryReader(networkStream);writer = new BinaryWriter(networkStream);}}catch{statusStripInfo.Invoke(showStatusCallBack, "连接失败");Thread.Sleep(1000);statusStripInfo.Invoke(showStatusCallBack, "就绪");}}private void btnReceive_Click(object sender, EventArgs e){Thread receiveThread = new Thread(receiveMessage);receiveThread.Start();}private void receiveMessage(){statusStripInfo.Invoke(showStatusCallBack, "接受中");try{string receivemessage = reader.ReadString();lstbxMsgView.Invoke(showMessageCallback, receivemessage);StreamWriter wr = new StreamWriter(@"历史记录.txt", true,System.Text.Encoding.Default);for (int i = 0; i < lstbxMsgView.Items.Count; i++){wr.Write(lstbxMsgView.Items[i].ToString() + Environment.NewLine); }wr.Close();}catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接"); }}private void btnDisconnect_Click(object sender, EventArgs e){if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){// 断开连接tcpClient.Close();}toolStripStatusInfo.Text = "断开连接";}private void btnSend_Click(object sender, EventArgs e){Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMsg.Text);}private void SendMessage(object state){statusStripInfo.Invoke(showStatusCallBack, "正在发送...");try{writer.Write(state.ToString());Thread.Sleep(5000);writer.Flush();statusStripInfo.Invoke(showStatusCallBack, "完毕");tbxMsg.Invoke(resetMessageCallBack, null);lstbxMsgView.Invoke(showMessageCallback, state.ToString()); }catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接"); }}private void btnClear_Click(object sender, EventArgs e){lstbxMsgView.Items.Clear();}private void button1_Click(object sender, EventArgs e){StreamReader file = new StreamReader(@"历史记录.txt",System.Text.Encoding.Default);string s = "";while (s != null){s = file.ReadLine();if (s != null && !s.Equals(""))lstbxMsgView.Items.Add(s);}file.Close();}}}}四、实验结果五、实验心得通过本次实验,我掌握了异步TCP通信的性质,学会了建立C#窗体程序并用socket进行tcp通讯的编程。

计算机网络实验报告3-TCP

计算机网络实验报告3-TCP

计算机网络实验报告专业:计算机科学与技术年级:班级:姓名:学号:计算机科学学院TCP协议分析1、What is the IP address and TCP port number used by the client computer (source) that is transferring the file to ? To answer this question, i t‟s probably easiest to select an HTTP message and explore the details of the TCP packet used to carry this HTTP message, using the “details of the selected packet header window” (refer to Figure 2 in the “Getting Started with Wireshark” Lab if you‟re uncertain about the Wireshark windows).2、What is the IP address of ? On what port number is it sending and receiving TCP segments for this connection?S:R:4、What is the sequence number of the TCP SYN segment that is used to initiate the TCP connection between the client computer and ? What is itin the segment that identifies the segment as a SYN segment?5、What is the sequence number of the SYNACK segment sent by to the client computer in reply to the SYN? What is the value of the ACKnowledgement field in the SYNACK segment? How did determine that value? What is it in the segment that identifies the segment as a SYNACK segment?SYNACK = ACK + Len6、What is the sequence number of the TCP segment containing the HTTP POST command? Note that in order to find the POST command, you‟ll need to dig into the packet content field at the bottom of the Wireshark window, looking for a segment with a “POST” within its DATA field.7、Consider the TCP segment containing the HTTP POST as the first segment in the TCP connection. What are the sequence numbers of the first six segments in the TCP connection (including the segment containing the HTTP POST)? At what time was each segment sent? When was the ACK for each segment received? Given the difference between when each TCP segment was sent, and when its acknowledgement was received, what is the RTT value for each of the six segments? What is the EstimatedRTT value (see page 249 in text) after thereceipt of each ACK? Assume that the value of the EstimatedRTT is equal tothe measured RTT for the first segment, and then is computed using the EstimatedRTT equation on page 249 for all subsequent segments.8、What is the length of each of the first six TCP segments?ERTT …= 0.875*ERTT + 0.125*SRTT;9、What is the minimum amount of available buffer space advertised at the receivfor the entire trace? Does the lack of receiver buffer space ever throttle the sender?NO!10、Are there any retransmitted segments in the trace file? What did you check for (in the trace) in order to answer this question?NO ! Because every sequence number of ACK are different.11、How much data does the receiver typically acknowledge in an ACK? Can you identify cases where the receiver is ACKing every other received segment (seeTable 3.2 on page 257 in the text).12、What is the throughput (bytes transferred per unit time) for the TCP connection? Explain how you calculated this value.13、Use the Time-Sequence-Graph(Stevens) plotting tool to view the sequence number versus time plot of segments being sent from the client to the server. Can you identify where TCP‟s slowstart phase beginsand ends, and where congestion avoidance takes over? Comment on ways inwhich the measured data differs from the idealized behavior of TCP that we‟ve studied in the text.。

聊天室——TCPIP原理及编程课程设计报告

聊天室——TCPIP原理及编程课程设计报告

《TCPIP原理及编程课程设计报告》课程设计报告书题目:局域网聊天室专业:网络工程班级:一班学生姓名:贺**学号: 2013**指导教师:李**完成日期: 2016年6月11日目录一、任务概述 (1)1.1设计目的 (1)1.2项目背景 (1)二、系统需求分析和概要设计 (1)2.1需求分析 (1)2.1.1服务器端工作流程 (1)2.1.2客户端工作流程 (1)2.2用例设计 (2)2.3整体框架设计 (5)2.4模块设计 (5)三、系统详细设计 (6)3.1服务器 (6)3.2客户端 (12)3.3主界面 (14)四、总结 (15)一、任务概述1.1设计目的本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,通过选择类型决定是服务器还是客户端。

服务器端功能:初始化Socket,创建服务器端,向用户发出响应命令。

客户端功能:连接服务器,消息框中输入消息,当按下“发送消息”按钮时将信息发送给服务器。

通本课题的课程设计,可以比较深入的了解和掌握Winsock 控件基本属性、方法和事件,理解网络聊天通信的概念,使用传输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。

并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。

1.2 项目背景聊天室程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序连接到服务器,就可以与在同一服务器上的用户交谈,这是一个面向连接的通信过程。

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

二、系统需求分析和概要设计2.1需求分析2.1.1服务器端工作流程服务器端通过系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行监听listen。

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

(完整)计算机网络TCP聊天室实验报告

(完整)计算机网络TCP聊天室实验报告

计算机网络原理实验报告书姓名:XXX班级:XXXXXX学号:XXXXXXXXXXXXXXXXXXXXXX二0一一年五月socket编程一、实验目的本次实验的目的是通过利用Socket编写简单的客户/服务器程序,了解TCP/IP网络的基本通信原理和编程方法,初步掌握TCP/IP网络的传输层上的编程接口(Windows Sockets API),学会利用这些接口来编写简单的网络通信软件。

二、实验内容利用socket编写简单的客户/服务器程序,比如聊天室、文件传输等。

三、实验步骤➢思路分析✧将服务器与客户端分两部分实现,采用多线程实现多个客户端与服务器端连接✧客户端建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

✧服务器端通过创建一个Socket的Arraylist数组,与指定的本地端口绑定,就可以在端口进行侦听.如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。

然后登录成功的客户就可以在服务器上聊天了.➢代码实现➢p ackage TCP_chat_room。

gui;➢➢i mport java.io。

IOException;➢➢p ublic class ClientApp {➢public static void main(String[] args){➢/**➢ * javax.swing。

UIManager$LookAndFeelInfo[Metal javax.swing。

plaf。

metal.MetalLookAndFeel]➢javax。

swing。

UIManager$LookAndFeelInfo[Nimbus com.sun。

java.swing.plaf。

nimbus.NimbusLookAndFeel]➢javax。

swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun。

实验八 基于TCP的网络聊天室的设计

实验八 基于TCP的网络聊天室的设计

实验八基于TCP的网络聊天室的设计1 实验目的(1)掌握通信规范的制定及实现。

(2)练习较复杂的网络编程,能够把协议设计思想应用到现实应用中。

2 实验内容(1)制定通信规范。

(2)设计界面如下:1 服务器端2 客户端(3)设计思路:① TCP/IP数据通信 --- “聊天”消息传输格式客户机 -→服务器(ⅰ)传输“用户名”STX+1+用户名+ETX(ⅱ)悄悄话STX+2+用户名+”,”+内容+ETX(ⅲ)对所有人说STX+3+内容+ETX服务器-→客户机(ⅰ)首次传输在线用户名STX+1+用户名+ETX(ⅱ)传输新到用户名STX+2+用户名+ETX(ⅲ)传输离线用户名STX+3+用户名+ETX(ⅳ)传输聊天数据STX+4+内容+ETX(注:STX为CHR(2),ETX 为CHR(3))②服务器端(ⅰ)定义一个动态数组存储连接用户。

定义一个全局变量存储连接用户的元素个数。

(ⅱ)用一个使用UDP协议的SOCKET套接字完成发送服务器IP地址。

在该控件的数据接收事件中发送服务器IP地址(ⅲ)用一个使用TCP协议的SOCKET套接字数组完成TCP连接及数据发送和接收,处理它的连接请求事件。

(ⅳ)SOCKET套接字的数据到达事件中首先接收数据到一个变量中,然后从这个变量中逐个提取消息,并对每个消息判断消息类型及做相应处理:case 类型1 ……传输“用户名”修改用来存储连接用户的元素个数的数组向所有在线用户发送该用户名消息向该用户发送所有在线用户名的消息case 类型2 ……悄悄话向源和目标用户发送消息case 类型3 ……对所有人说向所有在线用户发送消息(ⅴ)服务器端的断开连接事件中修改存储连接用户的元素个数的数组,卸载此控件,向所有在线用户发送消息离线。

③客户端(ⅰ)添加一个SOCKET套接字,窗体加载时使用UDP协议,发广播数据报;等待接收到服务器主机地址后使用TCP协议完成连接及数据传送。

(ⅱ)在客户端的数据到达事件中接受数据,如果客户端协议使用的是UDP协议,关闭客户端连接,重新设置客户端的协议、远程端口号、本地端口等参数,再调用连接方法请求连接,输入用户名,连接成功时发送用户名消息。

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

计算机网络原理实验报告书姓名:XXX班级:XXXXXX学号:XXXXXXXXXXXXXXXXXXXXXX二0一一年五月socket编程一、实验目的本次实验的目的是通过利用Socket编写简单的客户/服务器程序,了解TCP/IP网络的基本通信原理和编程方法,初步掌握TCP/IP网络的传输层上的编程接口(Windows Sockets API),学会利用这些接口来编写简单的网络通信软件。

二、实验内容利用socket编写简单的客户/服务器程序,比如聊天室、文件传输等。

三、实验步骤思路分析✧将服务器与客户端分两部分实现,采用多线程实现多个客户端与服务器端连接✧客户端建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

✧服务器端通过创建一个Socket的Arraylist数组,与指定的本地端口绑定,就可以在端口进行侦听。

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

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

代码实现p ackage TCP_chat_room.gui;i mport java.io.IOException;p ublic class ClientApp {public static void main(String[] args) {/*** javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel] javax.swing.UIManager$LookAndFeelInfo[Windows Classiccom.sun.java.swing.plaf.windows.WindowsClassicLookAn dFeel]* @author Administrator**/try {// 使用Nimbus皮肤UIManager.setLookAndFeel("com.sun.java.swing.plaf.ni mbus.NimbusLookAndFeel");// localhost 或127.0.0.1ClientFrame frClientFrame = newClientFrame("localhost",Server.CHAT_ROOM_PORT); frClientFrame.setConnected(true);frClientFrame.setVisible(true);// 如果登录成功if(frClientFrame.login("222")){frClientFrame.receiveMessage();}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (UnsupportedLookAndFeelException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}package TCP_chat_room.action;import java.awt.AWTException;public class ClientFrameAction extends WindowAdapter{ private ClientFrame frClientFrame;public ClientFrameAction(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}public void windowIconified(WindowEvent e) {if(SystemTray.isSupported()){final SystemTray system =SystemTray.getSystemTray();Image image = ImageManager.getImage("piScreen.gif");final String toolTip = new String("大家聊天室");final PopupMenu popup = new PopupMenu();final MenuItem miRevert = new MenuItem("Restore");final MenuItem miAddFriends = new MenuItem("AddFriends");final MenuItem miRemoveFriends = new MenuItem("Remove Friends");final MenuItem miModifyFriendsInfo = new MenuItem("Modify Friends Infomation");final MenuItem miSearch = new MenuItem("Search Friends");final MenuItem miExit = new MenuItem("Exit");popup.add(miRevert);popup.addSeparator();popup.add(miAddFriends);popup.add(miRemoveFriends);popup.add(miModifyFriendsInfo);popup.add(miSearch);popup.addSeparator();popup.add(miExit);final TrayIcon icon = newTrayIcon(image,toolTip,popup);try {system.add(icon);frClientFrame.setVisible(false);} catch (AWTException e1) {System.out.print("软件在系统通知区域显示出错");e1.printStackTrace();}miRevert.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { system.remove(icon);frClientFrame.setVisible(true);frClientFrame.setState(JFrame.NORMAL);}});miAddFriends.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { frClientFrame.setVisible(true);frClientFrame.setState(JFrame.NORMAL);}});miExit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {windowClosing(null);}});// 不知何用icon.addActionListener(miRevert.getActionListeners()[0]);}}public void windowClosing(WindowEvent e) {int result = MessageBox.showConfirmMessage("您确定要退出聊天系统吗?");if(result == JOptionPane.YES_OPTION){frClientFrame.disconnect();frClientFrame.setVisible(false);frClientFrame.dispose();// System.exit(0);}else{// do nothing}}}package TCP_chat_room.gui;import java.awt.Color;public class ClientFrame extends JFrame { private boolean connected = false;private int port;private String host;private Socket s;private DataInputStream dis;private DataOutputStream dos;public DataInputStream getDis() {return dis;}public DataOutputStream getDos() {return dos;}private final JPanel panel = new JPanel();private final JPanel pnlChatArea = new JPanel();private final ImageIcon imageSetting =ImageManager.getIcon("setting.gif");private final JLabel lblSettingImage = newJLabel(imageSetting);private final JPanel pnlSetting = new JPanel();private final JPanel pnlInputArea = new JPanel();private final JButton bnClose = new JButton("关闭");private final JButton bnSend = new JButton("发送");private final JTextArea txtChatArea = new JTextArea(6,15);private final JTextArea txtInputArea = new JTextArea(2,15);private final Dimension minDimension = new Dimension(300, 413);public boolean isConnected() {return connected;}public void setConnected(boolean connected) {this.connected = connected;}public JTextArea getTxtChatArea() {return txtChatArea;}public JTextArea getTxtInputArea() {return txtInputArea;}public ClientFrame(String host,int port) throws IOException { this.host = host;this.port = port;s = new Socket(host,port);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());initComponents();}private void initComponents() {this.setTitle("大家聊天室");this.setSize(minDimension);this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CL OSE);getContentPane().setLayout(null);panel.setBounds(0, 0, 292, 379);getContentPane().setBackground(Color.LIGHT_GRAY);getContentPane().add(panel);panel.setLayout(null);pnlChatArea.setBounds(0, 0, 292, 226);JScrollPane jspChatArea = new JScrollPane(txtChatArea);jspChatArea.setAutoscrolls(false);pnlChatArea.add(jspChatArea);panel.add(pnlChatArea);pnlChatArea.setLayout(null);txtChatArea.setLineWrap(true);txtChatArea.setEditable(false);// pnlChatArea.setBounds(10, 10, 272, 206);jspChatArea.setBounds(10, 10, 272, 206);pnlSetting.setBounds(0, 235, 292, 45);pnlSetting.add(lblSettingImage);panel.add(pnlSetting);pnlInputArea.setBounds(0, 279, 292, 67);JScrollPane jspInputArea = new JScrollPane(txtInputArea);pnlInputArea.add(jspInputArea);panel.add(pnlInputArea);pnlInputArea.setLayout(null);txtInputArea.setLineWrap(true);// pnlInputArea.setBounds(10, 10, 272, 47);jspInputArea.setBounds(10, 10, 272, 47);bnClose.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 按下关闭按钮则直接退出聊天室exitSystem();}});bnClose.setBounds(99, 356, 74, 23);panel.add(bnClose);bnSend.addActionListener(new SendActionListener(this));bnSend.setBounds(197, 356, 74, 23);bnSend.setMnemonic(0);panel.add(bnSend);this.setMinimumSize(minDimension);this.addWindowListener(new ClientFrameAction(this));// this.getRootPane().setDefaultButton(bnSend);}public boolean login(String nickname){try {dos.writeUTF("login_" + nickname);int loginResult = dis.readInt();if(loginResult == 1){System.out.println("登陆成功,欢迎进入聊天室!");return true;}else if(loginResult == -1){System.out.println("登陆失败,没有以login_开头");return false;}else if(loginResult == 2){System.out.println("登陆失败,用户昵称已经存在!");return false;}} catch (IOException e) {e.printStackTrace();}return false;}private class SendActionListener implements ActionListener{ private ClientFrame frClientFrame;public SendActionListener(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}public void actionPerformed(ActionEvent e) {String saying =frClientFrame.getTxtInputArea().getText();// System.out.println(saying);frClientFrame.getTxtInputArea().setText(null);try {frClientFrame.getDos().writeUTF(saying);frClientFrame.getDos().flush();} catch (IOException e1) {e1.printStackTrace();}}}public void exitSystem(){new ClientFrameAction(this).windowClosing(null); }public void disconnect() {try {this.setConnected(false);dos.close();dis.close();s.close();} catch (IOException e3) {e3.printStackTrace();}}public void receiveMessage(){new Thread(new ThreadreceiveMessage(this)).start();}private class ThreadreceiveMessage implements Runnable{ private ClientFrame frClientFrame;public ThreadreceiveMessage(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}String message = "";public void run() {try {while(isConnected()){message = dis.readUTF();System.out.println(message);frClientFrame.txtChatArea.append(message + "\n");Thread.sleep(100);}}catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {Thread.interrupted();}}}}package TCP_chat_room.gui;import javax.swing.JOptionPane;public class MessageBox {public static void showWarningMessage (String message) { // confirmdialog是可选是或否的对话框// JOptionPane.showConfirmDialog(null, message, "温馨提示", JOptionPane.WARNING_MESSAGE);JOptionPane.showMessageDialog(null, message, "温馨提示", JOptionPane.WARNING_MESSAGE);// JOptionPane.showMessageDialog(null, message);}public static void showErrorMessage(String message){ JOptionPane.showMessageDialog(null, message, "错误提示", JOptionPane.ERROR_MESSAGE);}public static int showConfirmMessage(String message){ return JOptionPane.showConfirmDialog(null, message, "温馨提示",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESS AGE);}}package TCP_chat_room.gui;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import .SocketException;import java.util.Collection;import java.util.Collections;import java.util.Hashtable;import java.util.Iterator;import java.util.Map;public class Server {public static final int CHAT_ROOM_PORT = 44444;private int port;private ServerSocket ss;private Socket socket;private DataInputStream dis;private DataOutputStream dos;private Map<Socket, String> clients = Collections.synchronizedMap(new Hashtable<Socket, String>());public Server(int port) throws IOException {ss = new ServerSocket(port);}public boolean containedInClients(String tempName) { Collection<String> names = clients.values();Iterator<String> it = names.iterator();while (it.hasNext()) {String existedName = it.next();if (existedName == tempName) {return true;}}return false;}// public void validataLogin() throws IOException{//// }public void start() throws IOException {while (true) {socket = ss.accept();new Thread(new ClientThread(socket)).start();}}private class ClientThread implements Runnable { private Socket client;public ClientThread(Socket client) {this.client = client;}public void run() {{try {dis = newDataInputStream(client.getInputStream());dos = newDataOutputStream(client.getOutputStream());} catch (IOException e1) {e1.printStackTrace();}try {// 处理用户的登录信息String loginMessage = dis.readUTF();String nickname = loginMessage.substring(6);if (loginMessage.startsWith("login_")) {boolean existed =containedInClients(nickname);if (existed) {dos.writeInt(2);} else { // 用户昵称还不存在,故登陆成功dos.writeInt(1);clients.put(client, loginMessage);sendToAllMessage(nickname + "进入聊天室!");String message;try {while (true) {dis = newDataInputStream(client.getInputStream());dos = newDataOutputStream(client.getOutputStream());message = dis.readUTF();if(message != null){sendToAllMessage(nickname + "说:" + message);}// dos.flush();Thread.sleep(100);}} catch (SocketException e) {// 暂时什么也不做} catch (InterruptedException e) {Thread.interrupted();}}} else {dos.writeInt(-1);}}catch (IOException e) {e.printStackTrace();} finally {try {if (dos != null) {dos.close();}if (dis != null) {dis.close();}if (client != null) {client.close();}if (ss != null) {ss.close();}} catch (IOException e) {e.printStackTrace();}}}}}public void sendToAllMessage(String message) throws IOException {Collection<Socket> sockets = clients.keySet();Iterator<Socket> it = sockets.iterator();while (it.hasNext()) {Socket s = it.next();dos = new DataOutputStream(s.getOutputStream());dos.writeUTF(message);}dos.flush();}}package TCP_chat_room.gui;import java.io.IOException;public class ServerApp {public static void main(String[] args) {try {Server server = newServer(Server.CHAT_ROOM_PORT);System.out.println("端口号为" +Server.CHAT_ROOM_PORT+ "服务器启动成功");//启动server,而server会首先验证昵称是否正确,即调用validataLogin()方法server.start();} catch (IOException e) {// System.out.println("端口正在使用中......");// System.out.println("请关闭相关程序或重新设置端口号");e.printStackTrace();}}}试验截图:首先启动服务器端:在启动客户端:启动多个客户端就可以实现聊天了:四、实验结果实现了基本的点对点的聊天,并附带一些小功能,如关闭窗口时弹出警告窗口:最小化到托盘:对最小化的图标进行操作:按exit可退出,restore可还原成用户界面五、实验心得由于时间比较紧迫,这个聊天室是比较简化的。

相关文档
最新文档