C# socket编程第二篇

     既然有了方向,确定了方案就要一步一步的执行方案。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/p/2037794.html