C# socket编程第二篇

it2024-08-03  56

     既然有了方向,确定了方案就要一步一步的执行方案。socket+udp通信要考虑的问题很多,比如大文件传输的时候如何分包,如何校验,如何判断是否丢包,丢包后从发,如何保证文件的完整性等等一系列问题。

      在考虑这些问题的最开始,我们要解决的实现SOCKET通信,如果通信都不能实现,又谈何程序的完整性。这贴一个socket+Udp的demo。新建两个控制台应用程序,一个是服务端,一个是客户端。模拟客服端和服务端通信

服务端 using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Bose.XueLeCN.COM.FileReceiveControl{ class Program { static void Main( string [] args) { int recv; byte [] data = new byte [ 1024 ]; // 构建TCP 服务器 // 得到本机IP,设置TCP端口号 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001 ); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // 绑定网络地址 newsock.Bind(ipep); Console.WriteLine( " This is a Server, host name is {0} " , Dns.GetHostName()); // 等待客户机连接 Console.WriteLine( " Waiting for a client " ); // 得到客户机IP IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0 ); EndPoint Remote = (EndPoint)(sender); recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine( " Message received from {0}: " , Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0 , recv)); // 客户机连接成功后,发送欢迎信息 string welcome = " Welcome ! " ; // 字符串与字节数组相互转换 data = Encoding.ASCII.GetBytes(welcome); // 发送信息 newsock.SendTo(data, data.Length, SocketFlags.None, Remote); while ( true ) { data = new byte [ 1024 ]; // 发送接受信息 recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine(Encoding.ASCII.GetString(data, 0 , recv)); newsock.SendTo(data, recv, SocketFlags.None, Remote); } } }} 客户端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace FileDistributeControl{ class Program { static void Main( string [] args) { byte [] data = new byte [ 1024 ]; string input, stringData; // 构建TCP 服务器 Console.WriteLine( " This is a Client, host name is {0} " , Dns.GetHostName()); // 设置服务IP,设置TCP端口号 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse( " 127.0.0.1 " ), 8001 ); // 定义网络类型,数据连接类型和网络协议UDP Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = " Hello! " ; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0 ); EndPoint Remote = (EndPoint)sender; data = new byte [ 1024 ]; // 对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制 // server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100); int recv = server.ReceiveFrom(data, ref Remote); Console.WriteLine( " Message received from {0}: " , Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0 , recv)); while ( true ) { input = Console.ReadLine(); if (input == " exit " ) break ; server.SendTo(Encoding.ASCII.GetBytes(input), Remote); data = new byte [ 1024 ]; recv = server.ReceiveFrom(data, ref Remote); stringData = Encoding.ASCII.GetString(data, 0 , recv); Console.WriteLine(stringData); } Console.WriteLine( " Stopping Client. " ); server.Close(); } }} 先运行服务端,再运行客户端,否则会报错。通信实现了,下面我们要做的就是在这基础上完善我们的程序,我们的最终目的是用socket来传输文件。

转载于:https://www.cnblogs.com/_fyz/archive/2011/05/05/2037794.html

最新回复(0)