Java套接字服务器
我有一个Java进程,它使用JavaIO.Servocket之类的东西(TCP)在TCP套接字上创建监听器(简化):
ServerSocket server = new ServerSocket(4444,20);
server.accept();
JAVA进程在接收请求时启动工作线程,然后工作人员使用JavaIO.PrimTrrIt和JavaNET.SoCult发送JSON字符串:
PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
out.println("JSON STRING");
out.flush();
out.close();
clientSocket.close();
我已经简化了Java代码,但这基本上就是它所做的一切。
.NET套接字客户端
接下来,我有一个.NET应用程序,它与承载Java进程的机器通信:
//Create Connection
Socket clientSocket = new Socket(AddressFamily.InterNetwork,
StreamType.Stream, ProtocolType.Tcp);
mySocket.Connect("192.168.1.102", 4444);
//Initialize Byte Buffer Larger than Expected JSON String and Read Bytes
byte[] receivedData = new byte[524288];
int numberOfBytes = clientSocket.Receive(receivedData, SocketFlags.None);
clientSocket.Close();
//Populate a new byte array of the exact size received with the received data
byte[] formatedBytes = new byte[numberOfBytes];
for (int i=0; i< numberOfBytes; i++)
{
formatedBytes[i] = receivedData[i];
}
//Convert Byte Array to String & Output Results
Response.ClearContent();
Response.ContentType("text/plain");
Response.Write(new System.Text.ASCIIEncoding().GetString(receivedData));
我的问题是,无论出于什么原因,当我试图在套接字流上发送稍大的JSON字符串时,这个实现都不起作用。对于较小的数据大小(低于2KB),我已经成功地用100多个客户机测试了这个实现,这些客户机连接和接收数据没有任何问题,但是尝试将JSON字符串大小增加到大约256KB会导致.NET应用程序截断结果。增加字节缓冲区数组的大小也没有任何帮助——似乎.NET应用程序在传输所有数据之前都在删除连接,或者Java应用程序没有使用这个字符串发送整个字符串。
任何对这个问题的了解都会非常感谢-如果我自己有任何进展,我会发布任何更新。
这是我找到的解决方案-服务器现在工作得很好!再次感谢!
byte[] receivedData = new byte[512000]; // 4 Meg Buffer
Socket mySocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
mySocket.Connect("172.26.190.205", 4444);
mySocket.ReceiveBufferSize = 8192;
int numberOfBytesRead = 0;
int totalNumberOfBytes = 0;
do
{
numberOfBytesRead = mySocket.Receive(receivedData,totalNumberOfBytes ,
mySocket.ReceiveBufferSize,SocketFlags.None);
totalNumberOfBytes += numberOfBytesRead;
}
while (numberOfBytesRead > 0);
mySocket.Close();
byte[] formatedBytes = new byte[totalNumberOfBytes ];
for (int i = 0; i < totalNumberOfBytes ; i++)
{
formatedBytes[i] = receivedData[i];
}
Response.ClearContent();
Response.ContentType = "text/plain";
Response.Write(new System.Text.ASCIIEncoding().GetString(formatedBytes));