1

これは私のコードです

using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Net.Sockets;

public class s_TCP : MonoBehaviour {

internal Boolean socketReady = false;

TcpClient mySocket;
NetworkStream theStream;
StreamWriter theWriter;
StreamReader theReader;
String Host = "198.57.44.231";
Int32 Port = 1337;
string channel = "testingSona";

void Start () {   
    setupSocket();
    //string msg = "__SUBSCRIBE__"+channel+"__ENDSUBSCRIBE__";
    string msg = "Sending By Sona";
    writeSocket(msg);
    readSocket();

}
void Update () {
    //readSocket();
}

public void setupSocket() { 
    try {
        mySocket = new TcpClient(Host, Port);
        theStream = mySocket.GetStream(); 
        theWriter = new StreamWriter(theStream);
        theReader = new StreamReader(theStream);
        socketReady = true;         
    }
    catch (Exception e) {
        Debug.Log("Socket error: " + e);
    }
}
public void writeSocket(string theLine) {
    if (!socketReady)
        return;
    String foo = theLine + "\r\n";
    theWriter.Write(foo);
    theWriter.Flush();

}
public String readSocket() { 
    if (!socketReady)
        return ""; 
    if (theStream.DataAvailable){           
        string message = theReader.ReadLine();
        print(message);print(12345);
        return theReader.ReadLine();
    }
    else{print("no value");
        return "";
    }

}
public void closeSocket() {
    if (!socketReady)
        return;
    theWriter.Close();
    theReader.Close();
    mySocket.Close();
    socketReady = false;
}

}

接続が作成されました。しかし、メッセージはサーバーに書き込まれず、読み取られません

どうすればできますか

4

1 に答える 1

0

http://answers.unity3d.com/questions/15422/unity-project-and-3rd-party-apps.htmlからこのコードを取得したと思いますが、このコードにはエラーがあると思います。私はそこに投稿したことをここで繰り返します。

次のコードは正しく機能しません。

public String readSocket() {
  if (!socketReady)
    return "";
  if (theStream.DataAvailable)
    return theReader.ReadLine();
  return "";
}

これにより、かなりの数時間頭痛が発生しました。ストリームでDataAvailable を確認することは、 streamreaderで読み取るデータがあるかどうかを確認する信頼できる方法ではないと思います。したがって、DataAvailable をチェックする必要はありません。ただし、それを削除すると、読み取るものがなくなったときにコードが ReadLine でブロックされます。代わりに、ストリームからの読み取りのタイムアウトを設定して、(たとえば) 1 ミリ秒以上待機しないようにする必要があります。

theStream.ReadTimeout = 1;

そして、次のようなものを使用できます。

public String readSocket() {
    if (!socketReady)
        return "";
    try {
        return theReader.ReadLine();
    } catch (Exception e) {
        return "";
    }
}

このコードは完璧ではありません。まだ改善する必要があります (たとえば、発生した例外の種類を確認し、適切に処理するなど)。そして、これを全体的に行うためのより良い方法があるかもしれません (私は Peek() を使用して実験しましたが、それが返す -1 は、ソケットが閉じるときのものであり、今のところ読み取るデータがなくなったときだけではないと思われます)。ただし、これにより、投稿されたコードの問題が解決されるはずです。サーバーからデータが欠落している場合は、おそらくリーダー ストリームに存在し、新しいデータがサーバーから送信されてストリームに保存され、theStream.DataAvailable が true を返すまで読み取られません。

于 2013-11-16T14:47:09.310 に答える