服务器部分代码
using System.Collections;
using System.Collections.Generic;using UnityEngine;using System.Net;using System.Net.Sockets;using System;public class NetManager : MonoBehaviour{ private byte[] buffer = new byte[1024]; // 服务器设置最大接受客户端信息字段长度 void Start() { //开启服务器方法 StartServer(); } /// <summary> /// 开启服务器 /// 一:实例化一个socket对象 /// 二:创建一个终端 /// 三:建立绑定 /// 四:进行监听 /// </summary> private void StartServer() { // 1:地址Ipv4 传输类型(流式) Tcp协议 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2:终端 Ip+Port(端口) IPEndPoint endPoiont = new IPEndPoint(IPAddress.Any, 8888); // 3:绑定 server.Bind(endPoiont); // 4:开启监听 10代表同一时间可以处理多少个客户端数据 并非最大连接量 server.Listen(10); Debug.Log("server ok"); // 异步开启接收客户端 server.BeginAccept(AsyncAccept, server); } /// <summary> /// 异步接收客户端 /// </summary> /// <param name="content"></param> void AsyncAccept(IAsyncResult content) { Socket server = content.AsyncState as Socket; //得到服务器 Socket client = server.EndAccept(content); //服务器结束对当前客户端监听 //再次开启异步 用于接收多个客户端 server.BeginAccept(AsyncAccept, server); //接受客户端消息 /*异步接收数据 参数解析 * 1 接收的容器 * 2 从该容器某位置接受 * 3 接受最大长度 * 4 null * 5 接收到之后接收到的回调 * 6 对象(一般传自己) */ client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, AsyncReceive, client); // 接受客户端数据,并计算真正长度 } /// <summary> /// 异步接收客户端消息 /// </summary> /// <param name="result"></param> void AsyncReceive(IAsyncResult result) { Socket client = result.AsyncState as Socket; int len = client.EndReceive(result); // 异步接收数据结束结算真正数据长度 //再次开启异步监听消息 client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, AsyncReceive, client); // 接受客户端数据,并计算真正长度 //消息解析 byte[] res = new byte[len]; // 新建数组接受真正数据 去除冗余数据 System.Buffer.BlockCopy(buffer, 0, res, 0, len); // 数组间赋值 string msg = System.Text.Encoding.UTF8.GetString(res); // 将数据重新转化为字符 Debug.Log(msg); }}
//客户端部分代码
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;namespace SocketClient{ class Program { static void Main(string[] args) { Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //客户端连接服务器 client.Connect(IPAddress.Parse("127.0.0.1"), 8888); while (true) { //阻塞数据 客户端输入消息 string msg = Console.ReadLine();//将消息转化为数据格式
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg); //发送数据 client.Send(buffer); } } }}