TcpClient
基本的に必要なのはp2p接続です。現在、 sを介して互いに通信している非同期サーバーとクライアントがあります。問題は、サーバーが着信メッセージをほとんど検出せず、通常は最初のメッセージしか受信しないことです。私のサーバーコードはここにあります:
public void RecieveAsync()
{
if (netStream == null) netStream = Server.GetStream();
netStream.BeginRead(ReadBuffer, 0, ReadBuffer.Length, recieveCallBack, netStream);
}
public void recieveCallBack(IAsyncResult ar)
{
//try
//{
int rec = netStream.EndRead(ar);
if (rec == 0)
{
if (Disconnected != null)
{
Disconnected(this);
return;
}
}
else
{
if (DataRecieved != null)
{
string RecievedData = Encoding.ASCII.GetString(ReadBuffer, 0, rec);
DataRecieved(RecievedData);
}
ReadBuffer = new byte[1024];
}
}
Thread.Sleep(1)
データを送信するクライアント コードはここにあります (プレーヤーの位置を更新するために、データを で何度も送信する while ループにラップされます)
public void Send(byte[] data, int index, int length)
{
//add data as state
//socket.NoDelay = true;
Buffer.BlockCopy(data, 0, writeBuffer, index, length);
if (netStream == null) netStream = TcpClient.GetStream();
netStream.BeginWrite(writeBuffer, 0, writeBuffer.Length, sendCallback, netStream);
}
private void sendCallback(IAsyncResult ar)
{
//try
//{
netStream.EndWrite(ar);
//if (ar.AsyncState != null)
//{
// byte[] buffer = (byte[])ar.AsyncState;
// socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, sendCallback, null);
// return;
//}
if (OnSend != null)
{
OnSend(this);
}
//catch (Exception ex)
//{
// System.Windows.Forms.MessageBox.Show(ex.ToString());
// return;
//}
}
デフォルトのバッファ サイズは 1024 で、が true のRecieveAsync
場合にのみ呼び出さnetStream.DataAvailible
れ、サーバー ループで常にチェックされます。
編集 ::
これはサーバーを呼び出すコードです
while (true)
{
byte[] playerData = NormalText(PreparePlayerData());
server.Send(playerData, 0, playerData.Length);
if (server.Server.Connected)
{
server.netStream = server.Server.GetStream();
while (server.netStream.DataAvailable)
{
server.RecieveAsync();
server.netStream = server.Server.GetStream();
}
}
Thread.Sleep(1);
}