统一构建游戏后,tcp网络无法正常工作

时间:2019-08-19 20:34:41

标签: c# unity3d tcp server client

当我在编辑器上进行测试时,我在游戏中实现了tcp网络,一切正常,但构建后没有任何效果。

我已经尝试过多次更改代码以使其正常工作,但似乎我的代码中缺少某些内容。

我还使用debug.log来控制它的动作,并且一切都可以在编辑器中正常工作,但在构建中却无法正常工作,我已经在普通版和调试版两个版本中构建了它。

我的代码没有错误。

在调试版本中,debug.log根本无法工作。

这是我的服务器代码

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

public class TCPTestServer : MonoBehaviour 
{   
    #region private members     
    /// <summary>   
    /// TCPListener to listen for incoming TCP connection   
    /// requests.   
    /// </summary>  
    public TcpListener tcpListener; 
    /// <summary> 
    /// Background thread for TcpServer workload.   
    /// </summary>  
    public Thread tcpListenerThread;    
    /// <summary>   
    /// Create handle to connected tcp client.  
    /// </summary>  
    public TcpClient connectedTcpClient;    
    #endregion  
    public Text ipadresstoconnect;
    public InputField inputip;
    public InputField inputport;
    public Text iptext;
    public int port;
    public Image online;
    public Image offline;
    public string ipv4 = IPManager.GetIP(ADDRESSFAM.IPv4);
    public bool isclienton;

    // Use this for initialization
    void Start () 
    {       
        // Start TcpServer background thread        
        //tcpListenerThread = new Thread (new ThreadStart(ListenForIncomingRequests));      
        //tcpListenerThread.IsBackground = true;        
        //tcpListenerThread.Start(); 

        iptext.text = ipv4;
        inputip.text = ipv4;
        inputport.text = "8052";
        online.enabled = false;
        offline.enabled = true;
        port = 8052;
    }   

    // Update is called once per frame
    void Update ()
    {   
        if (Input.GetKeyDown(KeyCode.Space)) 
        {             
            SendMessage();         
        }
        if (connectedTcpClient != null) 
        {             
            isclienton=true;
            isclientconnect();
        }

    }   

    /// <summary>   
    /// Runs in background TcpServerThread; Handles incoming TcpClient requests     
    /// </summary>  
    public void ListenForIncomingRequests () 
    {       
        try 
        {           
            // Create listener on localhost port 8052.

            tcpListener = new TcpListener(IPAddress.Parse(ipv4), port);             
            tcpListener.Start();              
            Debug.Log("Server is listening");              
            Byte[] bytes = new Byte[1024];              
            while (true) 
            {               
                using (connectedTcpClient = tcpListener.AcceptTcpClient()) 
                {                   
                    // Get a stream object for reading                  
                    using (NetworkStream stream = connectedTcpClient.GetStream()) 
                    {                       
                        int length;                         
                        // Read incoming stream into byte arrary.                       
                        while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) 
                        {                           
                            var incomingData = new byte[length];                            
                            Array.Copy(bytes, 0, incomingData, 0, length);                              
                            // Convert byte array to string message.                            
                            string clientMessage = Encoding.ASCII.GetString(incomingData);                          
                            Debug.Log("client message received as: " + clientMessage);                      
                        }                   
                    }               
                }           
            }       
        }       
        catch (SocketException socketException) 
        {           
            Debug.Log("SocketException " + socketException.ToString());         
        }     
    }   

    /// <summary>   
    /// Send message to client using socket connection.     
    /// </summary>  
    public void SendMessage() 
    {       
        if (connectedTcpClient == null) 
        {             
            return;         
        }       

        try 
        {           
            // Get a stream object for writing.             
            NetworkStream stream = connectedTcpClient.GetStream();          
            if (stream.CanWrite) 
            {                 
                string serverMessage = "This is a message from your server.";           
                // Convert string message to byte array.                 
                byte[] serverMessageAsByteArray = Encoding.ASCII.GetBytes(serverMessage);               
                // Write byte array to socketConnection stream.               
                stream.Write(serverMessageAsByteArray, 0, serverMessageAsByteArray.Length);               
                Debug.Log("Server sent his message - should be received by client");           
            }       
        }       
        catch (SocketException socketException) 
        {             
            Debug.Log("Socket exception: " + socketException);         
        }   
    }

    public void SendMessage2() 
    {       
        if (connectedTcpClient == null) 
        {             
            return;         
        }       

        try 
        {           
            // Get a stream object for writing.             
            NetworkStream stream = connectedTcpClient.GetStream();          
            if (stream.CanWrite) 
            {                 
                string serverMessage = "A new server is about start listen in -->" + ipadresstoconnect.text.ToString();             
                // Convert string message to byte array.                 
                byte[] serverMessageAsByteArray = Encoding.ASCII.GetBytes(serverMessage);               
                // Write byte array to socketConnection stream.               
                stream.Write(serverMessageAsByteArray, 0, serverMessageAsByteArray.Length);               
                Debug.Log("Server has sent the message...");
                isclienton=false;
            }       
        }       
        catch (SocketException socketException) 
        {             
            Debug.Log("Socket exception: " + socketException);         
        }   
    }

    public void start_server()
    {
        // Start TcpServer background thread        
        tcpListenerThread = new Thread (new ThreadStart(ListenForIncomingRequests));        
        tcpListenerThread.IsBackground = true;      
        tcpListenerThread.Start();
        SendMessage2 ();
    }

    public void isclientconnect()
    {
        if (isclienton=true) 
        {
            if (connectedTcpClient != null) 
            {             
                SendMessage2();          
            }
        }
    }
}

这是我的客户代码

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

public class TCPTestClient : MonoBehaviour 
{   
    #region private members     
    public TcpClient socketConnection;  
    public Thread clientReceiveThread;  
    #endregion      
    public Text nickname;
    public int id;
    public string ipv4_v2 = IPManager.GetIP(ADDRESSFAM.IPv4);

    // Use this for initialization  
    void Start () 
    {
        //ConnectToTcpServer();     
    }   
    // Update is called once per frame
    void Update () 
    {         
        if (Input.GetKeyDown(KeyCode.Space)) 
        {             
            SendMessage();         
        }     
    }   

    /// <summary>   
    /// Setup socket connection.    
    /// </summary>  
    public void ConnectToTcpServer () 
    {       
        try 
        {           
            clientReceiveThread = new Thread (new ThreadStart(ListenForData));          
            clientReceiveThread.IsBackground = true;            
            clientReceiveThread.Start();        
        }       
        catch (Exception e) 
        {           
            Debug.Log("On client connect exception " + e);      
        }   
    }   

    /// <summary>   
    /// Runs in background clientReceiveThread; Listens for incoming data.  
    /// </summary>     
    public void ListenForData() 
    {       
        try 
        {           
            socketConnection = new TcpClient("169.254.87.130", 8052);           
            Byte[] bytes = new Byte[1024];             
            while (true) 
            {               
                // Get a stream object for reading              
                using (NetworkStream stream = socketConnection.GetStream()) 
                {                   
                    int length;                     
                    // Read incoming stream into byte arrary.                   
                    while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) 
                    {                       
                        var incomingData = new byte[length];                        
                        Array.Copy(bytes, 0, incomingData, 0, length);                      
                        // Convert byte array to string message.                        
                        string serverMessage = Encoding.ASCII.GetString(incomingData);                      
                        Debug.Log("server message received as: " + serverMessage);                  
                    }               
                }           
            }         
        }         
        catch (SocketException socketException) 
        {             
            Debug.Log("Socket exception: " + socketException);         
        }     
    }   

    /// <summary>   
    /// Send message to server using socket connection.     
    /// </summary>  
    public void SendMessage() 
    {         
        if (socketConnection == null) 
        {             
            return;         
        }       
        try 
        {           
            // Get a stream object for writing.             
            NetworkStream stream = socketConnection.GetStream();            
            if (stream.CanWrite) 
            {                 
                string clientMessage = "This is a message from one of your clients.";               
                // Convert string message to byte array.                 
                byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);               
                // Write byte array to socketConnection stream.                 
                stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);                 
                Debug.Log("Client sent his message - should be received by server");             
            }         
        }       
        catch (SocketException socketException) 
        {             
            Debug.Log("Socket exception: " + socketException);         
        }     
    }

    public void connect()
    {
        ConnectToTcpServer();
    }

    public void SendMessageonconnect() 
    {         
        if (socketConnection == null) 
        {             
            return;         
        }       
        try 
        {           
            // Get a stream object for writing.             
            NetworkStream stream = socketConnection.GetStream();            
            if (stream.CanWrite) 
            {                 
                string clientMessage = nickname.ToString();                 
                // Convert string message to byte array.                 
                byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);               
                // Write byte array to socketConnection stream.                 
                stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);                 
                Debug.Log("Client sent his message - should be received by server-->" + nickname.text.ToString());             
            }         
        }       
        catch (SocketException socketException) 
        {             
            Debug.Log("Socket exception: " + socketException);         
        }     
    }
}

2 个答案:

答案 0 :(得分:2)

在服务器代码中以tcpListenerThread开始并在客户端代码中调用ConnectToTcpServer();的行已被注释掉。 似乎没有调用两种方法start_server()connect()。 这可能是为什么在构建中它不起作用的原因。

此外,您尚未实现在退出应用程序时杀死这些进程的例程,并且Unity不会跟踪您创建的线程,也不会自行杀死它们。这可能是您的应用程序似乎可以在编辑器中运行的原因。我想您首先用这些行来运行它,然后再将它们注释掉。在随后的时间内,您点击 play ,线程从第一次开始就仍在运行。

在使用完这些线程后,您应该绝对实现某种例程来杀死它们。

答案 1 :(得分:0)

即使这个问题很老 - 我最近遇到了一个类似的问题,想分享一下这个问题是什么。

  1. 如果您构建到 Android,请确保在播放器配置文件中启用了互联网连接

  2. 当应用程序“从编辑器运行”时,Unity 似乎有一个虚拟网络。因此,您不仅要构建客户端,还要构建服务器应用程序。构建客户端无法连接到“在编辑器中运行”服务器。