实用标准文案精彩文档实验报告学院(部):理学院班级:信计1101班学号:11411100131姓名:杨宠实验课程C#程序设计实验名称利用同步TCP编写网络聊天程序指导老师江力实验性质(选修、必修)必修实验类型(验证、设计、创新、综合)验证实验课时4课时实验日期、时间2013-9-182013-10-09实验消耗材料PC机实验仪器设备(实验硬件要求)计算机一台,Visualstadio2010实验目的掌握C#的同步TCP应用编程方法。实验内容(实验原理、可用的理论知识、算法、程序、步骤和方法)一、实验内容同步TCP服务器端应用编程与客户端应用编程。二、实验基本原理利用TcpListener类、TcpClient类、Socket类提供的方法进行同步TCP应用编程。三、注意事项BinaryReader,BinaryWriter类的应用,及TCP类及协议的一些知识运用。四、实验步骤1、同步TCP服务器端应用编程:网络聊天服务器;2、同步TCP客户端应用编程:网络聊天客户端。1.服务器端编程:(1)创建一个名为SyncChatServer的Windows应用程序,将Form1.cs换名为MainForm.cs,设计界面如下图所示:实用标准文案精彩文档(2)在解决方案资源管理器中,添加一个名为User.cs的文件,用于保存与客户通信需要的信息,代码如下:usingSystem.Net.Sockets;usingSystem.IO;namespaceSyncChatServer{classUser{publicTcpClientclient;//{get;privateset;}publicBinaryReaderbr;//{get;privateset;}publicBinaryWriterbw;//{get;privateset;}publicstringuserName;//{get;set;}publicUser(TcpClientclient){this.client=client;NetworkStreamnetworkStream=client.GetStream();br=newBinaryReader(networkStream);bw=newBinaryWriter(networkStream);}publicvoidClose(){br.Close();bw.Close();client.Close();}实用标准文案精彩文档}}(3)在MainForm中添加对应的代码和事件:usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;//添加的命名空间引用usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;namespaceSyncChatServer{publicpartialclassMainForm:Form{///
保存连接的所有用户privateList
userList=newList();///使用的本机IP地址IPAddresslocalAddress;///监听端口privateconstintport=51888;privateTcpListenermyListener;///是否正常退出所有接收线程boolisNormalExit=false;publicMainForm(){InitializeComponent();listBoxStatus.HorizontalScrollbar=true;IPAddress[]addrIP=Dns.GetHostAddresses(Dns.GetHostName());localAddress=addrIP[0];buttonStop.Enabled=false;}///【开始监听】按钮的Click事件privatevoidbuttonStart_Click(objectsender,EventArgse){myListener=newTcpListener(localAddress,port);myListener.Start();AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接",localAddress,port));//创建一个线程监听客户端连接请求ThreadmyThread=newThread(ListenClientConnect);myThread.Start();buttonStart.Enabled=false;实用标准文案精彩文档buttonStop.Enabled=true;}///接收客户端连接privatevoidListenClientConnect(){TcpClientnewClient=null;while(true){try{newClient=myListener.AcceptTcpClient();}catch{//当单击“停止监听”或者退出此窗体时AcceptTcpClient()会产生异常//因此可以利用此异常退出循环break;}//每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息Useruser=newUser(newClient);ThreadthreadReceive=newThread(ReceiveData);threadReceive.Start(user);userList.Add(user);AddItemToListBox(string.Format("[{0}]进入",newClient.Client.RemoteEndPoint));AddItemToListBox(string.Format("当前连接用户数:{0}",userList.Count));}}//////处理接收的客户端数据//////客户端信息privatevoidReceiveData(objectuserState){Useruser=(User)userState;TcpC...