Ich möchte über einen NEtworkStream eines TcpClient Strings versenden.
Dazu verwende ich folgenden Code:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
private void btnConnect_Click(object sender, EventArgs e)
{
encoding = new ASCIIEncoding();
client = new TcpClient();
client.Connect(GetEndPointFromTB());
stream = client.GetStream(); // funktioniert
stream.Write(BytesByInt((int)MessageID.ClientData), 0, 4); // MessageID, funktioniert
stream.Write(BytesByInt(encoding.GetByteCount(tbName.Text)), 4, 4); // Größe des Strings für Auslesen vom Server
stream.Write(encoding.GetBytes(tbName.Text), 8, encoding.GetByteCount(tbName.Text)); // String
stream.Flush();
}
|
Problem: encoding.GetByteCount löst in dem dritten Write() eine OutOfRangeException aus. Parameter: size
Logische Schlussfolgerung: Ein Integer wird zurückgegeben der zu groß ist. Allerdings müsste GetByteCount() selber dann doch auch eine Exception auslösen. Außerdem funktioniert es im 2ten Write()
tbName enthält: bird
Code vom Server falls wer braucht:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
private void HandleClientComm(object client) //ParameterizedThread
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
Console.WriteLine("PECH");
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
break;
}
if (bytesRead == 0)
{
Console.WriteLine("DISCONNECT: {0}", ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString());
break; // disconnected
}
MessageID id = (MessageID)BitConverter.ToInt32(message, 0);
switch (id)
{
case MessageID.TakeRole:
Console.WriteLine("Neue Anfrage: TakeRole");
break;
case MessageID.ClientData:
int numBytes = BitConverter.ToInt32(message, 4);
string name = encoding.GetString(message, 8, numBytes);
Console.WriteLine("NAME: {0} ",name);
clients.Add((TcpClient)client, name);
break;
}
}
}
|
BTW: gibts eine andere Möglichkeit Strings zu versenden?