C# Socket网络编程

发布时间 2023-10-31 09:39:29作者: 时而有风

入门级C# Socket编程实现

只要知道要通信的两台主机的IP地址和进程的端口号,然后可以用Socket让这两个进程进行通信。

在本机上运行服务端和客户端,ip为127.0.0.1,使用端口9050(0~1023的端口号通常用于一些比较知名的网络服务和应用,普通网络应用程序则应该使用1024以上的端口号,以避免该端口号被另一个应用或系统服务使用)。

服务端:

var ip   = "127.0.0.1";
var port = 9050;
//第一步:建立一个用于通信的Socket对象
//参数1:指定该IP对应的协议,此为IPv4;参数2:定义要打开的Socket的类型;参数3:向Windows Sockets API通知所请求的协议
var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//第二步:使用bind绑定IP地址和端口号,IPEndPoint内参数为IPAddress的long类型和端口号
var ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
serverSocket.Bind(ipEndPoint);

//第三步:使用listen监听客户端,参数为指定侦听队列的容量
serverSocket.Listen(10);

//第四步:使用accept中断程序直到连接上客户端,(接收连接并返回一个新的Socket,Accept会中断程序,直到有客户端连接)
Console.WriteLine("等待客户端连接...");
var socket   = serverSocket.Accept();
var socketip = (IPEndPoint) socket.RemoteEndPoint;
Console.WriteLine($"连接成功! ip:{socketip.Address}  端口:{socketip.Port}");

//第五步:接收来自客户端的请求,用死循环来不断的从客户端获取信息
while (true)
{
    var receiveBytes = new byte[1024];
    var receive      = socket.Receive(receiveBytes);
    if (receive == 0 || Encoding.UTF8.GetString(receiveBytes, 0, receive) == "exit") //当信息长度为0或收到exit,说明客户端连接断开
    {
        break;
    }

    Console.WriteLine(Encoding.UTF8.GetString(receiveBytes, 0, receive)); //将指定字节数组中的一个字节序列解码为一个字符串
}

//第六步:返回客户端的数据
var send = new byte[1024];
send = Encoding.UTF8.GetBytes("服务端已关闭!");
socket.Send(send);

//第七步:如果接收到客户端已关闭连接信息就关闭服务器端,并返回信息
serverSocket.Close();
socket.Close();
Console.WriteLine("服务端关闭...");

客户端:

var ip   = "127.0.0.1";
var port = 9050;
//第一步:建立一个用于通信的Socket对象
var ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//第二步:根据指定的IP和端口连接服务器
//IPAddress:包含了一个IP地址;IPEndPoint:包含了一对IP地址(IPAdress类型)和端口号
var ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
ClientSocket.Connect(ipEndPoint);

//第三步:连接成功后向服务器端发送数据请求
while (true)
{
    var send = new byte[1024];
    Console.WriteLine("请输入要发送的数据:");
    var str = Console.ReadLine();
    send = Encoding.UTF8.GetBytes(str);
    ClientSocket.Send(send);
    if (str == "exit")
    {
        Console.WriteLine("已退出...");
        break;
    }

    Console.WriteLine("发送成功!" + "\n");
}

//第四步:接收服务器返回的请求数据
var receiveBytes = new byte[1024];
var receive      = ClientSocket.Receive(receiveBytes);
Console.WriteLine(Encoding.UTF8.GetString(receiveBytes, 0, receive));

//第五步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信息
ClientSocket.Close();

通讯: