C#基于TCP的客户端服务器通信

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《高级网络程序设计》课程设计报告题目基于TCP的局域网即时消息系统的客户端和服务器端的设计与实现学号姓名计算机网络工程教研室2016年01月11日I目录一、课程设计内容………………………………………..2二、设计目的……………………………………………..2三、设计步骤……………………………………………..2四、具体要求………………………………………….....3五、实验代码…………………………………………….3六、实验结果……………………………………..……20七、参考文献……………………………………..……22八、实验心得……………………………………..……22天津科技大学计算机学院《高级网络程序设计》课程设计1一、课程设计内容1.Winsock的启动与终止。2.Winsock的创建及绑定和关闭。3.建立通信连接listen及accept和connect。4.数据的传输。5.简单的客户机/服务器之间的通信。二、设计目的1.熟悉WindowsSocket的常用函数的形式和使用方法,理解数据通信的过程。2.掌握如何利用C#进行TCP协议开发,完成基于TCP的局域网即时消息系统的客户端和服务器端的设计与实现。三、设计步骤在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。该模式的建立基于以下两点:(1)非对等作用;(2)通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:1、首先服务器方要先启动,并根据请示提供相应服务,其过程如下:(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。(2)等待客户请求到达该端口。(3)接收到重复服务请求,处理该请求并发送应答信号。(4)返回第二步,等待另一客户请求(5)关闭服务器。2、客户方:(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求……(3)请求结束后关闭通信通道并终止。3、TCP连接的套接字的系统调用时序图如图2.1所示。4、TCP连接的应用程序流程图如图2.2所示。2图2.1TCP连接的套接字的系统调用时序图图2.2TCP连接的应用程序流程图3四、具体要求需要有基本的双人、多人文字聊天功能,上下线通知,在线用户列表,点对点文件传输,所有的文字或文件传输需支持CRC-32校验,具有出错重传机制;五、实验代码(1)客户机:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceSocketClient{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}Socket_socketSend;privatevoidbtnStart_Click(objectsender,EventArgse){//创建负责通信的Socket:if(_socketSend==null||_socketSend.Connected==false){_socketSend=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddressip=IPAddress.Parse(txtServer.Text);IPEndPointpoint=newIPEndPoint(ip,Convert.ToInt32(txtPoint.Text));SocketAsyncEventArgssocketE=newSocketAsyncEventArgs();socketE.Completed+=socketE_Completed;4socketE.RemoteEndPoint=point;try{_socketSend.ConnectAsync(socketE);}catch(SocketException){}}else{ShowMsg(系统提示:,已经连接到服务器:+_socketSend.RemoteEndPoint.ToString()+请重新连接!);}}voidsocketE_Completed(objectsender,SocketAsyncEventArgse){SocketacceptSocket=e.ConnectSocket;if(acceptSocket==null){ShowMsg(系统提示:,向+e.RemoteEndPoint.ToString()+的连接建立失败!);return;}stringendPoint=acceptSocket.RemoteEndPoint.ToString();ShowMsg(系统提示:,向+endPoint+的连接成功建立!);while(true){//客户端连接成功后,客户端应该接受服务器发来的消息byte[]buffer=newbyte[1024*1024*2];//实际接受到的有效字节数intr=0;try{r=acceptSocket.Receive(buffer);}catch(SocketException){r=0;}if(r==0)5{if(acceptSocket.Connected){ShowMsg(系统提示:,向+endPoint+的连接断开!);acceptSocket.Close();}break;}//如果发送的数据是文字(标识0)if(buffer[0]==0){stringstr=Encoding.UTF8.GetString(buffer,1,r-1);ShowMsg(endPoint+:,str);}elseif(buffer[0]==1){stringfileName=Encoding.UTF8.GetString(buffer,17,1000).Trim('\0');SingleObject.GetSingle().LastSendedFile=Path.GetTempFileName();using(FileStreamfsWrite=newFileStream(SingleObject.GetSingle().LastSendedFile,FileMode.OpenOrCreate,FileAccess.Write)){fsWrite.Write(buffer,0,r);}ShowMsg(endPoint+:,给你发送了文件:+fileName);}elseif(buffer[0]==2){SingleObject.GetSingle().IsMove=true;}else{ShowMsg(系统消息:,无法识别“+endPoint+”发送来的消息类型!);}}}privatevoidReceived(){6this.Activate();}privatevoidMoveForm(){Received();Randomr=newRandom();Pointlocation=this.Location;DateTimetime=DateTime.Now;while((DateTime.Now-time)TimeSpan.FromSeconds(1.5)){PointnextPoint=newPoint(location.X+r.Next(-10,11),location.Y+r.Next(-10,11));this.Location=nextPoint;System.Threading.Thread.Sleep(10);}this.Location=location;}privatevoidbtnSendMsg_Click(objectsender,EventArgse){if(_socketSend==null||_socketSend.Connected==false){ShowMsg(系统提示:,请先连接服务器,再发送消息!);return;}stringendPoint=_socketSend.RemoteEndPoint.ToString();byte[]basicBuffer=Encoding.UTF8.GetBytes(txtMsg.Text);Listbytelist=newListbyte(basicBuffer.Length+1);list.Add(0);list.AddRange(basicBuffer);byte[]buffer=list.ToArray();list=null;try{_socketSend.Send(buffer);ShowMsg(向+endPoint+发送:,txtMsg.Text);}catch(SocketException){}txtMsg.Clear();}7privatevoidShowMsg(stringsender,stringmsg){stringtime=DateTime.Now.ToString(hh:mm:ss);SingleObject.GetSingle().LogString.AppendLine(time++sender);SingleObject.GetSingle().LogString.AppendLine(msg);SingleObject.GetSingle().LogString.AppendLine();}privatevoidtimerChange_Tick(objectsender,EventArgse){lblTime.Text=DateTime.Now.ToString();//txtLog的数据if(!txtLogUserChange&&!(txtLog.Text==SingleObject.GetSingle().LogString.ToString())){txtLogAutoChange=true;txtLog.Text=SingleObject.GetSingle().LogString.ToString();txtLogAutoChange=false;}//是否震动if(SingleObject.GetSingle().IsMove){MoveForm();SingleObject.GetSingle().IsMove=false;}}booltxtLogUserChange=false,txtLogAutoChange=false;privatevoidtxtLog_TextChanged(objectsender,EventArgse){if(txtLogAutoChange)return;txtLogUserChange=true;}privatevoidbtnClose_Click(objectsender,EventArgse){if(_socketSend!=null||_socketSend.Connected==true){ShowMsg(系统提示:,服务器已经断开或未连接!);return;}try{8ShowMsg(系统提示:,向+_socketSend.RemoteEndPoint.ToString()+的连接断开!);_socketSend.Close();}catch(SocketException){}}privatevoidbtnMoveForm_Click(objectsender,EventArgse){if(_socketSend==null||_socketSen

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功