C#已经为我们封装了简单易用的Socket,在这基础上更封装了TcpListener,TcpClient,UdpClient这三个类。这里就是用四个类来实现最简单的TCP和UDP。

1.Socket TCP

(1)服务端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Program
    {
       /*
    1:建立一个Socket对像;

    2:用socket对像的Bind()方法绑定EndPoint;

    3:用socket对像的Listen()方法开始监听;

    4:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;

    5:用新的socket对象接收(Receive)和发送(Send)消息。
     */
        static void Main(string[] args)
        {
            //1.                              寻址方案               套接字类型           协议类型

            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //2.
           
            IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
            EndPoint endpoint = new IPEndPoint(ipaddress, 8888);     //向操作系统申请一份可用的ip和端口号
            tcpServer.Bind(endpoint);


            //3.

            tcpServer.Listen(100);              //能同时接收100个客户端的请求
            Console.WriteLine("服务器启动完成");
            Socket clientSocket = tcpServer.Accept();  //暂停当前线程,直到一个客户端连接过来,返回Socket对象 
            Console.WriteLine("接收到客户端的连接请求");

            //4.

            string message = "Hello Client";
            var data = Encoding.UTF8.GetBytes(message);   //将字符串转成字节数组
            clientSocket.Send(data);
            Console.WriteLine("我向客户端发送了一条消息:" + message);

            byte[] data2 = new byte[1024];            //存放数组的容器
            int length = clientSocket.Receive(data2);
            string message2 = Encoding.UTF8.GetString(data2, 0, length);
            Console.WriteLine("我接收到客户端发来的消息:" + message2);
            Console.ReadKey();
        }
    }

(2)客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
1:建立一个Socket对像;

2:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;

3:如果连接成功,就用socket对像的Send()方法向服务器发送信息;

4:用socket对像的Receive()方法接受服务器发来的信息 ;

5:通信结束后一定记得关闭socket;
*/
   class Program
   {  
       
      
      static void Main(string[] args)
      {
            Socket tcpClient;
            string serverIP = "127.0.0.1";
            int serverPort = 8888;
          //1.
            try {
                  tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 寻址方案               套接字类型           协议类型
 

                  //2.

                  IPAddress ipaddress = IPAddress.Parse(serverIP);
                  EndPoint endpoint = new IPEndPoint(ipaddress, serverPort);
                  tcpClient.Connect(endpoint);//发送连接请求
                  Console.WriteLine("请求服务器连接");

                  //3.

                  byte[] data = new byte[1024];
                  int length = tcpClient.Receive(data);
                  var message = Encoding.UTF8.GetString(data, 0, length);
                  Console.WriteLine("我接收到服务器发来的消息:" + message);

                  //4.

                  string message2 = "这是我向服务器发送的消息";
                  tcpClient.Send(Encoding.UTF8.GetBytes(message2));
                  Console.WriteLine("我向服务器发送消息:" + message2);
                  Console.ReadKey();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                Console.ReadKey();
            }
      }
    }

2.Socket UDP

(1)服务端(接收端)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  class Program
    {
        static void Main(string[] args)
        {
            //1.                                        寻址方案               套接字类型           协议类型    SocketType.Dgram,无连接。协议UDP。
            Socket udpserver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            //2.绑定IP 端口
            IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
            EndPoint endpoint = new IPEndPoint(ipaddress, 8888);
            udpserver.Bind(endpoint);

            //3.不用监听,直接接收

            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);       
            byte[] data = new byte[1024];
            while (true) { 
            int length = udpserver.ReceiveFrom(data, ref remoteEndPoint);     

            string message = Encoding.UTF8.GetString(data, 0, length);
            Console.WriteLine("服务器接收到客户端发来的消息:" + message);
            }
            udpserver.Close();
            Console.ReadKey();
        }

    }

(2)客户端(发送端)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 class Program
    {
        static void Main(string[] args)
        {
            //1.
            Socket udpclient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            //2.

            IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
            EndPoint serverpoint = new IPEndPoint(ipaddress, 8888);
            while (true) {
            string message = Console.ReadLine();
            byte[] data = Encoding.UTF8.GetBytes(message);
            udpclient.SendTo(data, serverpoint);//直接发送,不用连接
            }
            Console.ReadKey();
        }
    }

这里就可以很直观的看出TCP和UDP的区别了,TCP需要建立连接后再传输数据。而UDP则不需要连接,只是向地址发送数据。

3.TcpListener/TcpClient TCP

(1)服务端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
   class Program
    {
        static void Main(string[] args)
        {
            //1.TcpListener对Socket进行封装,会自己创建一个Socket对象
            TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
            try
            {
                //2.开始监听
                tcpListener.Start();
                //3.等待连接
                TcpClient tcpClient = tcpListener.AcceptTcpClient();
                //4.获取客户端发送的数据
                NetworkStream ns = tcpClient.GetStream();
                while (true)
                {
                    byte[] date = new byte[1024];
                    int length = ns.Read(date,0,1024);
                    string message = Encoding.UTF8.GetString(date, 0, length);
                    Console.WriteLine("收到信息: "+message);
                    if (message == "stop") break;
                }
                ns.Close();
                tcpClient.Close();
                tcpListener.Stop();
                Console.ReadLine();

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

        }
    }

(2)客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static class Online
    {
        public static bool IsOnline(this TcpClient c)//该函数用来判断远程主机是否关闭连接
        {
            return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
        }
    }
       
    class Program
    {
    
        static void Main(string[] args)
        {
            try {
            TcpClient tcpClient = new TcpClient("127.0.0.1", 8888);//和远程主机建立连接
            NetworkStream ns = tcpClient.GetStream();//通过网络流来传输数据
            {
                while (Online.IsOnline(tcpClient))
                {
                    string message = Console.ReadLine();
                    byte[] date = new byte[1024];
                    date = Encoding.UTF8.GetBytes(message);
                    ns.Write(date, 0, date.Length);
                }
                Console.WriteLine("断开连接");
                ns.Close();
                tcpClient.Close();
            }
            Console.ReadLine();
        }catch(Exception e){
            Console.WriteLine(e);
            Console.ReadLine();
        }
        }
    }

4.UdpClient UDP

(1)服务端(接收端)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
  class Program
    {
        static void Main(string[] args)
        {
            UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"),8888));//绑定本机IP端口
            try { 
            while(true)
            {
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = udpClient.Receive(ref ipEndPoint);
                string message = Encoding.UTF8.GetString(data, 0, data.Length);
                Console.WriteLine("收到信息:" + message);
   
            }
            }
            catch (Exception e)
            {
                udpClient.Close();
            }
           
        }
    }

(2)客户端(发送端)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    class Program
    {
        static void Main(string[] args)
        {
             UdpClient udpClient = new UdpClient();
             try
             {
                 while (true)
                 {
                     //发送数据
                     string message = Console.ReadLine();
                     byte[] data = Encoding.UTF8.GetBytes(message);
                     IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127
                     0.0.1"), 8888);
                     udpClient.Send(data, data.Length, ipEndPoint);
                 }

             }
             catch (Exception e)
             {
                 Console.WriteLine(e);
                 udpClient.
            }
        }
    }