ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

unity基于socket的网络学习_2

unity基于socket的网络学习_2 本节记录客户端通讯的代码同样采用项目的方式整体以及分解式讲解详细代码using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.Unicode; namespace SocketClientLesson { internal class Program { //本机回环地址用于本项目测试同一台电脑上的服务器和客户端连接 private const string ServerIp127.0.0.1; // 端口号发送目标位置要与服务器脚本监听端口相同 private const int ServerPort 7777; private static void Main(string[] args) { //新建一个socket用来当作发送消息的时候的接口 Socket serverSocket new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //尝试 try { //将string类型的网络地址转换为IPAddrese类型以便调用 IPAddress serverAddressIPAddress.Parse(ServerIp); //封装端点 IPEndPoint serverEndPointnew IPEndPoint(serverAddress,ServerPort); Console.WriteLine(准备连接服务器); //用创建的socket发送信息通过端点serverEndPoint serverSocket.Connect(serverEndPoint); Console.WriteLine(服务器连接成功); Console.WriteLine($本地客户端端点{serverSocket.LocalEndPoint}); Console.WriteLine($远程客户端端点{serverSocket.RemoteEndPoint}); Console.WriteLine(请输入准备发送的信息); //输入消息并存储 string messgeConsole.ReadLine()??string .Empty; //将输入的消息转换为byte方便发送 byte[] sendByteEncoding.UTF8.GetBytes(messge); //自制的多次提交信息发送任务方法 SendAll(serverSocket, sendByte ); Console.WriteLine($以提交发送{sendByte.Length}字节); //关闭发送 serverSocket.Shutdown(SocketShutdown.Send); //准备接收建立数据缓冲区 byte[] receiveBuffernew byte[1024]; //接受信息的时候一次一条信息可能会分为几次接收那么就需要MemoryStream来进行byte的多次存储将信息存储进去 using MemoryStream responseStreamnew MemoryStream(); //开始反复接收信息就像反复发送信息 while(true) { //普通的接收方法将数据存入receiveBuffer然后获取返回值本次接收多少字节 int receivelength serverSocket.Receive(receiveBuffer); //检测如果此次消息接收到的长度为0那么代表本次消息发送结束 if( receivelength 0 ) { return; } //将本次接收到的数据写入刚才创建的MemoryStream类型参数类型为存储数据的byte数组从0开始到receivelength结束 responseStream.Write(receiveBuffer, 0, receivelength ); } //再将MemoryStream中依次存入的数据一口气存回byte数组 byte[] responseBytesresponseStream.ToArray(); //将byte类型转换为string类型 string responseMessageEncoding.UTF8.GetString(responseBytes); Console.WriteLine($本次服务器的回复是{responseMessage}); } //出现socket错误抛出异常 catch(SocketException except) { Console.WriteLine(socketfas异常); Console.WriteLine($socket错误{except.SocketErrorCode}); Console.WriteLine($系统异常码{except.ErrorCode}); Console.WriteLine($错误信息{except.Message}); } //出现普通错误抛出异常 catch(Exception exception) { Console.WriteLine($发送其他错误{exception.Message}); } //最终无论是否发生错误都执行 finally { //将客户端关闭 serverSocket.Close(); Console.WriteLine(客户端已关闭); } Console.WriteLine(按任意键退出); Console.ReadKey(); } //自制发送信息代码确报信息传输到位 private static void SendAll(Socket socket, byte[] messgeByte) { int totasent 0; while (totasent messgeByte.Length) { int cyrrensent socket.Send(messgeByte, totasent, messgeByte.Length - totasent, SocketFlags.None); if (cyrrensent 0) { throw new InvalidOperationException( Socket没有成功发送数据。); } totasent cyrrensent; } } } }重点代码分解上一章记录过的代码不做解释1private const string ServerIp127.0.0.1;上一节我们的端点绑定的是本机的所有网络IP这一节我们要给定一个网络IP因为上一节的端口用来接收所以可以同时绑定几个而这一节端口用来发送所以需要指定网络IP2IPAddress serverAddressIPAddress.Parse(ServerIp);将前面我们定义的字符型网络地址转换为IPAddress性以便端点封装3using MemoryStream responseStreamnew MemoryStream();这一条需要的头文件是using System.IO;他的作用是可以多次存入byte类型的数据使其按照顺序排列4int receivelength serverSocket.Receive(receiveBuffer);接收消息方法调用·receive方法将接收到的消息放在receiveBuffer中然后该方法有返回值本次接收多少字节的数据放进receivelength中5 if( receivelength 0 )如果接收到的数据长度为0那么代表本次数据发送结束6. responseStream.Write(receiveBuffer, 0, receivelength )将本次接收到的数据存入responseStream中本次循环的逻辑为一直接收数据将每次接收到的数据都存入responseStream如果有一次没接收到数据代表传输结束跳出循环7byte[] responseBytesresponseStream.ToArray();循环结束后将所有分段存储进入responseStream的字节统一存入responseBytes数组中客户端和服务器最大区别是没用监听socket但是有发送socket在接收消息方面本次介绍的更加详细采用了循环的方式多次检测发送和AllSend方法有异曲同工之妙在服务器的代码中并没有这么些循环接收信息因为是示例测试发送的短的信息的话可以一次接收完毕但是客户端的接收更加官方多次接受确保消息传输完毕
返回列表