欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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网络----简单基础

unity网端简单案例:

分为:综合管理部分、客户端和服务器

需要socket作为媒介来进行交互

见代码:

 一、综合管理部分:

 unity网络----简单基础

unity网络----简单基础

unity网络----简单基础

unity网络----简单基础 

unity网络----简单基础
 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 }
view code

 

 二、服务器部分:

unity网络----简单基础

unity网络----简单基础

      注意:回调函数acceptclient只有当服务器接受连接(连接成功了)才会被调用.

unity网络----简单基础
 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 }
view code

 

 三客户端部分:

unity网络----简单基础

unity网络----简单基础

 

unity网络----简单基础
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();
        }
    }
    
}
view code