0
我在TCP客戶套接字中的連接處理有問題。TCP套接字客戶端異步 - 連接處理
此代碼應連接到4444端口的本地主機,並偵聽來自此TCP服務器的所有傳入數據。
我需要爲此編寫連接處理。例如,如果嘗試連接服務器時沒有響應,它應該嘗試重新連接,或者如果連接已準備就緒,並且在接收到某些數據後TCP服務器將關閉連接,則TCP客戶端應嘗試重新連接。
誰能幫我解決這個問題
以下是我在這一刻
using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
public class TCPClientNew : MonoBehaviour {
private Socket _clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
private byte[] _recieveBuffer = new byte[8142];
private void StartClient()
{
try
{
_clientSocket.Connect(new IPEndPoint(IPAddress.Loopback,4444));
}
catch(SocketException ex)
{
Debug.Log(ex.Message);
// Try to reconnect ?? TODO
}
Debug.Log ("connected");
_clientSocket.BeginReceive(_recieveBuffer,0,_recieveBuffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallback),null);
}
private void ReceiveCallback(IAsyncResult AR)
{
//Check how much bytes are recieved and call EndRecieve to finalize handshake
int recieved = _clientSocket.EndReceive(AR);
if(recieved <= 0)
return;
//Copy the recieved data into new buffer , to avoid null bytes
byte[] recData = new byte[recieved];
Buffer.BlockCopy(_recieveBuffer,0,recData,0,recieved);
//Processing received data
Debug.Log (System.Text.Encoding.ASCII.GetString(recData));
//Start receiving again
_clientSocket.BeginReceive(_recieveBuffer,0,_recieveBuffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallback),null);
}
private void SendData(byte[] data)
{
SocketAsyncEventArgs socketAsyncData = new SocketAsyncEventArgs();
socketAsyncData.SetBuffer(data,0,data.Length);
_clientSocket.SendAsync(socketAsyncData);
}
void Start()
{
StartClient();
}
}
呃......代碼唯一的答案,特別是這個長度之一,對未來的用戶(以及潛在的提問者)來說可能很難遵循。你能否給我添加一些你改變的解釋,最好是指出OP出錯的地方,你做了什麼修復? – Serlite
@Serlite肯定,問題。我只是通過改變幾行來修改OPs類。我會評論 – Mangist
@Mangist如果TCP服務器沒有響應,我嘗試了通過這個解決方案凍結Unity的方法。可能嗎?或者我以錯誤的方式執行它? – seek