查看: 1790|回复: 0
打印 上一主题 下一主题

[其他] UDP端对端聊天代码

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-12-30 00:15:39 |只看该作者 |倒序浏览
服务器端代码也可说是第一个客户端:
using unityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System;
using System.Threading;
public class UDP1119E : MonoBehaviour
{
   
    private Socket newsock;//定义一个socket变量
    IPEndPoint ip;//定义一个IP地址和端口号
    int recv;//定义一个接受值的变量
    byte[] data = new byte[1024];//定义一个二进制的数组用来获取客户端发过来的数据包
    string mydata;
    void Start()
    {
        //得到本机IP,设置TCP端口号         
        ip = new IPEndPoint(IPAddress.Any, 8802);//设置自身的IP和端口号,在这里IPAddress.Any是自动获取本机IP
        newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//实例化socket对象设置寻址方案为internetwork(IP版本的4存放),设置Soket的类型,为Dgram(支持数据报形式的数据),设置协议的类型,为UDP
        //绑定网络地址
        newsock.Bind(ip);//绑定IP
        Debug.Log("This is a Server,host name is " + Dns.GetHostName());//输出本地的名字
        Debug.Log("Waiting for a client");
        //BeginReceives();
        Thread test = new Thread(BeginListening);//定义一个子线程
        test.Start();//子线程开始   
    }
  
    void BeginListening()
    {
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
        EndPoint Remote = (EndPoint)(sender);//实例化一个地址结束点来标识网络路径
        Debug.Log(Encoding.ASCII.GetString(data, 0, recv));//输出二进制转换为string类型用来测试
        while (true)
        {
            data = new byte[1024];//实例化data
            recv = newsock.ReceiveFrom(data, ref Remote);//将数据包接收到的数据放入缓存点,并存储终节点
            //Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
            mydata = Encoding.ASCII.GetString(data, 0, recv);
            Debug.Log(mydata);
           // newsock.SendTo(Encoding.ASCII.GetBytes(mydata),mydata.Length,SocketFlags.None,Remote);
        }
    }
    string input = "";
    void SendMessage(string message)
    {
        byte[] data = new byte[1024];
        Debug.Log("This is a client,host name is" + Dns.GetHostName());
        //IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
        EndPoint Remote = (EndPoint)(ip);//实例化一个地址结束点来标识网络路径
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
     
        //string welcome = "你好";
        //data = Encoding.ASCII.GetBytes(welcome);
        ip = new IPEndPoint(IPAddress.Parse("192.168.1.19"), 8803);
        server.SendTo(data, data.Length, SocketFlags.None, ip);
        data = new byte[1024];
        server.SendTo(Encoding.ASCII.GetBytes(message), ip);
        data = new byte[1024];
        Debug.Log("Stopping Client.");
        server.Close();
    }
    void OnGUI()
    {
        //input = GUILayout.TextField(input);
        input = GUI.TextField(new Rect(100, 50, 60, 30), input);
        if (GUI.Button(new Rect(100,90,60,30),"Send"))
        {
            SendMessage(input);
        }
    }
    void OnApplicationQuit()
    {
        newsock.Close();
    }
}


客户端代码带有mystructs:
using System;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public struct mystructs
{
   
    public int Age; //获取结构里的
    public string name;
    public float Height;
    public mystructs(int myage, string myname, float myheight)
    {
        Age = myage;
        name = myname;
        Height = myheight;
    }
}
public class UDPK1119E : MonoBehaviour
   {
       int Age;
       string Name;//获取
       float Height;
       private Socket newsock;//定义一个socket变量
       IPEndPoint ip;//定义一个IP地址和端口号
       int recv;//定义一个接受值的变量
       byte[] data = new byte[1024];//定义一个二进制的数组用来获取客户端发过来的数据包
       byte[] bytedate = new byte[1024];
       string mydata;
       void Start()
       {
           mystructs my;    //将结构初始化  付给另一个
           Age = my.Age = 17;
           Name = my.name = "  haha  ";
           Height = my.Height = 180.50f;
           Debug.Log(Age + Name + Height);
           byte[] agebyte = new byte[1024];   //定义二进制数组
           byte[] namebyte = new byte[1024];
           byte[] heightbyte = new byte[1024];
           agebyte = Encoding.ASCII.GetBytes(Age.ToString());  //转换成二进制的
           namebyte = Encoding.ASCII.GetBytes(Name);
           heightbyte = Encoding.ASCII.GetBytes(Height.ToString());
           bytedate = new byte[agebyte.Length + namebyte.Length + heightbyte.Length];  //byte
           agebyte.CopyTo(bytedate, 0); //把值 拷贝 给bytedate  索引
           namebyte.CopyTo(bytedate, agebyte.Length);  //agebyte索引开始
           heightbyte.CopyTo(bytedate, namebyte.Length);
           //string sss = Encoding.ASCII.GetString(data);
         //  Debug.Log(sss);

           //得到本机IP,设置TCP端口号         
           ip = new IPEndPoint(IPAddress.Parse("192.168.1.19"), 8803);//设置自身的IP和端口号,在这里IPAddress.Any是自动获取本机IP
           newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//实例化socket对象设置寻址方案为internetwork(IP版本的4存放),设置Soket的类型,为Dgram(支持数据报形式的数据),设置协议的类型,为UDP
           //绑定网络地址
           newsock.Bind(ip);//绑定IP
           Debug.Log("This is a Server,host name is  " + Dns.GetHostName());//输出本地的名字
           Debug.Log("Waiting for a client");
           Thread test = new Thread(BeginListening);//定义一个子线程
           test.Start();//子线程开始   
       }
       void BeginListening()
       {
     //      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
           EndPoint Remote = (EndPoint)(ip);//实例化一个地址结束点来标识网络路径
           Debug.Log(Encoding.ASCII.GetString(data, 0, recv));//输出二进制转换为string类型用来测试
           while (true)
           {
               data = new byte[1024];//实例化data
               recv = newsock.ReceiveFrom(data, ref Remote);//将数据包接收到的数据放入缓存点,并存储终节点
               //Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
               mydata = Encoding.ASCII.GetString(data, 0, recv);
               Debug.Log(mydata);
               // newsock.SendTo(Encoding.ASCII.GetBytes(mydata),mydata.Length,SocketFlags.None,Remote);
           }

       }
       string input = "";
        void SendMessage(string message)
        {
            
            byte[] data = new byte[1024];
            byte[] messbyte=new byte[1024];
           
           Debug.Log ("This is a client,host name is  " + Dns.GetHostName());
             ip = new IPEndPoint(IPAddress.Parse("192.168.1.19"), 8802);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            EndPoint ep = (EndPoint)ip;
            //string welcome = "你好";
            //data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ep);
            messbyte=Encoding.ASCII.GetBytes(message);
            data = new byte[bytedate.Length+messbyte.Length];
            bytedate.CopyTo(data, 0);
            messbyte.CopyTo(data, bytedate.Length);
           
                server.SendTo(data, ep);
                data = new byte[1024];
            Debug.Log("Stopping Client.");
            server.Close();
            
        }
        void OnGUI()
        {

            input = GUILayout.TextField(input);
            if (GUILayout.Button("发送"))
            {
                SendMessage(input);
            }
        }
        void OnApplicationQuit()
        {
            newsock.Close();
        }
      
    }
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 22:21 , Processed in 0.095415 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部