我正在尝试为服务器/客户端编写简单的代码。
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
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
答案 0 :(得分:1)
您应该在客户端和服务器端明确说明您希望传入数据所在的编码。在不同平台/语言之间进行通信时,这一点尤其重要。
但是,当然,这不是你的问题所在 - 你的字符串是用一堆非打印字符创建的,因为你用整个字节数组分配它:
byte[] buffer = new byte[100];
new String(buffer);
据推测,在您将数据读入数据库后,缓冲区未完全填充,并且其中的默认零值将在您的字符串中转换为非打印字符。您可以通过打印您创建的字符串的长度来验证这一点,您会发现它大于1
。
您有两种补救措施 - 在比较其值之前trim()
字符串,或者跟踪读取的实际字节数并创建一个正确长度的新字节数组(在创建字符串之前)。