- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này yêu cầu chi tiết hoặc rõ ràng. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện câu hỏi này? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này Đã đóng 7 năm trước. Bài đăng này đã được 8 tháng rồi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như các hàm độc lập dán sao chép vào một số hộp văn bản rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ xem xét thử nghiệm đơn vị. Tôi khuyên bạn nên kiểm tra google và google mô phỏng
Tôi muốn di chuyển một cửa sổ (HWND) trong màn hình thứ hai. Vấn đề là tôi đã thử rất nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm, nhưng nó không bao giờ đặt cửa sổ trên màn hình thứ hai của tôi. Mọi manh mối về cách thực hiện việc này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng đang chạy của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết chương trình C# sẽ sử dụng thuật toán DES để mã hóa và giải mã. Tôi cần một số thực tế
Thật khó để nói những gì để hỏi ở đây. Câu hỏi không rõ ràng, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp Đóng 1.
Có cách nào để buộc một cửa sổ khác ở trên cùng không? Không phải cửa sổ của ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhấtSetWindowPos(that_window_ha
Giả sử bạn có lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên máy chủ Windows và Linux, đâu là lựa chọn thông minh nhất để xây dựng một ứng dụng máy chủ socket? Câu trả lời tốt nhất là như
Bạn có thể cho tôi biết sự khác biệt giữa chúng? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất Thư viện chuẩn C++ và thư viện chuẩn C là các thư viện được xác định theo tiêu chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là điểm chung của những từ đó
Trong mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để nói những gì đang được hỏi ở đây. Câu hỏi mơ hồ, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ sử dụng cấu trúc/lớp được gọi là thông báo để liên lạc với khách hàng. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa thông báo. Vấn đề của tôi là gửi các lớp này qua mạng tới máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án mà tôi phải viết một hàm để thực hiện một số thao tác nhất định trên một số dữ liệu. Tôi có thể viết mã bằng C/C++, nhưng tôi không muốn chia sẻ mã của chức năng này với chủ nhân của mình. Thay vào đó, tôi chỉ muốn anh ấy có quyền gọi hàm bằng mã của riêng mình. Có thể được không? Tôi đã nghĩ đến hai phương pháp này - trong
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi đang sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi xảy ra "Lỗi vi phạm quyền truy cập". Điều này làm hỏng toàn bộ ứng dụng. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ không hợp lệ, v.v.
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Chúng tôi không cho phép các câu hỏi tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để trả lời bằng sự kiện và trích dẫn. Đóng cửa 7 năm trước
Đã đóng cửa. Câu hỏi này không tuân thủ nguyên tắc Stack Overflow. Câu trả lời không được chấp nhận vào thời điểm này. Các câu hỏi yêu cầu chúng tôi giới thiệu hoặc tìm các công cụ, thư viện hoặc tài nguyên bên ngoài trang web yêu thích đều không có chủ đề đối với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng P/Invoke. Tôi đang cố gắng xác định tương đương C# cho hàm C này. SomeData* DoSomething(); struct SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này sử dụng hành vi không xác định trước và sau tăng? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!