unity网络----简单基础
程序员文章站
2022-04-24 22:42:03
网络 TCP:与打电话类似,通知服务到位 UDP:与发短信类似,消息发出即可 IP和端口号是网络两大重要成员 端口号(Port)分为知名端口号[0-1024,不开放)和动态端口号[1024,10000多,开放可用) 三次握手,四次挥手: unity网端简单案例: 分为:综合管理部分、客户端和服务器 ......
网络
tcp:与打电话类似,通知服务到位
udp:与发短信类似,消息发出即可
ip和端口号是网络两大重要成员
端口号(port)分为知名端口号[0-1024,不开放)和动态端口号[1024,10000多,开放可用)
三次握手,四次挥手:
unity网端简单案例:
分为:综合管理部分、客户端和服务器
需要socket作为媒介来进行交互
见代码:
一、综合管理部分:
1 using system.collections; 2 using system.collections.generic; 3 using unityengine; 4 using system.net; 5 using system.net.sockets; 6 using system.threading; 7 using system; 8 9 //综合管理部分 10 // 可以供客户端和服务器一块使用 11 public class tcpsocket 12 { 13 private socket socket;//当前实例化的套接字 14 private byte[] data;//socket上的数据 15 private bool isserver; //用来区分服务器 还是客户端 16 17 //构造tcpsocket 18 public tcpsocket(socket socket,int datalength, bool isserver) 19 { 20 this.socket = socket; 21 data = new byte[datalength]; 22 this.isserver = isserver; 23 } 24 // 接受----->客户端 25 public void clientreceive() 26 { 27 //data:数据缓存 0:接受位的偏移量 length 28 socket.beginreceive(data,0,data.length,socketflags.none,new asynccallback(clientendreceive),null); 29 } 30 public void clientendreceive(iasyncresult ar) 31 { 32 int receivelength = socket.endreceive(ar); //数据的处理 33 string datastr = system.text.encoding.utf8.getstring(data,0, receivelength); //把接受完毕的字节数组转化为 string类型 34 if (isserver) 35 { debug.log("服务器接受到了:" + datastr); 36 for (int i = 0; i < server.instance.clients.count; i++) //服务器要回什么 37 { 38 if (server.instance.clients[i].clientconnect()) 39 { 40 server.instance.clients[i].clientseed(system.text.encoding.utf8.getbytes("服务器回复:"+ datastr)); 41 } 42 } 43 }else { 44 datamanager.instance.msg = datastr; 45 debug.log("客户端接受到了:" + datastr); 46 } 47 } 48 49 50 // 发送---->客户端发送给服务器 51 public void clientseed(byte[] data) 52 { 53 socket.beginsend(data,0, data.length, socketflags.none,new asynccallback(clientseedend),null ); 54 } 55 56 private void clientseedend(iasyncresult ar) 57 { 58 socket.endsend(ar); 59 } 60 61 62 //连接----客户端与服务器连接 63 public void clientconnect(string ip,int port) 64 { 65 socket.beginconnect(new ipendpoint(ipaddress.parse(ip), port),new asynccallback(clientendconnect),null); 66 } 67 public void clientendconnect(iasyncresult ar) 68 { 69 if (ar.iscompleted) { 70 debug.log("连接成功"); 71 } 72 socket.endconnect(ar); 73 } 74 75 // 客户端与服务器是否连接 76 77 public bool isclientconnect() 78 { 79 return socket.connected; 80 } 81 //断开连接 82 public void clientclose() 83 { 84 if (socket!=null&& isclientconnect()) 85 { 86 socket.close(); 87 } 88 } 89 90 }
二、服务器部分:
注意:回调函数acceptclient只有当服务器接受连接(连接成功了)才会被调用.
1 using system.collections; 2 using system.collections.generic; 3 using unityengine; 4 using system.net; 5 using system.net.sockets; 6 using system.threading; 7 using system; 8 9 // 服务器 10 11 public class server : monobehaviour { 12 13 //单例服务器,继承mono的 14 private static server instance; 15 public static server instance 16 { 17 get { return instance; } 18 } 19 private void awake() 20 { 21 instance = this; 22 } 23 //------------------------------------------------------------------------ 24 private socket server;//定义一个服务器 25 public list<tcpsocket> clients;//所有连接的客户端 26 private bool isloopaccept = true;//是否循环接受客户端的请求 27 28 void start () 29 { 30 //初始化服务器socket 协议族 31 server = new socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp); 32 server.bind(new ipendpoint(ipaddress.any,10086));//绑定端口号 33 server.listen(100); //可以监听的客户端数目 34 //------------------------------------------------------------------------ 35 //开辟一个线程 处理客户端连接请求 线程要暂停需用listenthread.abort(); 36 thread listenthread = new thread(receiveclient); 37 listenthread.start(); //开启线程 38 listenthread.isbackground = true; //后台运行 39 //------------------------------------------------------------------------ 40 //初始化连接的客户端 41 clients = new list<tcpsocket>(); 42 43 } 44 45 // 持续处理 接受客户端连接的请求 46 private void receiveclient() 47 { 48 while (isloopaccept) 49 { 50 server.beginaccept(acceptclient,null); //开始接受客户端连接请求 51 debug.log("检测客户端连接中....."); 52 thread.sleep(1000);//每隔1s检测 有没有连接我 53 } 54 } 55 // 客户端连接成功之后回调 56 private void acceptclient(iasyncresult ar) 57 { 58 //连接成功后处理该客户 59 socket client = server.endaccept(ar); 60 tcpsocket clientsocket = new tcpsocket(client,1024,true); 61 clients.add(clientsocket); 62 debug.log("连接成功"); 63 } 64 //关闭项目终止线程,停止服务器. 65 private void onapplicationquit() 66 { 67 listenthread.abort(); 68 listenthread.isbackground = true;//关闭线程 69 } 70 }
三、客户端部分:
using system.collections; using system.collections.generic; using system.net; using system.net.sockets; using system.threading; using system; using unityengine; using unityengine.ui; //客户端 public class client : monobehaviour { public inputfield input; public text receivetext; tcpsocket tcpclient; socket client; void start () { //注册监听事件 receivetext = gameobject.find("receivetext").getcomponent<text>(); tcpclient = new tcpsocket(client,1024,false);//初始化综合处理器 client = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);//初始化客户端 } void update () { if (tcpclient != null && tcpclient.isclientconnect())//如果客户端不为空且客户端已连接 { tcpclient.clientreceive();//执行综合管理器中的clientreceive() } receivetext.text = datamanager.instance.msg; } public void onclickconnectbtn()//客户端向服务器开始连接输入(ip和端口号)按钮事件 { if (!tcpclient.isclientconnect()) { tcpclient.clientconnect("10.50.6.129",10086); } } public void onclicktosendserver()//客户端向服务器发送文本消息按钮事件 { if (tcpclient != null && tcpclient.isclientconnect() && !string.isnullorempty(input.text)) { tcpclient.clientseed(system.text.encoding.utf8.getbytes(input.text)); input.text = ""; } } private void onapplicationquit()//关闭项目,退出服务器连接 { if (tcpclient != null && tcpclient.clientconnect()) { tcpclient.clientclose(); } } }
上一篇: JavaScript 系列博客(一)