sách gpt4 ăn đã đi

c# - .NET Socket.Receive() 没有从 Java SocketServer 接收大数据流

In lại 作者:搜寻专家 更新时间:2023-11-01 03:13:56 24 4
mua khóa gpt4 giày nike


Java 套接字服务器


我有一个 Java 进程使用 java.io.ServerSocket 在 TCP 套接字上创建一个监听器,类似于这样(简化):

ServerSocket server = new ServerSocket(4444,20);
server.accept();

Java 进程在收到请求时触发工作线程,然后工作线程使用 java.io.PrintWriter 和 java.net.Socket 发送 JSON 字符串:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
out.println("JSON STRING");
ra ngoài. flush();
ra ngoài.đóng();
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 应用程序未使用 PrintWriter 发送整个字符串。

非常感谢对此问题的任何见解 - 如果我自己取得任何进展,我会发布任何更新。


这是我找到的解决方案 - 服务器现在运行良好!再次感谢!


    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;
LÀM
{
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));

câu trả lời hay nhất

虽然 TCP 在概念上是一个,但底层 IP 发送和接收数据包。对于应用程序,这意味着您总是从套接字读取xe đạp,因为发送方的单个“写入”可能导致接收方的多次“读取”,并且反过来。

这归结为一个事实,即如何将您发送的数据拆分为数据包取决于 TCP/IP 堆栈实现。接收方,同样是网络堆栈,不知道需要多少字节。它只是接受它得到的东西并唤醒等待该套接字的进程,如果有的话,否则缓冲字节。

您的情况很简单 - 只需继续从套接字读取,直到看到 Cuối cùng,即读取零字节。但一般来说,您需要一个应用程序级协议(protocol)来定义消息长度、建立消息边界规则或将显式长度信息嵌入消息本身。

关于c# - .NET Socket.Receive() 没有从 Java SocketServer 接收大数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4045438/

24 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress