I Nachricht über TCP/IP in C# Anwendung zu senden versuchen senden mit TCPClient
und TCPListner
Klassenkann nicht zweite Nachricht über TCP/IP
Es folgt mein Code, die ich von Codeproject Seite bekam.
Kundecode written over btn click
try
{
TcpClient tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");
tcpclnt.Connect("192.168.0.102", 8001);
// use the ipaddress as in the server program
Console.WriteLine("Connected");
//Console.Write("Enter the string to be transmitted : ");
String str = textBox1.Text;
Stream stm = tcpclnt.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(str);
Console.WriteLine("Transmitting.....");
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
tcpclnt.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error..... " + ex.Message);
}
Servercode written on form_load
try
{
IPAddress ipAd = IPAddress.Parse("192.168.0.102");
// use local m/c IP address, and
// use the same in the client
/* Initializes the Listener */
TcpListener myList = new TcpListener(ipAd, 8001);
/* Start Listeneting at the specified port */
myList.Start();
Console.WriteLine("The server is running at port 8001...");
Console.WriteLine("The local End point is :" +
myList.LocalEndpoint);
Console.WriteLine("Waiting for a connection.....");
Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
byte[] b = new byte[100];
int k = s.Receive(b);
Console.WriteLine("Recieved...");
string str = string.Empty;
for (int i = 0; i < k; i++)
{
Console.Write(Convert.ToChar(b[i]));
str = str + Convert.ToChar(b[i]);
}
label1.Text = str;
ASCIIEncoding asen = new ASCIIEncoding();
s.Send(asen.GetBytes("The string was recieved by the server."));
Console.WriteLine("\nSent Acknowledgement");
/* clean up */
s.Close();
// myList.Stop();
}
Hier am client
, ich bin Zeichenfolge in Textbox über tcp
geschrieben Senden und es erhielt auch von server
.
Aber wenn ich versuche, eine andere Zeichenfolge zu senden, scheitert es ohne exception
und Client-Anwendung hängt für unbegrenzte Zeit.
Was ist hier falsch?
Das ist nicht Ihr Hauptproblem: TCP/IP ist streambasiert, nicht nachrichtenbasiert. Code wie dieser ist fatal fehlerhaft: Sie dürfen niemals annehmen, dass ein bestimmter Aufruf von "Receive" eine bestimmte Anzahl von Bytes empfängt. Alles was Sie sicher sein können ist, dass, wenn der Client 'N' Bytes schreibt, irgendeine Kombination von' Receive' Rufe schließlich alle 'N' Bytes empfangen wird. Code wie dieser kann in Test-Setups über lokale Sockets gut funktionieren und bei der Verwendung in einem tatsächlichen Netzwerk schlecht ausfallen. –