私はこれで髪を引っ張っています。サーバーにいくつかのデータを送信しているので、それをバッファに入れてからバッファを送信します。すべて問題ないように見えますが、サーバー上では文字列がさまざまな時点で途切れているため、たとえば、「12345678901234567890123456789012」ではなく「1234567890123\0\0\0...」と表示されます。
すべての int は正常に機能し、正常に転送されます。メッセージ全体が伝わらない理由は誰にもわかります。サーバーはストリームからメッセージ全体を読み取り、未読のバイトはなく、クライアントは 68 を送信し、サーバーは 68 バイトを取得します。それはエンコーディングでしょうか?
iPhoneのコードは次のとおりです。
int command = 0;
int msgLen =0;
int bytesSent;
(void)memcpy(_data, &command, sizeof(int)); msgLen++;
(void)memcpy(_data+2, &playerID, sizeof(int)); msgLen++;
NSString *response = [NSString stringWithString:@"12345678901234567890123456789012"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSUnicodeStringEncoding]];
(void)memcpy(_data+3, [data bytes], [data length]);
msgLen += [data length];
(void)memcpy(_data+1, &msgLen, sizeof(int)); msgLen++;
bytesSent = [outputStream write:(const uint8_t *)_data maxLength:msgLen];
NSLog(@"sent %d of %d",bytesSent, msgLen);
ここにC#コードがあります
private void JoinServer(TcpClient client, byte[] buffer)
{
int offset = 0;
int playerid = BitConverter.ToInt32(buffer, offset);
offset += 4;
var playerkey = Encoding.Unicode.GetString(buffer, offset, buffer.Length-4);
System.Diagnostics.Debug.WriteLine(playerkey, "JoinPlayerReceived");
try
{
GetSubscriberByClient(client).PlayerId = playerid;
SendJoinServerStatus(playerid, playerid);
}
catch (Exception)
{
SendJoinServerStatus(playerid, 0);
}
}