Unity3d Tcp And Udp

Posted by Packy on October 28, 2018

TCP和UDP 的C#实现,两份我认为非常实用的代码,拖进去U3D就可以实现传输任意结构体数据。

近期更新……可能有一些bug,各位遇到了可以反馈一下~

在课题组onenote里。

TCP设置需要设置服务器的IPPORT

UDP分别设置服务器和客户端的IPPORT

由于UDP是面向无连接的通信,所以实际上服务端和客户端是对等的,只不过服务端绑定了一个监听端口,而客户端每次都是自动分配的连接端口,其实也可以做成两边都绑定端口或者都不绑定端口的P2P模式。

PS:这个我还没有实验过,上述例子是都绑定一个ip和端口的,所以服务端和客户端都要绑定端口。

来自 https://blog.csdn.net/u012234115/article/details/46483885

UDP 和 TCP 初始化了控制字 和 开了线程, 程序关闭时候一定要给它擦屁股。。。

不然会出现各种奇怪的bug,UNITY3D 卡住,没办法play, 再次打开显示端口占用等等。。。

void OnDestroy ( )  try  if (mVI'hread ! = null)  myThread. Interrupt ( ) ;  myThread.Abort ( ) ,  / / o c ket  if (serversocket != null)  serversocket . Shutdown (Socketshutdown. Both) ;  serversocket . Close ( ) ,  catch (System. Exception ex)  Debug . Log (ex.Message) ;  print ("disconnect") ;

TCP的服务端在服务端关闭socket时还要把客户端的连接给关闭了:

for  ( int  0; i < clientsocketList. Count;  clientsocketList [i] . Close () ;

如果没有进行一次数据收发,关闭线程和套接字会出现错误:

由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

img

服务端做了shutdown,both的处理。然而客户端也有一个shutdown.send处理,所以冲突了,只能有一个shutdown处理。客户端可以采用close什么的

来自 https://blog.csdn.net/nndtdx/article/details/6317020

void OnDestroy ( )  try  if (mVI'hread ! = null)  myThread. Interrupt () ;  myThread.Abort ( ) ;  / / k*Bsocket  if (serversocket != null)  A11SendMs ( '"server shutdown") ;  serversocket . Shutdown (Socketshutdown. Both) ;  serversocket . Close ( ) ,  catch (System. Exception ex)  Debug . Log (ex.Message) ;  print ("disconnect") ;

这里的处理方法是在服务器关闭的时候,给客户端广播一个“服务器要关掉啦,你们赶快跑路吧~“ 然后就不会出现错误了,获取可以考虑添加一个收发数据Ip的list,List不为空才shutdown,否则直接close,比较复杂就没做了。

win10 里使用 socket需要用 Windows.Networking下的类库实现,我们如果直接在Unity C# 脚本里 using Windows.Networking是不可以的,Unity编辑器在编译的时候是不能通过的。Windows.Networking 这是属于 WinRT API,只有在VS里才能被编译。

所以,如果要在Unity开发HoloLens程序使用 WinRT API 需要用 #if WINDOWS_UWP …… #endif 对相应的代码进行包裹,这样在Unity里就不会报错,build后再VS里再编译打包

可以尝试类似如下代码实现socket

来自 http://mshololens.cn/d/124/2