2013-12-09 49 views
0

我有两个应用程序,一个用Java编写的发送字符串,它看起来像这样:通过插座从Java(PC)到C(树莓派)发送串

import java.io.*; 
import java.net.*; 
public class Gniazdo{ 
     public static void main(String[] args) throws IOException { 
      DataOutputStream dataOutputStream = null; 
      Socket socket = null; 
      String mes = "Test message"; 
      try { 
       socket = new Socket("192.168.1.116", 4014); 
       dataOutputStream = new DataOutputStream(socket.getOutputStream()); 

       dataOutputStream.writeChars(mes); 
      } catch (UnknownHostException e) { 
       System.err.print(e); 

      } finally { 
       if(socket != null) { 
        socket.close(); 
       } 
       if(dataOutputStream != null) { 
        dataOutputStream.close(); 
       } 
      } 
     } 

    } 

和第二个是用C和树莓派运行,应接收字符串:

#include <sys/socket.h> 
#include <stdio.h> 
#include <netinet/in.h> 
#include <string.h> 

int main(void) { 
    unsigned int port; 
    char bufor[1024]; 
    int gniazdo, gniazdo2; 
    struct sockaddr_in adr, nadawca; 
    socklen_t dl; 

    printf("Enter port to listen : "); 
    scanf("%u", &port); 
    gniazdo = socket(AF_INET, SOCK_STREAM, 0); 
    adr.sin_family = AF_INET; 
    adr.sin_port = htons(port); 
    adr.sin_addr.s_addr = INADDR_ANY; 
    if (bind(gniazdo, (struct sockaddr*) &adr, 
      sizeof(adr)) < 0) { 
     printf("Bind failed.\n"); 
     return 1; 
    } 
    if (listen(gniazdo, 10) < 0) { 
     printf("Listen failed.\n"); 
     return 1;   
    } 
    printf("Waiting for connection ...\n"); 
    while (gniazdo2 = accept(gniazdo, 
         (struct sockaddr*) &nadawca, 
         &dl) 
     ) 
    { 
    //  memset(bufor, 0, 1024); 
     recv(gniazdo2, bufor, 1024, 0); 
     printf("message from %s: %s\n", inet_ntoa(nadawca.sin_addr), bufor); 
     close(gniazdo2); 
    } 
    close(gniazdo);  
} 

和我的输出是:

Enter port to listen : 4014 
Waiting for connection ... 
message from 192.168.1.103: 
message from 192.168.1.103: 
message from 192.168.1.103: 
message from 192.168.1.103: 

请任何人都可以告诉我,世界卫生大会错了吗? 为什么我不收到消息?

我甚至在DataOutputStream类检查从我的电脑使用Wireshark传出的数据包,它们包含了我的消息,但还是不知道我在哪里出错了

+0

您是否试过使用'PrintStream'来代替?我想'DataOutputStream'可能会发送元数据连同你想要的字符串。 –

回答

0

1)尝试调用writeBytes(String s)将。

2)尝试调用DataOutputStream的冲洗 (即使close应该调用flush也是如此)。

3)尝试使用的PrintWriter发送字符串

http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html#PrintWriter%28java.io.OutputStream,%20boolean%29

,特别

http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html#write%28java.lang.String%29

4)另外,我觉得你应该换这种方法这两个

  if(socket != null) { 
       socket.close(); 
      } 
      if(dataOutputStream != null) { 
       dataOutputStream.close(); 
      } 
+0

当我打电话给writeBytes(String s)时,我有时会输出整个字符串,但有时它只是发送字符串的第一个字符,为什么? – user3080536

+0

应该与char编码有关。你只发送ASCII字符还是一些字符从东欧语言中发出?如果你发送abcd,你会在C程序中得到abcd吗?我会使用一些使事情明确的例子:1)确保Java程序发送UTF-8,2)确保C程序读取UTF-8。那么就不会有错。 –

+0

使用PrintWriter,现在一切正常! – user3080536

0

printf正在将'bufor'看作char(8位),但是java将编写16位UTF-16字符。第一个字符的第一个字节是0. printf看到0并认为它是字符串的结尾。尝试将字符串格式化为UTF-8,然后将其写入套接字或读取并将其打印为wchar。