当前位置: 移动技术网 > IT编程>开发语言>.net > unity网络----简单基础

unity网络----简单基础

2018年12月14日  | 移动技术网IT编程  | 我要评论

回到晚清的南洋军阀,陈二狗的妖孽人生520,枫雪镇

网络

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 }
view code

 

 二、服务器部分:

      注意:回调函数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 }
view code

 

 三客户端部分:

 

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网