2013-07-18 63 views
1

這用插座是我的代碼寫入和讀出團結3D

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; 
} 

}創建

連接。但消息未寫入服務器和閱讀

我該怎麼辦呢

回答

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不是檢查流讀取器上是否有數據要讀取的可靠方法。所以你不想檢查DataAvailable。但是,如果你只是刪除它,那麼當沒有更多的閱讀時,代碼將在ReadLine上阻塞。因此,相反,你需要設置一個超時從流中讀取,這樣你就不會等待更長的時間比(比如說)毫秒:

theStream.ReadTimeout = 1; 

然後,你可以使用類似:

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

這段代碼並不完美,我仍然需要改進它(例如,檢查引發了什麼樣的異常,並且適當地處理它)。總的來說,這樣做有更好的方法(我使用Peek()進行了實驗,但是它返回的-1我懷疑是在套接字關閉時,而不是當前沒有更多數據要讀取時)。但是,這應該可以解決發佈代碼的問題,就像我所遇到的那樣。如果您發現服務器中缺少數據,那麼它可能位於您的閱讀器流中,直到從服務器發送新數據並將其存儲在流中,以至於StreamStream.DataAvailable返回true時纔會被讀取。

+0

爲了防止任何人感興趣,上述方法不是處理套接字的正確方法。但我不記得爲什麼。另外,我在ReadTimeout設置上被Windows機器忽略時遇到了麻煩。有一種更好的方法來處理潛伏在Unity維基上的套接字iirc。 – saward