[英]TCP Java client sending Data to a C++ Server
我有一個帶有ClientHandle的服務器,如果有請求,它將接受請求,我想從Java向它發送數據。 (C ++客戶端確實可以正常工作)
我已經閱讀了其他有關此內容的文章,但他們沒有以任何方式幫助我。 Post1 , Post2 , Post3
bool ClientHandle::getData(std::shared_ptr<std::string> ptr)
{
int n;
ptr->clear();
char size[4];
n = recv(m_sock, size, sizeof(size), 0);
//check if retval passed
if (!checkRetValRecv(n))
return false;
//calc how much data
auto msgLen = atoi(size);
LOG_INFO << "recv a message with size: " << msgLen;
//create buffer for the data
auto buffer = new char[msgLen];
//read buffer
n = recv(m_sock, buffer, msgLen, 0);
//check retval if it passes
if (!checkRetValRecv(n))
return false;
ptr->append(buffer, msgLen);
LOG_INFO << "Message: " << *ptr;
delete[] buffer;
return true;
}
bool ClientHandle::checkRetValRecv(const int& n)
{
if (n == SOCKET_ERROR)
{
size_t err = WSAGetLastError();
if (err == WSAECONNRESET)
{
LOG_ERROR << "Failed to recv! Disconnecting from client: " << "Connection reset by peer.";
}
else
{
LOG_ERROR << "Disconnecting from client. WSAError: " << err;
}
m_connected = false;
return false;
}
if (n == 0)
{
LOG_INFO << "Client disconnected.";
m_connected = false;
return false;
}
return true;
}
現在,我想為此編寫一個Java客戶端來發送數據,但我什至不能發送傳入數據的大小。
public class JClient{
String m_host;
int m_port;
Socket m_sock;
OutputStreamWriter m_out;
BufferedReader m_in;
public JClient(String host, int port)
{
m_host = host;
m_port = port;
}
private void connect() throws IOException
{
m_sock = new Socket(m_host, m_port);
m_out = new OutputStreamWriter(m_sock.getOutputStream());
m_in = new BufferedReader(new InputStreamReader(m_sock.getInputStream()));
}
private void close() throws IOException
{
m_sock.close();
}
public void send(String json) throws IOException {
this.connect();
m_out.write(json.length());
m_out.flush();
m_out.write(json);
m_out.flush();
//wait for result
m_in.read();
this.close();
}
}
如果我嘗試像這樣發送數據:
JClient client = new JIMClient("localhost", 6060);
String toSend = "{\"hello\":\"someJson\"}";
try {
client.send(toSend);
} catch (IOException e) {
e.printStackTrace();
}
我沒有收到任何有用的信息。 recv a message with size: 0
, Client disconnected.
send方法不起作用。 我已經嘗試了其他Streams,並使用了不同的編碼,我想這就是原因。 因此,問題是如何使用此處的編碼解決此問題? 如果可能的話,我想離開C ++客戶端,或者將其升級為某種標准。
Java代碼僅發送單個字符作為長度,但是C ++期望使用4個字節的字符串。 你可以試試
m_out.write(String.format("%4d%s",json.length(),json));
m_out.flush();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.