java和c / objective中的服务器/客户端 - 编码问题

时间:2012-02-05 06:25:09

标签: java objective-c encoding client

我正在尝试为服务器/客户端编写简单的代码。

服务器(在java中)等待来自客户端的字符串:

ServerSocket ss = new ServerSocket(4001);
Socket s = ss.accept() ;

DataInputStream dataStreamIn = new DataInputStream(s.getInputStream()) ;

byte buffer[] = new byte[100];

dataStreamIn.read(buffer);


if((new String(buffer)).equals("1"))
    System.out.print("yes");//never printed

客户端(objective-c)将字符串发送到服务器:

uint8_t buffer[1000] ={0};
sprintf((char*)buffer,"%s", "1");

NSInteger wrote = [self.networkStreamOut 
                   write:buffer 
                   maxLength:(uint8_t)strlen((char *)buffer)];

问题是服务器上的缓冲区确实是“1”但是当我试图与.equals()进行比较时它返回false!

修改

当我要将此行添加到服务器时:

System.out.println(Integer.valueOf(new String(buffer))) ;

我收到了这个错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1

1 个答案:

答案 0 :(得分:1)

您应该在客户端和服务器端明确说明您希望传入数据所在的编码。在不同平台/语言之间进行通信时,这一点尤其重要。

但是,当然,这不是你的问题所在 - 你的字符串是用一堆非打印字符创建的,因为你用整个字节数组分配它:

byte[] buffer = new byte[100];
new String(buffer);

据推测,在您将数据读入数据库后,缓冲区未完全填充,并且其中的默认零值将在您的字符串中转换为非打印字符。您可以通过打印您创建的字符串的长度来验证这一点,您会发现它大于1

您有两种补救措施 - 在比较其值之前trim()字符串,或者跟踪读取的实际字节数并创建一个正确长度的新字节数组(在创建字符串之前)。