【问题标题】:C++ Client and Java ServerC++ 客户端和 Java 服务器
【发布时间】:2012-08-15 15:10:26
【问题描述】:

我做了一个 Java Socket 服务器和一个 C++ 客户端。 但是,客户端连接到服务器,没有问题。 但是当我写一些客户端-服务器时,服务器没有捕捉到消息。 我做错了什么?

Java Server的一点点代码:

DataInputStream dis=new DataInputStream(usrSocket.getInputStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
int data;
while((data = dis.read())>=0) {
out.write(data);
}
byte[] bytes = out.toByteArray();
String decrypt = new String(bytes);
if(decrypt.equals("status")){
System.out.println("Status emitted.");
}
System.out.println("Received a message.");

C++客户端写法:

QByteArray qba;
qba.append(text);
sock->write(qba.data());
qDebug() << "Send status";

我需要帮助,非常感谢。 (那个变量“text”是一个QString)


编辑

Java 服务器:这只是所有代码的一部分,主线程等待连接(Socket sock = server.accept())并为每个用户创建一个新线程。 我发布的 Java 服务器代码,它是用户线程的一部分。 如果您需要所有代码,请告诉我。

我将等待答案! 非常感谢! 对不起,如果我回答你晚了。

【问题讨论】:

  • 你在ServerSocket对象上使用了accept()方法吗?
  • 发送数据需要flush吗?
  • 我认为你遗漏了太多代码。
  • 你在使用 QTcpSocket 吗?
  • 您是否使用过诸如wireshark 之类的工具来查看系统的哪一半坏了——c++ 客户端发送数据,还是Java 服务器读取发送的数据?此外,服务器是否收到 nothing 或只是没有收到 complete 消息?

标签: java c++ client


【解决方案1】:

Java Server 上试试这个代码。

ServerSocket ss = new ServerSocket(Port_No);

Socket incomingClient = ss.accept();

InputStream i = incomingClient.getInputStream();

OutputStream o = incomingClient.getOutputStream();  // Use it write to the Client Socket

InputStreamReader isr = new InputStreamReader(i);

BufferedReader br = new BufferedReader(isr);

String str = new String();

while ((str = br.readLine())!=null){


     // do what you want with the data received in str.

 }

【讨论】:

  • 首先告诉我,我是某种测试代码...其中两个代码都在同一台机器上或不同的机器上。如果不同,请先尝试 ping 机器以查看它们是否可以访问。那么如果是的话。然后请查看 IP 地址是否在适当的范围内,如果它在 WAN 上,您需要有一个静态公共 IP。在 LAN 环境中尝试 A、B、C 类中的任何 IP
  • 好的,服务器在127.0.0.1和C++客户端,自己的电脑作为服务器,客户端在服务器上运行。所以,我只使用一台电脑。当我发送消息时,客户端没有抛出任何错误,但服务器没有做任何事情,消息没有到达服务器,服务器没有监听那种消息,或者客户端没有发送消息。需要.h文件和.java文件吗?
  • 亲爱的你是否实现了我的服务器代码并对其进行了测试......是的,我希望你在我的代码的 while 循环中添加了System.out.println(str)......我相信这会奏效。 ..我不知道c中的套接字,所以坦率地说无法检测到其中的错误......但我确信我的服务器代码......是的,看到你使用的是正确的端口号......你可以单独运行我的服务器代码,然后尝试 Telnetting 到服务器端口......就像 127.0.0.1:4444 这样你就可以在没有客户端的情况下测试它,看看服务器是否在工作
【解决方案2】:

当您使用 QTcpSocket 时,您很可能在默认异步模式下运行客户端。这意味着当您在调用 connectToHost 之后写入时,不会发送任何内容,因为套接字 未连接

尝试使用:

socket->connectToHost(hostAddress, hostPort, QIODevice::ReadWrite);
if (socket->waitForConnected()) {
    QString text = "test string";
    QByteArray array;
    array.append(string);
    qDebug() << socket->write(array);
} else {
    // connect error!
}

【讨论】:

  • 我执行 connectToHost,如果 socket->waitForConnected() 返回 true,则将该“状态”写入服务器的线程启动。如果服务器无法连接或未连接,则线程永远不会启动...
【解决方案3】:

您的 Java 代码读取套接字直到 EOS,然后打印一些东西,顺便说一句,这不是解密操作。你的 C++ 客户端写了一些东西并且从不关闭套接字。所以服务器永远无法退出读取循环。

【讨论】:

  • 变量名是解密,因为这是我想到的第一件事哈哈。并且客户端无法关闭套接字,因为它需要发送消息,接收消息,因为我使用线程,所以服务器为每个用户创建线程,线程只是等待客户端消息并处理该消息需要做的。有一个主线程等待新连接并为每个连接创建线程。服务器无法离开读取循环,因为他需要一直等待消息......我已经解决了我的问题。谢谢!
  • @Spamdark 如果客户端无法关闭套接字,则服务器不应尝试在每条消息上读取 EOS。
  • 这是我现在正在工作的游戏项目的服务器 :)。客户端连接到服务器,然后开始发送/接收信息,连接永远不会关闭,服务器永远不会离开读取循环,直到客户端关闭游戏。服务器和客户端现在工作正常。客户端可以关闭套接字,但它不应该关闭套接字。
【解决方案4】:

如果我没看错,那是因为您的客户端仍在运行。 Read() 返回数字 >= 0,直到客户端套接字关闭。

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2012-10-09
    • 2022-06-16
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多