基于TCP的编程实例_第1页
基于TCP的编程实例_第2页
基于TCP的编程实例_第3页
基于TCP的编程实例_第4页
基于TCP的编程实例_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于基于TCPTCP的编程实例的编程实例HJK目 录基本概念 李凯飞基本操作 马方洲异步字符串传输 史国良图形化编程 胡金坤同步字符串传输 章炜HJK问答和小结 童志祥字符编码和文本边界 周旋一、基础概念TCPTCP协议协议 TCP是面向连接的,它的意思是说两个远程主机(或者叫进程,因为实际上远程通信是进程之间的通信,而进程则是运行中的程序),必须首先进行一个握手过程,确认连接成功,之后才能传输实际的数据。特点特点一、基础概念SocketSocket 在应用程序中我们用接口来分离实现,在应用层和传输层之间,则是使用套接字来进行分离。它就像传输层为应用层开的一个小口,应用程序通过这个小口向远程发

2、送数据,或者接收远程发来的数据一、基础概念SocketSocket封装封装 TcpListener用于接受连接请求,而TcpClient则用于接收和发送流数据。 这幅图的意思是TcpListener持续地保持对端口的侦听,一旦收到一个连接请求后,就可以获得一个TcpClient对象,而对于数据的发送和接收都有TcpClient去完成。此时,TcpListener并没有停止工作,它始终持续地保持对端口的侦听状态。二、基本操作 using System.Net; /引入两个命名空间 using System.Net.Sockets; IPAddress ip = new IPAddress(new

3、 byte 127, 0, 0, 1 ); /转换IP地址格式 TcpListener listener = new TcpListener(ip, 8500); /实例化 listener.Start(); / 开始侦听 Console.WriteLine(Start Listening .); / 获得IPAddress对象的另外几种常用方法: IPAddress ip = IPAddress.Parse(); IPAddress ip = Dns.GetHostEntry(localhost).AddressList0;1.服务器端对端口的侦听Server关键代码二、基

4、本操作1.服务器端对端口的侦听运行结果二、基本操作 Console.WriteLine(Client Running .); TcpClient client = new TcpClient(); try client.Connect(localhost, 8500); / 与服务器连接 catch (Exception ex) Console.WriteLine(ex.Message); return;/ 打印连接到的服务端信息Console.WriteLine(Server Connected!0 - 1, client.Client.LocalEndPoint, client.Clien

5、t.RemoteEndPoint);2.1客户端连接到服务器Client关键代码二、基本操作2.1客户端连接到服务器运行结果服务器客户端连接状态二、基本操作 IPAddress ip = new IPAddress(new byte 127, 0, 0, 1 ); /转换IP地址格式 TcpListener listener = new TcpListener(ip, 8500); /实例化 listener.Start(); / 开始侦听 Console.WriteLine(Start Listening .); / 获取一个连接,中断方法 TcpClient remoteClient =

6、listener.AcceptTcpClient(); / 打印连接的客户端信息 Console.WriteLine(Client Connected!0 - 1, remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);2.2服务端获取客户端连接Server关键代码二、基本操作2.2服务端获取客户端连接运行结果服务器客户端连接状态二、基本操作 TcpClient client; for (int i = 0; i 1, client.Client.LocalEndPoint, client.Client.R

7、emoteEndPoint);3.1多客户端连接服务器Client关键代码二、基本操作 IPAddress ip = new IPAddress(new byte 127, 0, 0, 1 ); /转换IP地址格式 TcpListener listener = new TcpListener(ip, 8500); /实例化 listener.Start(); / 开始侦听 Console.WriteLine(Start Listening .); while (true) / 增加循环 / 获取一个连接,同步方法 TcpClient remoteClient = listener.Accept

8、TcpClient(); / 打印连接到的客户端信息 Console.WriteLine(Client Connected!0 Server); NetworkStream streamToServer = client.GetStream(); byte buffer = Encoding.Unicode.GetBytes(msg); / 获得缓存 streamToServer.Write(buffer, 0, buffer.Length); / 发往服务器 Console.WriteLine(Sent: 0, msg);1.1客户端发送,服务端接收并输出Client关键代码三、同步字符串传

9、输 const int BufferSize = 8192; / 缓存大小,8192字节 /*省略用于连接的代码*/ / 获得流,并写入buffer中 NetworkStream streamToClient = remoteClient.GetStream(); byte buffer = new byteBufferSize; int bytesRead = streamToClient.Read(buffer, 0, BufferSize); Console.WriteLine(Reading data, 0 bytes ., bytesRead); / 获得请求的字符串 string

10、msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); Console.WriteLine(Received: 0, msg);1.2客户端发送,服务端接收并输出Server关键代码1.客户端发送,服务端接收并输出运行结果服务器客户端三、同步字符串传输三、同步字符串传输 ConsoleKey key; const int BufferSize = 8192; /*省略用于连接的代码*/ NetworkStream streamToServer = client.GetStream();/*省略外层循环*/ Console.Write(In

11、put the message: ); string msg = Console.ReadLine(); / 获取输入的字符串 byte buffer = Encoding.Unicode.GetBytes(msg); / 获得缓存 try lock (streamToServer) streamToServer.Write(buffer, 0, buffer.Length); / 发往服务器 Console.WriteLine(Sent: 0, msg); int bytesRead; buffer = new byteBufferSize; lock (streamToServer) by

12、tesRead = streamToServer.Read(buffer, 0, BufferSize); msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); Console.WriteLine(“Received: 0”, msg); / 输出来自服务器的消息 catch (Exception ex) Console.WriteLine(ex.Message); break;2.1服务端回发,客户端接收并输出Client关键代码三、同步字符串传输 const int BufferSize = 8192; / 缓存大小,8192Byt

13、es/*省略用于连接的代码*/ NetworkStream streamToClient = remoteClient.GetStream(); / 获得流/*省略外层循环*/ byte buffer = new byteBufferSize; int bytesRead; try / 写入buffer中 lock(streamToClient) bytesRead = streamToClient.Read(buffer, 0, BufferSize); if (bytesRead = 0) throw new Exception(读取到0字节); Console.WriteLine(Rea

14、ding data, 0 bytes ., bytesRead); string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); / 获得请求的字符串 Console.WriteLine(Received: 0, msg); msg = msg.ToUpper(); / 转换成大写并发送 buffer = Encoding.Unicode.GetBytes(msg); lock(streamToClient) streamToClient.Write(buffer, 0, buffer.Length); Console.Write

15、Line(Sent: 0, msg); catch (Exception ex) Console.WriteLine(ex.Message); break; 2.2服务端回发,客户端接收并输出Server关键代码2.服务端回发,客户端接收并输出运行结果服务器客户端三、同步字符串传输四、异步字符串传输 public class ServerClient /*省略用于连接和发送的代码*/ private void ReadComplete(IAsyncResult ar) int bytesRead; try lock (streamToServer) bytesRead = streamToSe

16、rver.EndRead(ar); if (bytesRead = 0) throw new Exception(读取到0字节); string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); Console.WriteLine(Received: 0, msg); Array.Clear(buffer, 0, buffer.Length); / 清空缓存,避免重读 lock (streamToServer) AsyncCallback callBack = new AsyncCallback(ReadComplete); str

17、eamToServer.BeginRead(buffer, 0, BufferSize, callBack, null); catch (Exception ex) /*省略报错代码*/ 客户端ServerClient类的封装关键代码四、异步字符串传输public class RemoteClient /*省略用于连接和发送的代码*/ private void ReadComplete(IAsyncResult ar) int bytesRead = 0; try lock (streamToClient) bytesRead = streamToClient.EndRead(ar); if

18、(bytesRead = 0) throw new Exception(读取到0字节); string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); Array.Clear(buffer, 0, buffer.Length); / 清空缓存,避免重读 string msgArray = handler.GetActualString(msg); / 获取实际的字符串 foreach (string m in msgArray) / 遍历获得到的字符串 /*省略将得到的字符串改为大写并重新发送的代码*/ lock (streamT

19、oClient) / 再次调用BeginRead(),完成时调用自身,形成无限循环 AsyncCallback callBack = new AsyncCallback(ReadComplete); streamToClient.BeginRead(buffer, 0, BufferSize, callBack, null); catch (Exception ex) /*省略捕获异常代码*/服务器类RemoteClient的封装关键代码异步字符串传输运行结果服务器客户端四、异步字符串传输五、字符编码和文本边界中英文字符在中英文字符在ASCIIASCII、UTF8UTF8、UncicodeUn

20、cicode编码下的区别编码下的区别 ASCII不能保存中文。 UTF8是变长编码。在对ASCII字符编码时,UTF8更省空间,只占1个字节,与ASCII编码方式和长度相同;Unicode在对ASCII字符编码时,占用2个字节,且第2个字节补零。 UTF8在对中文编码时需要占用3个字节;Unicode对中文编码则只需要2个字节。存在的问题存在的问题 客户端分两次向流中写入数据(比如字符串)时,我们主观上将这两次写入视为两次请求;然而服务端有可能将这两次合起来视为一条请求,这在两个请求间隔时间比较短的情况下尤其如此。同样,也有可能客户端发出一条请求,但是服务端将其视为两条请求处理。五、字符编码和

21、文本边界五、字符编码和文本边界解决的办法解决的办法自定义一个协议:在发送数据时,前面加上length=XXX:其中xxx是实际发送的字符串长度(就像HTTP的头)。如果length的值等于接收到的字符串长度则说明数据完整,不等于则根据length的值截取。六、图形化编程WPFWPF简介简介 Windows Presentation Foundation (WPF) 是下一代显示系统,用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序。 使用可扩展应用程序标记语言 (XAML) 标记实现应用程序的外观,而使用托管编程语言(代码隐藏)实现其行为,从而真正实现功能和样式分离 几年前的QQ概念版即采用了这种技术,界面效果非常炫酷 缺点:开发时要用到庞大的IDE和设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论