2

これはこの質問の続きです

昨夜さらにグーグルで調べた後、IPアドレスとポート番号で接続を検索し、送信されているデータを表示できる、従うことができる素敵なTCPチュートリアルを見つけることができました。

ただし、クライアントが一度接続すると、メッセージを送信してデバッグ ログに表示するという問題がありますが、アプリケーションを停止して再度実行すると、Unity がフリーズします。なぜこれが起こったのか、私は途方に暮れています。誰かがこのコードを調べて、それがどこで発生している可能性があるか、およびそれを修正するために何ができるかを確認していただけますか?

また、メッセージを受信するとすぐに接続が切れるように見えますが、それはなぜですか? サーバーは再接続できますが、一度接続したら接続を維持したいと思います。

public class TCP : MonoBehaviour 
{   
    string ip_address  = "127.0.0.1";
int port = 22;

Thread listen_thread;
TcpListener tcp_listener;
Thread clientThread;
TcpClient tcp_client;
bool isTrue = true;

// Use this for initialization
void Start () 
{
    IPAddress ip_addy = IPAddress.Parse(ip_address);
    tcp_listener = new TcpListener(ip_addy, port);
    listen_thread = new Thread(new ThreadStart(ListenForClients));
    listen_thread.Start();


    Debug.Log("start thread");

}

private void ListenForClients()
{
    this.tcp_listener.Start();

    while(isTrue == true)   
    {
        //blocks until a client has connected to the server
        TcpClient client = this.tcp_listener.AcceptTcpClient();

        //create a thread to handle communication 
        //with connected client
        clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
        clientThread.Start(client);


        Debug.Log("Got client " + client);

    }
}

private void HandleClientComm(object client)
{
     tcp_client = (TcpClient)client;
    NetworkStream client_stream = tcp_client.GetStream();


    byte[] message = new byte[4096];
    int bytes_read;

    while(isTrue == true)
    {
        bytes_read = 0;

        try
        {
            //blocks until a client sends a message
            bytes_read = client_stream.Read(message, 0, 4096);
            //Debug.Log(message);

        }
        catch (Exception e)
        {
          //a socket error has occured
          Debug.Log(e.Message);
          break;
        }

        if(bytes_read == 0)
        {
            //client has disconnected
            Debug.Log("Disconnected");
            tcp_client.Close();
            break;
        }

        ASCIIEncoding encoder = new ASCIIEncoding();
        Debug.Log(encoder.GetString(message,0,bytes_read));


    }

    if(isTrue == false)
    {
        tcp_client.Close();
        Debug.Log("closing tcp client");
    }

}

void OnApplicationQuit()
{
    try
    {
        tcp_client.Close();
        isTrue = false;
    }
    catch(Exception e)
    {
        Debug.Log(e.Message);
    }
}

}

これは、何が起こっているかを示すために、私のデバッグ ログのスクリーン ショットでもあります。 ここに画像の説明を入力

アップデート

クライアントのキックを修正した更新されたコード。Unity アプリケーションを停止して再起動しても、フリーズの問題は解決しません。

さらなる更新 もう少し実験を重ねた結果、プロジェクトが実際にはフリーズしていないことがわかりました。サーバー(Unity)アプリを初めて起動すると、すべて正常に動作します。しかし、それを閉じてサーバーを再実行しようとすると、クライアントで接続するまでフリーズします。その時点で、サーバーは通常どおり動作します。

したがって、サーバーを閉じるときに開いているソケットを閉じていないと思います。どうやってやるの?

4

1 に答える 1