2013-09-27 81 views
0

我想讓我的統一應用程序像服務器一樣工作,並讀取正在發送給它的一些TCP字符串。然而,我目前的代碼似乎凍結了我的程序,我不得不進入任務管理器退出。閱讀TCP數據死機Unity

可以有更多的TCP連接知識的人看看我的代碼,看看我做錯了什麼,這是什麼原因?

我的整個類如下:

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

    // Use this for initialization 
    void Start() 
    { 
     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     var ipAddress = IPAddress.Parse(ip_address); 
     EndPoint ep = new IPEndPoint(ipAddress, port); 
     socket.Connect(ep); 

     while(socket.Connected) 
     { 
      byte[] bytes = new byte[256]; 
      int i = socket.Receive(bytes); 
      Debug.Log(Encoding.UTF8.GetString(bytes)); 
     } 
    } 

    // Update is called once per frame 
    void Update() { 

    } 
} 

我有一個請求,我這門學科的知識是非常有限的,如果你犯了一個建議,我怎麼能解決這個問題請你要麼把一個代碼示例,以便我可以看到如何實現它或鏈接到可以閱讀的內容以獲取更多信息?

+0

套接字在連接後會斷開連接嗎?如果沒有,那麼你基本上已經建立了一個無限循環。 – Sam

+0

不,因爲我想要連接的套接字不斷地向它傳輸數據。 – Sean

+0

好的,這個類是異步執行的嗎? – Sam

回答

1

socket.Receive(bytes);是一個阻塞調用,這意味着它會把線程休眠,直到它收到一些東西。您應該將呼叫移至與外部循環一起的獨立線程(因此它不再阻止您的主線程)或使用異步版本BeginRecieve並用異步模型替換循環(檢查鏈接的示例)

0

socket.Receive(bytes)將阻止當前線程。您可以查看異步任務或異步套接字。

byte[] buffer = new byte[count]; 
socket.BeginReceive(buffer, 0, count, SocketFlags.None, (asyncResult) => 
{ 
    int bytesRead = socket.EndReceive(asyncResult); 
    if(bytesRead == 0) 
    { 
     // disconnected. 
    } 
} 

這裏有一個例子:http://csharp.vanlangen.biz/network-programming/async-sockets/asyncsocketreader/

的例子將讀取的字節一定量,然後調用你作爲參數傳遞的行動。