我有一個ClientHandle接受請求的服務器,如果有一些,我想從Java發送數據到它。 (C++客戶端確實沒有任何問題)TCP 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.
發送方法不起作用。我已經嘗試過其他Streams並使用不同的編碼,我猜這是其原因。所以問題是我如何解決這個問題與編碼在這裏?如果可能的話,我想盡可能地離開C++客戶端,或者讓它達到某種標準。
問題在服務器上用C++代碼,還是在客戶端用Java代碼?通常不需要顯示工作代碼,只需向我們展示非工作代碼,並告訴我們在運行時會發生什麼。 –
我確實收到了一個0的大小,但發送了一個20,我在第二個之前添加了它。我認爲這是一個編碼問題,因爲C++和java不需要具有相同的字符集編碼或我嘗試發送的整數的字節順序。我認爲這是客戶端,因爲服務器與C++ Client一起工作,它使用與服務器相同的功能來連接和發送數據。我確實展示瞭如何從客戶端接收數據。 (第一個大小爲int,然後數據塊爲char) – BennX