C# socket编程第二篇
时间:2011-05-05 来源:comeonfyz
既然有了方向,确定了方案就要一步一步的执行方案。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;先运行服务端,再运行客户端,否则会报错。通信实现了,下面我们要做的就是在这基础上完善我们的程序,我们的最终目的是用socket来传输文件。
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();
}
}
}
相关阅读 更多 +