Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

目录

一.目的

1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息

二.参考

1.unity3D中使用Socket进行数据通信(三)

三.操作:一:完成:在同一个Unity的同一个物体上面添加 服务端、客户端代码

1.下载

1.版本

1.运行结果+Unity设置

1.代码:MyNetTest03_SocketServer.cs

1.代码:MyNetTest03_SocketClient.cs

三.操作:二:完成:同一个电脑,都是编辑器中,一个是Unity服务端、一个是Unity客户端

1.版本

1.运行结果

1.服务端代码:MyNetTest04_SocketServer.cs

1.客户端代码:MyNetTest04_socketClient.cs


一.目的

1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息

二.参考

1.unity3D中使用Socket进行数据通信(三)

https://blog.csdn.net/qq_38112703/article/details/82624502

  1. 总结:good:下面操作也是借鉴这个文章

三.操作:一:完成:在同一个Unity的同一个物体上面添加 服务端、客户端代码

1.下载

Unity3D的TCP/socket通信.rar

1.版本

  1. unity2018.4.0f1
  2. vs2017
  3. windows10 64位

1.运行结果+Unity设置

  1. 总结:服务端、客户端代码都在一个物体上面,按下数字键1、2出现输出

1.代码:MyNetTest03_SocketServer.cs

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System;

/// <summary>
/// 功能:scoket服务器监听端口脚本
/// </summary>
public class MyNetTest03_SocketServer : MonoBehaviour
{
    /// <summary>Thread:定义启动socket的线程</summary>
    private Thread thStartServer;

    /// <summary>string:ip地址</summary>
    private string str_ip = "192.168.43.167";

    /// <summary>string:ip的端口号</summary>
    private string str_port = "8080";

    void Start()
    {
        thStartServer = new Thread(StartServer);
        thStartServer.Start();//启动该线程
    }

    void Update()
    {
    }

    private void StartServer()
    {
        const int bufferSize = 8792;//缓存大小,8192字节

        //IPAddress ip = IPAddress.Parse("192.168.0.13");

        //TcpListener tlistener = new TcpListener(ip, 10001);

        TcpListener tlistener = new TcpListener(IPAddress.Parse(str_ip), int.Parse(str_port));

        tlistener.Start();

        Debug.Log("Socket服务器监听启动......");

        TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的客户端,阻塞方法

        Debug.Log("客户端已连接!local:" + remoteClient.Client.LocalEndPoint + "<---Client:" + remoteClient.Client.RemoteEndPoint);

        NetworkStream streamToClient = remoteClient.GetStream();//获得来自客户端的流

        do
        {
            try //直接关掉客户端,服务器端会抛出异常
            {
                //接收客户端发送的数据部分
                byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组

                int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据搞入缓存中(有朋友说read()是阻塞方法,测试中未发现程序阻塞)
                if (byteRead == 0)//连接断开,或者在TCPClient上调用了Close()方法,或者在流上调用了Dispose()方法。
                {
                    Debug.Log("客户端连接断开......");
                    break;
                }

                string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法
                Debug.Log("服务端 接收数据:" + msg + ".数据长度:[" + byteRead + "byte]");
            }
            catch (Exception ex)
            {
                Debug.Log("客户端异常:" + ex.Message);
                break;
            }
        }
        while (true);
    }

    void OnApplicationQuit()
    {
        thStartServer.Abort();//在程序结束时杀掉线程,想起以前老谢给我讲的,起线程就像拉屎,完事一定要记得自己擦,系统不会给你擦,经测试不擦第二次启动unity会无响应
        Debug.Log("程序结束了,杀掉thStartServer线程");
    }

}

1.代码:MyNetTest03_SocketClient.cs

//using System.Collections;
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;

public class MyNetTest03_SocketClient : MonoBehaviour
{
    /// <summary>string:ip地址</summary>
    private string str_ip_server = "192.168.43.167";

    /// <summary>string:ip的端口号</summary>
    private string str_port_server = "8080";

    TcpClient client;

    void Start()
    {
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            Client();
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            SimulateMultiUserClient();
        }
    }

    private void Client()
    {
        client = new TcpClient();

        try
        {
            //client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞
            client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞
        }
        catch (Exception ex)
        {
            Debug.Log("客户端连接异常:" + ex.Message);
        }
        Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);

        //客户端发送数据部分
        for (int i = 0; i < 2; i++)
        {
            try
            {
                string msg = "hello server i am No " + i;

                NetworkStream streamToServer = client.GetStream();//获得客户端的流

                byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制

                streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送

                Debug.Log("客户端 发出消息:" + msg);
            }
            catch (Exception ex)
            {
                Debug.Log("服务端产生异常:" + ex.Message);
            }
        }

    }


    private void SimulateMultiUserClient()
    {
        for (int i = 0; i < 2; i++)
        {
            client = new TcpClient();
            try
            {
                //client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//连接到服务器端
                client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//连接到服务器端
            }
            catch (Exception ex)//抛出连接错误的异常
            {
                Debug.Log("客户端连接异常:" + ex.Message);
            }

            Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);

            //客户端发送数据部分
            string msg = "hello server i am No " + i;

            NetworkStream streamToServer = client.GetStream();//获得客户端的流

            byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制

            streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送

            Debug.Log("发出消息:" + msg);

        }
    }

}

三.操作:二:完成:同一个电脑,都是编辑器中,一个是Unity服务端、一个是Unity客户端

1.版本

  1. Unity2018.4.0f
  2. vs2017
  3. windos10 64

1.运行结果

  1. 同一个电脑,都是编辑器中,一个是服务端、一个是客户端

1.服务端代码:MyNetTest04_SocketServer.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System;
using System.Net.NetworkInformation;

/// <summary>
/// 功能:scoket服务器监听端口脚本
/// </summary>
public class MyNetTest04_SocketServer : MonoBehaviour
{
    /// <summary>Thread:定义启动socket的线程</summary>
    private Thread thStartServer;

    /// <summary>string:ip地址</summary>
    private string str_ip_server = "192.168.43.167";

    /// <summary>string:ip地址</summary>
    //private string str_ip_server { set; get; }

    /// <summary>string:ip的端口号</summary>
    private string str_port_server = "12306";


    void Start()
    {
        // str_ip_server=
        // IPAddress

        //str_ip_server = Network.player.ipAddress;
        // str_ip_server =Net

        //string ip = GetIP();
        //Debug.Log("本机IP:" + ip);

        str_ip_server = GetIP();

        thStartServer = new Thread(StartServer);
        thStartServer.Start();//启动该线程
    }

    void Update()
    {
    }

    /// <summary>
    /// 获取本机IP
    /// </summary>
    /// <returns>string :ip地址</returns>
    public string GetIP()
    {
        string output = "";

        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
        {
            NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211;  //无线局域网适配器 

            if ((item.NetworkInterfaceType == _type1) && item.OperationalStatus == OperationalStatus.Up)
            {
                foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
                {
                    if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        output = ip.Address.ToString();
                    }
                }
            }
        }
        return output;
    }


    private void StartServer()
    {
        const int bufferSize = 8792;//缓存大小,8192字节

        //IPAddress ip = IPAddress.Parse("192.168.0.13");

        //TcpListener tlistener = new TcpListener(ip, 10001);

        TcpListener tlistener = new TcpListener(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));

        tlistener.Start();

        Debug.Log("Socket服务器监听启动......");

        TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的客户端,阻塞方法

        Debug.Log("客户端已连接!local:" + remoteClient.Client.LocalEndPoint + "<---Client:" + remoteClient.Client.RemoteEndPoint);

        NetworkStream streamToClient = remoteClient.GetStream();//获得来自客户端的流

        do
        {
            try //直接关掉客户端,服务器端会抛出异常
            {
                //接收客户端发送的数据部分
                byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组

                int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据搞入缓存中(有朋友说read()是阻塞方法,测试中未发现程序阻塞)
                if (byteRead == 0)//连接断开,或者在TCPClient上调用了Close()方法,或者在流上调用了Dispose()方法。
                {
                    Debug.Log("客户端连接断开......");
                    break;
                }

                string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法
                Debug.Log("服务端 接收数据:" + msg + ".数据长度:[" + byteRead + "byte]");
            }
            catch (Exception ex)
            {
                Debug.Log("客户端异常:" + ex.Message);
                break;
            }
        }
        while (true);
    }

    void OnApplicationQuit()
    {
        thStartServer.Abort();//在程序结束时杀掉线程,想起以前老谢给我讲的,起线程就像拉屎,完事一定要记得自己擦,系统不会给你擦,经测试不擦第二次启动unity会无响应
        Debug.Log("程序结束了,杀掉thStartServer线程");
    }

}

1.客户端代码:MyNetTest04_socketClient.cs

  1. 先打开Unity的服务端,在开启客户端
  2. 按下字母上面的1、2进行和服务端连接和发送消息
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;

/ <summary>
/ 功能:单独的unity作为客户端,
/ </summary>
public class MyNetTest04_socketClient : MonoBehaviour
{
    /// <summary>string:ip地址</summary>
    private string str_ip_server = "192.168.43.167";

    /// <summary>string:ip的端口号</summary>
    private string str_port_server = "12306";

    TcpClient client;

    void Start()
    {
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            Client();
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            SimulateMultiUserClient();
        }
    }

    private void Client()
    {
        client = new TcpClient();

        try
        {
            //client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞
            client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞
        }
        catch (Exception ex)
        {
            Debug.Log("客户端连接异常:" + ex.Message);
        }
        Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);

        //客户端发送数据部分
        for (int i = 0; i < 2; i++)
        {
            try
            {
                string msg = "hello server i am No " + i;

                NetworkStream streamToServer = client.GetStream();//获得客户端的流

                byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制

                streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送

                Debug.Log("客户端 发出消息:" + msg);
            }
            catch (Exception ex)
            {
                Debug.Log("服务端产生异常:" + ex.Message);
            }
        }

    }


    private void SimulateMultiUserClient()
    {
        for (int i = 0; i < 2; i++)
        {
            client = new TcpClient();
            try
            {
                //client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//连接到服务器端
                client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//连接到服务器端
            }
            catch (Exception ex)//抛出连接错误的异常
            {
                Debug.Log("客户端连接异常:" + ex.Message);
            }

            Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);

            //客户端发送数据部分
            string msg = "hello server i am No " + i;

            NetworkStream streamToServer = client.GetStream();//获得客户端的流

            byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制

            streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送

            Debug.Log("发出消息:" + msg);

        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_40544338/article/details/117256558#comments_21717212