【发布时间】:2015-12-26 14:47:33
【问题描述】:
我有一个带有 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.
发送方法不起作用。我已经尝试过其他 Streams 并使用了不同的编码,我想这就是原因。所以问题是我如何用这里的编码解决这个问题?如果可能的话,我想保留 C++ 客户端,或者让它达到某种标准。
【问题讨论】:
-
是C++代码的服务器问题,还是Java代码的客户端问题?通常不需要显示工作代码,只需向我们展示非工作代码并告诉我们运行时会发生什么。
-
我确实收到了 0 作为大小,但发送了 20,我在一秒钟前添加了它。我认为这是一个编码问题,因为 c++ 和 java 不需要具有相同的字符集编码或我尝试发送的整数的字节顺序。我认为它是客户端,因为服务器与 c++ 客户端一起使用,它使用与服务器相同的功能来连接和发送数据。我确实展示了我如何从客户端接收数据的工作。 (首先大小为 int,然后数据块为 char)