Unity3d 分别创建了两个线程客户端 服务器连接的简单示例

//分别创建了两个线程客户端 服务器连接的简单示例 

using UnityEngine;

using System;

using System.Collections;

using System.Threading;

using System.Net.Sockets;

using System.Net;

using System.Text;

public class TCPIPClientServer : MonoBehaviour

{

    void Start()

    {

        Debug.Log(GetIP().ToString());

    }

    public static Socket ClientSocket;

    private void InitConnect()

    {

        ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        string ip = GetIP().ToString();//服务器ip

        IPAddress ipa = IPAddress.Parse(ip);

        IPEndPoint iep = new IPEndPoint(ipa, 8000);

        try

        {

            ClientSocket.Connect(iep);//连接到服务器

            Thread thread = new Thread(new ThreadStart(ClientReceive));

            thread.Start();

        }

        catch (Exception ex)

        {

            Debug.Log(ex.Message);

            clientReceiveValue = ex.Message;

        }

    }



    /*接收来自服务器上的信息*/

    public void ClientReceive()

    {

        clientReceiveValue = "已经建立连接准备接受数据";

        while (true)

        {

            byte[] bytes = new byte[100];

            int rev = ClientSocket.Receive(bytes, bytes.Length, 0);//将数据从连接的   Socket   接收到接收缓冲区的特定位置。

            if (rev <= 0)

            {

                break;

            }

            string strev = System.Text.Encoding.Default.GetString(bytes);

            clientReceiveValue = ("服务器对客户端说:" + strev + "\r\n");

        }

    }





    private void ClientSend()

    {

        if (ClientSocket.Connected)//判断Socket是否已连接

        {



            byte[] SendMessage = new byte[100];

            SendMessage = Encoding.ASCII.GetBytes(clientSendValue);

            ClientSocket.Send(SendMessage);//从数据中的指示位置开始将数据发送到连接的Socket。



        }

        else

        {

            Debug.Log("未建立连接!");

            clientSendValue = "未建立连接!";

        }

    }



    private string clientReceiveValue = "";

    private string clientSendValue = "";

    private string serverReceiveValue = "";

    private string serverSendValue = "";

    void OnGUI()

    {

        //服务器

        GUI.TextField(new Rect(100, 100, 200, 50), serverReceiveValue);

        if (GUI.Button(new Rect(310, 100, 100, 20), "开始监听"))

        {

            Listen();

        }

        serverSendValue = GUI.TextField(new Rect(100, 150, 200, 40), serverSendValue);

        if (GUI.Button(new Rect(310, 150, 100, 20), "服务器发送"))

        {

            SeverSend();

        }



        ///客户端

        GUI.TextField(new Rect(100, 350, 200, 40), clientReceiveValue);

        if (GUI.Button(new Rect(310, 350, 100, 20), "连接服务器"))

        {

            InitConnect();



        }



        clientSendValue = GUI.TextField(new Rect(100, 400, 200, 40), clientSendValue);

        if (GUI.Button(new Rect(310, 400, 100, 20), "客户端发送"))

        {

            ClientSend();

        }

    }





    Thread LisThread;

    Socket LisSocket;

    Socket newSocket;

    EndPoint point;

    string strmes = String.Empty;

    int port = 8000;//定义侦听端口号

    private void Listen()

    {

        LisThread = new Thread(new ThreadStart(BeginListern));//开线程执行BeginListern方法

        LisThread.Start();//线程开始执行

        serverReceiveValue = GetIP().ToString() + "正在监听 ";

    }



    private void BeginListern()

    {

        LisSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化Socket

        IPAddress ServerIp = GetIP();/*获取本地服务器的ip地址  */

        IPEndPoint iep = new IPEndPoint(ServerIp, port);



        LisSocket.Bind(iep); /*将Socket绑定ip */

        LisSocket.Listen(50); //Socket开始监听

        newSocket = LisSocket.Accept();//获取连接请求的Socket

        /*接收客户端Socket所发的信息  */

        while (true)

        {

            try

            {



                byte[] byteMessage = new byte[100];

                newSocket.Receive(byteMessage);//接收信息

                point = newSocket.RemoteEndPoint;//获取客户端的Socket的相关信息

                IPEndPoint IPpoint = (IPEndPoint)point;

                strmes += IPpoint.Address.ToString() + "说" + Encoding.Default.GetString(byteMessage).Trim(new char[] { '\0' }) + "\r\n";

                serverReceiveValue = strmes;

            }



            catch (SocketException ex)

            {

                Debug.Log(ex.ToString());

                serverReceiveValue = ex.ToString();

            }

        }

    }



    private IPAddress GetIP()

    {     /*获取本地服务器的ip地址  */

        IPHostEntry iep = Dns.GetHostEntry(Dns.GetHostName());

        IPAddress ip = iep.AddressList[0];

        return ip;

    }



    private void SeverSend()

    {

        byte[] byteData = Encoding.Default.GetBytes(serverSendValue);

        newSocket.Send(byteData);//发送信息即由服务器往客户端上发信息

    }



}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值