【问题标题】:How to send a string from java server to C++ client?如何将字符串从 java 服务器发送到 C++ 客户端?
【发布时间】:2016-06-12 17:52:31
【问题描述】:

我需要从 windows java 服务器向 linux c++ 客户端发送一个字符串,反之亦然,但我编写的代码不起作用,我不知道为什么:

Java 服务器 Windows 上的代码发送字符串

for(int i=0;i<message.length;i++)
{
    message[i]=Byte.parseByte(num_cartella);
}                   
sendData(message,client); 

Java 服务器代码在 Windows 上接收数据

client = server.accept();
 InputStream ic = client.getInputStream();
 BufferedReader dic = new BufferedReader( new InputStreamReader(ic) );
 String id_scelta=String.valueOf(dic.readLine());

C++ 客户端代码在 Linux 上发送数据

if( send(sock , nCartella,(unsigned)strlen(nCartella), 0) < 0)
{
            cout <<"Invio fallito"<<endl;
            return 1;
}
cout << "Messaggio inviato"<<endl;  

C++ 客户端Linux 上的代码接收数据

if( recv(sock, server_reply , (unsigned)strlen(server_reply) , 0) < 0)
        {
            cout <<"Ricezione fallita"<<endl;
            return 1;
        }

        cout <<"Risposta server:";
        cout <<server_reply;

为什么它不起作用?套接字将成功创建,但客户端和服务器不发送和接收数据,我不知道代码的错误部分是什么

【问题讨论】:

  • 您是否使用通用字符编码发送和接收?可能不是。您应该更改代码以在所有 4 种情况下显式使用 UTF-8,例如new InputStreamReader(ic, "UTF-8") 在第二种情况下。
  • nCartella 是如何定义的? server_reply?我们不知道strlen(server_reply) 的结果是什么。另外,当您说“不起作用”时,这到底是什么意思?没有运行时错误,但您没有得到数据?有错误,即您的示例中的cout 行显示出现故障?
  • 你有 MCVE 吗?可能有很多原因。服务器是否接受了客户端并绑定了客户端?我会说 Java 服务器在最后接受带有 CRLF 的字符串,而客户端发送的字符串的 n 字节不一定以 CRLF 结尾,所以这也可能导致问题。
  • 案例 #1 不好。将num_cartella 分配给message 数组中的所有 个位置不会发送字符串的值。

标签: java c++ linux windows sockets


【解决方案1】:

您遇到了与您之前的数千人相同的问题。实际上有两个。

第一个问题是,当字符串以这种方式发送时,其他人不知道字符串的长度是多少!所以你需要指出它,常用的技术是在实际字符串之前发送字符串大小。这样做时,请注意字节顺序 - Java 是大字节序,而变化是,你的另一面是小字节序。

第二个问题是您不能希望通过单个recv 命令一次性接收所有内容。您必须循环接收,直到您阅读完所有内容。

【讨论】:

  • 鉴于String id_scelta=String.valueOf(dic.readLine());,我怀疑他打算实现基于行的协议。
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多