服务端:
public class NetWorking : MonoBehaviour { // Use this for initialization void Start() { Screen.fullScreen = true; Debug.Log("networking start"); InitNet(); } Thread myThread; public void InitNet() { newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//接收端 sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);//广播发送端 //255.255.255.255 sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast, 1); iep1 = new IPEndPoint(IPAddress.Broadcast, 8001); iep2 =new IPEndPoint(IPAddress.Any, 8002); newsock.Bind(iep2);//接收端必须绑定一下 myThread = new Thread(new ThreadStart(ReceiveSorkets)); myThread.IsBackground = true; myThread.Start(); } string json = null; IPEndPoint iep2; public void sendMess(string json) { json = Utils.EventHandleToJson("1", "2", "3", "4"); json = "1" + "|" + "2" + "|"+"plant" +"|"+ "3"; Debug.Log("json = " + json); byte[] data = Encoding.Default.GetBytes(json); byte[] utf8Data = Encoding.Convert(Encoding.Default, Encoding.UTF8, data); sock.SendTo(utf8Data, iep1); } IPEndPoint iep1; Socket sock; Socket newsock; private void ReceiveSorkets() { EndPoint point = (EndPoint)iep2; while (true) { byte[] data = new byte[1024]; //发送接受信息 int recv = newsock.ReceiveFrom(data, ref point); Debug.Log(Encoding.UTF8.GetString(data, 0, recv)); string json = Encoding.UTF8.GetString(data, 0, recv); if (UdpData != null) { UdpData(json); } } } public void sendSolvedMessage(string id, string gid, string objectType, string dealingState) { //string json = null; //json = Utils.EventHandleToJson(id, gid, objectType, dealingState); //byte[] data = new byte[1024]; //data = Encoding.Unicode.GetBytes(json); //newsock.SendTo(data, data.Length, SocketFlags.None, Remote); //son = Utils.EventHandleToJson("1", "2", "3", "4"); json = gid + "|" + id + "|" + objectType + "|" + dealingState; Debug.Log("json = " + json); byte[] data = Encoding.UTF8.GetBytes(json); byte[] utf8Data = Encoding.Convert(Encoding.Default, Encoding.UTF8, data); sock.SendTo(utf8Data, iep1); } //关闭Socket public void NetClosed() { // Debuger.LogError("NetClosed"); if (newsock != null) { newsock.Close(); newsock = null; } if (sock != null) { sock.Close(); sock = null; } } void OnDestroy() { NetClosed(); } }
客户端:
public class NetWorking : MonoBehaviour { public NetWorkingMsg netWrokingMsg; // Use this for initialization void Start() { InitNet(); } //本地socket Socket APPSocket; Socket SendSocket; //server目标 EndPoint ServerRemote; string input, stringData; IPEndPoint iep; public void InitNet() { ipep = new IPEndPoint(IPAddress.Parse("192.168.0.131"), 8001); //定义网络类型,数据连接类型和网络协议UDP APPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); iep = new IPEndPoint(IPAddress.Any, 8001); APPSocket.Bind(iep); SendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); isRun = true; myThread = new Thread(new ThreadStart(ReceiveSorket)); myThread.IsBackground = true; myThread.Start(); } Thread myThread; int recv; IPEndPoint remote; Pack pack = new Pack(); Int32 timeStamp; private bool isRun = false; //接收数据 //供UDP使用 start public IPAddress broadcast; public IPEndPoint ep; public UdpClient ReceiveUdpClient; private void ReceiveSorket() { EndPoint ep = (EndPoint)iep; while (isRun) { byte[] data = new byte[1024]; int recv = APPSocket.ReceiveFrom(data, ref ep); stringData = Encoding.UTF8.GetString(data); netWrokingMsg.receiveUdp(stringData); } } // 发送消息 public void SendUdp(string str) { IPEndPoint sender = new IPEndPoint( IPAddress.Parse(Constant.servicesIP), 8002); EndPoint Remote = (EndPoint)sender; Debug.Log("zdp senUDP 11111"); SendSocket.SendTo(Encoding.UTF8.GetBytes(str), Remote); } public void SendUdpBroadcast() { IPEndPoint sender = new IPEndPoint(IPAddress.Broadcast, 8001); EndPoint Remote = (EndPoint)sender; APPSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);//设置该scoket实例的发送形式 string request = "你好,TEST SEND!";//初始化需要发送而的发送数据 byte[] buffer = Encoding.Unicode.GetBytes(request); APPSocket.SendTo(buffer, Remote); } //关闭Socket public void NetClosed() { // Debuger.LogError("NetClosed"); if (APPSocket != null) { APPSocket.Close(); APPSocket = null; } if(SendSocket != null) { SendSocket.Close(); SendSocket = null; } isRun = false; } void OnDestroy() { NetClosed(); } }
相关推荐
Unity使用Udp协议进行Socket连接通讯
unity客户端、服务单TCP、UDP通讯Demo
本工具即为在Unity3D环境下专门设计的UDP通信管理器,它无需额外的插件,仅通过一个名为`UdpManager.cs`的C#脚本就能实现UDP通信功能。 首先,我们来理解一下UDP通信的基本概念。UDP是一种无连接的传输层协议,它不...
基于Unity制作的UDP通信Demo,PC/Android平台亲测可用,直接打包可测
unity UDP通讯 包含心跳机制
Unity3D中,可以使用System.Net.Sockets命名空间中的TcpClient、TcpListener、UdpClient等类来实现TCP和UDP通讯。TCP提供可靠的数据传输,适合于需要保证数据完整性的场景,如多人在线游戏的数据同步;UDP则更注重...
总结,Unity中的Socket通信结合TCP连接和UDP广播,可以实现可靠的服务器与客户端之间的数据交互。解决TCP粘包/拆包问题,可以确保数据正确无误地传输。理解并熟练掌握这些知识点,对于开发网络游戏或实时交互应用至...
外部文件用来配置udp内容,外部文件可以自主修改
可看资料:https://blog.csdn.net/a1062624730/article/details/132641467 根据网上提供的方法,测试出了最终解决方案,只要加一个sleep就可以,但是位置在前面,详情可看上方链接
总结来说,使用Unity3D实现多人聊天通讯需要掌握Unity的网络API,理解服务器与客户端的交互逻辑,以及数据传输和同步策略。在实际项目中,还需要关注性能优化、安全性和用户体验等方面,确保应用的稳定和高效运行。
总之,Android Studio与Unity3D的Socket通讯是跨平台应用开发中的关键技术,通过理解TCP/IP协议、Socket编程以及Android和Unity3D的API,开发者可以实现高效、稳定的数据交换,为用户提供丰富的互动体验。
- **UDP**:用户数据报协议,相比TCP,其速度更快但不保证数据包的顺序和完整性,适用于实时性要求高的游戏场景。 4. **数据序列化**: 在Unity中,数据需要被序列化为可以传输的格式,如JSON或XML。Unity提供...
4. **串口通讯**:串行端口(Serial Port)通信是计算机与其他设备间常用的一种通信方式。在这个项目中,可能是通过COM口与继电器控制器建立连接,发送UDP数据包,然后由控制器解析并作用于物理继电器。 5. **...
在编程领域,尤其是在网络通信中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输协议,常用于实时音频、视频流等对数据完整性要求不高的场景。C#作为.NET框架的主要编程语言,提供了...
基于.net3.5,可用于Unity调用的基础类库:包括UDP网络通讯封装类,SerialPort串口通讯封装类,数据处理封装类,PID解算封装类,输出日志封装类等,便于操作运行
实现了位置无错位同步,UDP通讯。更改客户端指向服务端的IP地址位置在源代码的NetWorking.cs下 1、启动服务端,开启服务 2、点击登录游戏,可以分红和蓝两队,分别是左右两个颜色的开始游戏 3、如果电脑操作方向用...
整合了一些功能,包含unity软件延时启动 文件操作工具类 UDP协议通讯 软件时间锁 快捷方式自动创建开机自启 输出log日志到指定目录
TCP与UDP都是网络SOCKET通信协议,其最大的区别在于UDP是一种不可靠的网络通讯服务,而TCP是一种可靠的网络通信服务。众所周知,TCP通过三次握手来实现网络通讯的,这一机制保证了校验数据,保证了可靠性;而UDP是...
实现了位置无错位同步,UDP通讯。更改客户端指向服务端的IP地址位置在源代码的NetWorking.cs下 1、启动服务端,开启服务 2、点击登录游戏,可以分红和蓝两队,分别是左右两个颜色的开始游戏 3、如果电脑操作方向用...
低阶功能则更偏向于网络传输的细节,例如WebSockets、UDP/R-UDP、TCP、序列化、分片、防篡改、加密/TLS等。这些功能涉及到数据在网络中的传输方式、安全性以及如何避免数据篡改等技术细节。 在《糖豆人》这样的游戏...