我用Java创建了一个客户端,想要向我的C#服务器发送一些数据。
问题在于,如果我在客户端中写入例如“hello”,我只收到第一个字母。在字节数组中只有一个元素。
我猜测问题出在服务器端,因为在我的Java服务器上一切正常,所以Java客户端也可以正常工作。
有人看到任何问题吗?
提前谢谢。
我用Java创建了一个客户端,想要向我的C#服务器发送一些数据。
问题在于,如果我在客户端中写入例如“hello”,我只收到第一个字母。在字节数组中只有一个元素。
我猜测问题出在服务器端,因为在我的Java服务器上一切正常,所以Java客户端也可以正常工作。
有人看到任何问题吗?
提前谢谢。
你对TCP的理解有误,你不仅仅“接收”一次就能得到一次“发送”的结果。
TCP是一种“流式”协议,不会自动分成“数据包”。甚至在一个receive中,你可能会得到两个不同的send的数据。
常见的做法是在消息前加上其长度,这样你就可以调用接收函数直到获取所需的字节数。为了使接收函数在缓冲区没有数据时立即返回,请将套接字设置为非阻塞。
现在,你提供的代码应该可以正常工作,因为本地网络几乎没有延迟。你是否检查过Java部分是否缓冲数据流/是否可以手动刷新它们?
问题可能在Java端,因为您的监听器正常工作。 我将您的监听器代码复制粘贴到测试应用程序中。 然后我创建了另一个测试应用程序并发送了“hello world”,我完全听到了它。
public static void sender()
{
TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.2.236"), 30000);
client.Connect(serverEndPoint);
NetworkStream clientStream = client.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("Hello Server!");
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
}
Connection accepted from 192.168.2.236:22811
Recieved...
Hello Server!
顺便提一下,这可能是更好的监听器。
public void listener()
{
TcpListener tcpListener = new TcpListener(IPAddress.Any, 30000);
tcpListener.Start();
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
Console.Write(encoder.GetString(message, 0, bytesRead));
}
tcpClient.Close();
}