利用C#进行socket编程(模拟服务器和客户端通信)

制作网络游戏难免需要使用socket,利用socket可以实现客户端和服务器的数据交换。服务器需要绑定特点IP地址和端口号,而客户端访问服务器也需要连接到服务器的IP和服务器相应的端口号。每台计算机(可以看作服务器)都有唯一的一组IP,正常情况下端口号(0-60000)是软件之间在进行数据交流的唯一通道。

以下有一个简单的服务器端和一个客户端,大致解释了服务器向客户端发送消息的过程:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Socket编程_TCP服务器端
{
    class Program
    {
        static void Main(string[] args)
        {
            //1,创建socket             using System.Net.Sockets;
            //AddressFamily.InterNetwork内网,SocketType.Stream以流来通信,第三个为协议
            Socket tcpSever = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //2,绑定服务器IP(计算机唯一标识)和端口号。端口号将通信数据给指定的软件。一个软件占用一个特定端口号(0-60000)
            //查看本机IP:cmd-》ipconfig  本机局域网IP:198.168.1.2 
            //IPAddress ipAddress = new IPAddress(new byte[] { 192,168,1,2});
            EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.1.2"),7788);//IPEndPoint是对IP+端口号的一层封装
            tcpSever.Bind(point);//向操作系统申请一个可用的IP和端口号做通信。绑定当前IP和端口号

            //3.监听。等待客户端连接
            tcpSever.Listen(100);//参数是最大连接数
            Socket clientSocket= tcpSever.Accept();//暂停当前线程,直到一个客户端连接过来,之后进行下面的代码。返回的socket为客户端socket

            //使用返回的socket跟客户端做通信
            string message = "welcome!";
            byte[] meg= Encoding.UTF8.GetBytes(message);//对字符串编码,得带一个字节数组
            clientSocket.Send(meg);

            //接受客户端数据
            byte[] buffer = new byte[1024];
             int length= clientSocket.Receive(buffer);//接受客户端数据
            string mes = Encoding.UTF8.GetString(buffer, 0, length);
            Console.WriteLine(mes);

            tcpSever.Close();
            Console.ReadKey();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Socket_客户端_TCP
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建socket
            Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //发起连接请求
            EndPoint remoteIp = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 7788);
            tcpClient.Connect(remoteIp);//连接远程已经绑定IP和端口号的服务器端。已连接远程主机。

            //从远程主机接受数据并显示在客户端
            byte[] buffer = new byte[1024];
            int byteNum= tcpClient.Receive(buffer);//将接受到的数据,存入buffer。返回值为接受到的字节数
            string message= Encoding.UTF8.GetString(buffer,0,byteNum);//将接受到的数据,转化为字符串
            Console.WriteLine(message);

            //发送给服务器
            string clientToSeverMes = "客户端:你好,服务器!";
            byte[] cts = Encoding.UTF8.GetBytes(clientToSeverMes);
            tcpClient.SendTo(cts, remoteIp);

            Console.ReadKey();
        }
    }
}

你可能感兴趣的:(Socket网络编程)