利用Unity实现一个简单的TCP通讯工具
利用实时通讯工具的内置功能,如屏幕共享 #生活技巧# #沟通技巧# #在线沟通方式#
在这样的一个简单的通讯工具中,首先要实现的是两个模块:
服务器端(server)客户端(client)其中server端,利用VS写一个控制台程序来实现。
client端则利用Unity3D软件来实现。
使用的语言都是C#。
1, Sever
Server端主要有两个类,一个Program类为主类,Client类不是客户端,是专门处理用户端的发送信息的类。
在Program类中,设置了一个clientList列表,用来存储所有连接来的client端;基本逻辑是server在接受到client处理的信息后,将这个信息利用广播的方式发送给所有的clientList的客户端。
- Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TCP_server_communication { class Program { static List<Client> clientList = new List<Client>();//创建一个clientList用来保存所有连接的客户端,便于将信息分发给它们 public static void BroadcastMessage(string message) { var notConnectedList = new List<Client>(); foreach (var client in clientList) { if(client.Connected) { client.SendMessage(message); } else { notConnectedList.Add(client); } } foreach(var temp in notConnectedList) { clientList.Remove(temp);//将断开连接的客户端从clientList中删除 } } static void Main(string[] args) { //创建一个Socket //第一个参数表示一个内网,第二个参数表示以流的形式进行通信,第三个参数表示使用TCP协议进行通信 Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定IP和端口号 IPAddress ipaddress = new IPAddress(new byte[] { 192, 168, 123, 1 }); EndPoint point = new IPEndPoint(ipaddress, 7788); tcpServer.Bind(point); //开始监听,等待客户端连接 //参数表示最大的连接数 tcpServer.Listen(100); Console.WriteLine("启动服务器成功,开始监听..."); //暂停当前线程,知道有一个客户端连接过来,然后再执行之后的代码 //返回值为一个Socket,使用这个Socket来进行之后的通信 while (true) { Socket clientSocket = tcpServer.Accept(); Console.WriteLine("连接成功!"); Client client = new Client(clientSocket);//将与每个客户端通信的逻辑(收发消息)放到Client类中进行处理 clientList.Add(client); } } } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566- Client.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Threading; namespace TCP_server_communication { class Client { private Socket clientSocket; private Thread t; private byte[] data = new byte[1024];//创建一个1024大小的数据容器 public Client(Socket s) { clientSocket = s; //启动一个线程来处理客户端的数据接收 t = new Thread(ReceiveMessage); t.Start(); } private void ReceiveMessage() { while (true)//用一个死循环来一直接收客户端的数据 { //在接收数据之前,判断socket连接是否断开 if(clientSocket.Poll(10, SelectMode.SelectRead))//10为等待的时间为10ms,selectmode.read表示是否可以读取对方的消息 { clientSocket.Close(); Console.WriteLine("Message: 对方已离线!"); break;//跳出循环,终止这个线程的执行 } int length = clientSocket.Receive(data); string message = Encoding.UTF8.GetString(data, 0, length); //接收到数据后,需要将数据分发到客户端中。 //即,将这个消息广播到所有的客户端中 Program.BroadcastMessage(message); Console.WriteLine("Message: " + message); } } public void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public bool Connected//判断目前client的连接状态 { get { return clientSocket.Connected; } } } }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859602, Client
client是利用Unity来实现的。
具体的UI设计和实现是利用NGUI来实现的,不过以后UGUI是主流。
设计的具体细节在这里便不再赘述,主要是CharManager的脚本实现:
using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using System.Net; using System.Text; using System; using System.Threading; using UnityEngine; public class ChartManager : MonoBehaviour { public string ipaddress = "192.168.123.1"; public int port = 7788; public UIInput textInput;//UIInput用来做输入 public UILabel chatLable;//UILable用来做输出 private Socket clientSocket; private Thread t; private byte[] data = new byte[1024];//数据容器 private string message = "";//消息容器 // Use this for initialization void Start() { ConnectToServer(); } // Update is called once per frame void Update() { if(message!=null && message!="") { chatLable.text += "\n" +"message:" + message; message = "";//清空消息,便于下一次的message的探测 } } void ConnectToServer() { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //与服务器端建立连接 clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port)); //创建一个新的线程,用于接收消息 t = new Thread(ReceiveMessage); t.Start(); } //循环接收消息 void ReceiveMessage() { while(true) { if (clientSocket.Connected == false) break; int length = clientSocket.Receive(data); message = Encoding.UTF8.GetString(data, 0, length); } } void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public void OnSendButtonClick() { string value = textInput.value;//通过value属性来获取一个输入框中的值 SendMessage(value); textInput.value = ""; } void OnDestory() { clientSocket.Shutdown(SocketShutdown.Both);//关闭连接 clientSocket.Close(); } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384需要注意的是,在build时,需要在PlayerSetting中需要设置:
Run In Background
这样就可以保证两个客户端在后台时,也可以同步的接受到信息。
网址:利用Unity实现一个简单的TCP通讯工具 https://www.yuejiaxmz.com/news/view/848953
相关内容
测试tcp连接数工具TCPcopy:分布式TCP压力测试工具
利用AOP实现一个简单的缓存存储、清除的工具
《产业结构调整》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+人工智能+虚拟现实+增强现实+语音语义图像识别+多传感器信息融合+智能人机交互系统+物联网+立钻哥哥+==)
Wireshark网络分析就这么简单——TCP(1)
IOS手机自动化一些工具的简单介绍
TCP通信调试助手===wireshark使用
Unity 自定义房间布局系统 设计与实现一个灵活的房间放置系统 ——自定义房间区域功能
智能家居简单实现
Unity性能提升秘籍:开发者必知的优化技巧与策略