Unity网络开发记录(一):实现最简单的unity客户端和服务器通信
服务端
案例通过Socket网络套接字实现Tcp网络通讯
打开VS,新建一个项目
C#服务端整体流程依旧遵从socket开发的基本步骤,和其它语言下的socket开发一样,例如c++
- 新建socket对象
- 向socket对象绑定协议簇、传输格式、协议类型
- 新建一个能存储ip地址以及端口号的对象
- socket对象绑定ip地址以及端口号
- socket对象开启监听
- socket对象持续进行监听连接请求,如有新连接,返回客户端与服务端之间通信的socket对象(此过程阻塞,直到有新连接)
- 建立连接,此时可以进行信息的收发
- 切断通讯关闭socket
补充一下前置知识,在Tcp传输下,会经历三报文握手建立连接,四报文挥手释放连接。三报文握手防止以失效的连接请求重新传到服务端,四报文挥手之后要等待2MSL,确保此过程中的报文全部失效,并防止释放请求确实报文丢失,及时重传。Tcp传输具有无差错,不丢失,不重复,不乱序的特点,适合长连接的游戏
传输信息使用UTF-8编码
服务端代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;namespace C_NetWorke
{internal class Program{static void Main(string[] args){Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);tcpSocket.Bind(ip);}catch (Exception){return; }tcpSocket.Listen(1024);Socket clientSocket = tcpSocket.Accept();clientSocket.Send(Encoding.UTF8.GetBytes("你好,我是服务端"));byte[] buffer = new byte[1024];int num = clientSocket.Receive(buffer);if (clientSocket.RemoteEndPoint != null){Console.WriteLine($"收到来次{clientSocket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");}clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();Console.ReadLine();}}
}
客户端
- 新建socket对象
- 向socket对象绑定,和服务端一样
- 启动连接,申请向服务器建立连接
- 连接成功,可以收发数据
- 切断通讯,关闭socket
在unity中新建一个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class Class5 : MonoBehaviour
{private void Start(){Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);try{socket.Connect(ipPoint);}catch (SocketException e){if (e.ErrorCode == 10061)print("服务器拒绝链接");elseprint("链接出错" + e.ErrorCode);return;}socket.Send(Encoding.UTF8.GetBytes("你好,我是客户端"));byte[] buffer = new byte[1024];int num = socket.Receive(buffer);if (socket.RemoteEndPoint != null){print($"收到来次{socket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");}socket.Shutdown(SocketShutdown.Both);socket.Close();}}
启动服务器后,再运行unity,发现连接成功,此时完成了网络通讯的初步搭建