当前位置:   article > 正文

socket服务器端和客户端通信——基础篇_socket服务端向客户端发送数据

socket服务端向客户端发送数据

        制作游戏自然离不开网络通信,我们在游戏中的聊天室该怎么做出来呢?这就需要用到scoket了,这里就只说明socket在游戏开发中如何使用,主要面对unity和c#。

        首先需要建立两个项目,分别编写服务器端的代码和客户端的代码,服务器端和客户端进行网络通信还需要知道ip地址和端口号,ip能让客户端找到该连接哪个网络设备,但是仅仅知道ip还不够,比如电脑上还有qq微信等,qq发送的消息总不能在微信上显示出来,所以还需要端口号进行服务。端口号从0~65535里面随意取值即可。

1.服务器端代码

        服务器端的代码一共6个步骤

        ①创建服务器端的socket

        ②绑定ip和端口号

        ③开始监听

        ④获取客户端的socket

        ⑤向客户端发送消息

        ⑥接受客户端的消息

具体解释

        ①创建服务器端的socket

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

        这里的参数意思是内网,采用流的方式,协议是Tcp,目前这个阶段只要知道就行了,不用做深入理解。

        ②绑定ip和端口号

                IPEndPoint是对ip和端口号进行封装的一个类

            IPAddress ipaddress = new IPAddress(new byte[] { 10, 135, 2, 4 });这里的ip用的是我们的校园网,需要自行更换
            EndPoint point = new IPEndPoint(ipaddress, 5555);端口号可更改
            tcpServer.Bind(point);服务器端的socket与封装好的ip和端口号进行绑定

        ③开始监听

            tcpServer.Listen(100);参数代表最多允许有多少客户端进行连接

        ④获取客户端的socket

Socket clientSocker = tcpServer.Accept();accept方法会暂停当前线程,知道有一个客户端与它进行连接

        ⑤向客户端发送消息

            String message = "你好,客户端";
            byte[] data = Encoding.UTF8.GetBytes(message);将字符串转为字节,因为通信只能传递字节
            clientSocker.Send(data);向客户端发送消息

        ⑥接受客户端的消息

            byte[] data2 = new byte[1024];需要将接收到的数据存到byte数组中,所以先定义一个byte数组
            int length = clientSocket.Receive(data2);与服务器端的send方法对应,length表示接收到的数据的字节长度
            String message2 = Encoding.UTF8.GetString(data2, 0, length);这里只需要取0到length长度的字节,后面的是空的

代码如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace socket服务器端
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. //1.创建服务器端的socket
  15. Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16. //2.绑定ip和端口号10.135.2.4
  17. IPAddress ipaddress =IPAddress.Parse("10.135.2.4");
  18. EndPoint point = new IPEndPoint(ipaddress, 5555);//ipendpoint是对ip+端口号做了一层封装
  19. tcpServer.Bind(point);
  20. //3.开始监听,等待客户端连接
  21. tcpServer.Listen(100);//100表示最多允许100个客户端进行连接
  22. Console.WriteLine("开始监听");
  23. //4.获取客户端的socket
  24. Socket clientSocket = tcpServer.Accept();//accept的返回值是客户端的socket
  25. Console.WriteLine("客户端已连接");
  26. //5.向客户端发送消息
  27. String message = "你好,客户端";
  28. byte[] data = Encoding.UTF8.GetBytes(message);//将字符串转为字节,因为通信只能传递字节
  29. clientSocket.Send(data);//向客户端发送消息
  30. Console.WriteLine("向客户端发送消息");
  31. //6.接收客户端的消息
  32. byte[] data2 = new byte[1024];//需要将接收到的数据存到byte数组中,所以先定义一个byte数组
  33. int length = clientSocket.Receive(data2);//与服务器端的send方法对应,length表示接收到的数据的字节长度
  34. String message2 = Encoding.UTF8.GetString(data2, 0, length);
  35. Console.WriteLine("接收到来自客户端的消息:"+message2, 0, length);
  36. Console.ReadKey();
  37. }
  38. }
  39. }

2.客户端代码

        客户端的代码一共4个步骤

        ①创建客户端的socket

        ②发起建立连接的请求

        ③接受服务器端的消息

        ④向服务器端发送消息

具体解释

        ①创建客户端的socket

        和服务器端一样Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        ②发起建立连接的请求

            IPAddress ipaddress = IPAddress.Parse("10.135.2.4");
            EndPoint point = new IPEndPoint(ipaddress, 5555);
            tcpClient.Connect(point);

        这里要和服务器端的ip+端口号保持一致

        ③接受服务器端的消息

            byte[] data= new byte[1024];
            int length=tcpClient.Receive(data);
            String message = Encoding.UTF8.GetString(data,0,length);

        和服务器端一样

        ④向服务器端发送消息

            String message2 = Console.ReadLine();
            byte[] data2 = Encoding.UTF8.GetBytes(message2);
            tcpClient.Send(data2);

        和服务器端一样

代码如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace socket客户端
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. //1.创建客户端的socket
  15. Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16. //2.发起建立连接的请求
  17. IPAddress ipaddress = IPAddress.Parse("10.135.2.4");
  18. EndPoint point = new IPEndPoint(ipaddress, 5555);//要和服务器端的ip+端口号保持一致
  19. tcpClient.Connect(point);
  20. //3.接受服务器端的消息
  21. byte[] data= new byte[1024];//需要将接收到的数据存到byte数组中,所以先定义一个byte数组
  22. int length=tcpClient.Receive(data);//与服务器端的send方法对应,length表示接收到的数据的字节长度
  23. String message = Encoding.UTF8.GetString(data,0,length);//这里只需要取0到length长度的字节,后面的是空的
  24. Console.WriteLine("接收到来自服务器端的消息:"+message);
  25. //4.向服务器端发送消息
  26. String message2 = Console.ReadLine();
  27. byte[] data2 = Encoding.UTF8.GetBytes(message2);
  28. tcpClient.Send(data2);
  29. Console.ReadKey();
  30. }
  31. }
  32. }

在写好代码之后运行一下看看结果,记住先运行服务器端再运行客户端

结果如下

服务器端:

客户端:

 

可以发现服务器端和客户端已经成功进行了通信。

如果使用的是UDP协议,我们只需要稍作修改就行了。

服务器端

创建socket:

Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

另外不需要监听

接收数据:

  1. EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
  2. byte[] data = new byte[1024];
  3. int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//把数据信息放到第一个,把来源(ip+port)放到第二个
  4. string message = Encoding.UTF8.GetString(data, 0, length);
  5. Console.WriteLine("从ip" + (remoteEndPoint as IPEndPoint).Address.ToString() + "端口号:" +
  6. (remoteEndPoint as IPEndPoint).Port + "获得了数据" + message);

客户端

创建socket与服务器端一样

发送数据:

  1. EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 5555);
  2. string message = Console.ReadLine();
  3. byte[] data = Encoding.UTF8.GetBytes(message);
  4. udpClient.SendTo(data, serverPoint);

但是我们的程序还有很大的缺陷,服务器端只能连接一个客户端,并且只能与客户端进行一次通信,进一步探究放到下一篇博客。 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号