从Java的套接字读取字节
问题描述:
我正在执行此代码,并且当我创建称为缓冲区的字节数组时,它被初始化为0,所以当我执行.read()函数时,它不会等待读取任何内容,因为缓冲区是充分。 当我申报和itialize缓冲区并打印后,如果它充满了零等等读它不等待从套接字recive数据。从Java的套接字读取字节
欲recive从交流服务器正在发送一个char []消息
public class th extends Thread {
public static ServerSocket sc;
public static byte[] buffer = new byte[256];
public th(){
sc = null;
}
public th (ServerSocket userSC){
sc = userSC;
}
public void run() {
System.out.println("En la clase TH");
Socket serverAddr;
boolean condicion = true;
DataInputStream in;
int p;
for (p = 0; p < 256; p++) System.out.print(buffer[p] + " ");
/*try {
serverAddr = sc.accept();
in = new DataInputStream(serverAddr.getInputStream());
}
catch (Exception e){
System.err.println("Error creando socket");
}*/
try {
System.err.println("-1---------------------------------");
serverAddr = sc.accept();
in = new DataInputStream(serverAddr.getInputStream());
System.err.println("0---------------------------------");
System.err.println("1---------------------------------");
in.read(buffer);
for (p = 0; p < 256; p++) System.out.print(buffer[p] + " ");
int a = in.read(buffer);
if (a < 0) {
exit();
}
for (p = 0; p < 256; p++) System.out.print(buffer[p] + " ");
String res = new String(buffer);
System.out.println(res);
System.out.println("NO ESPERA");
serverAddr.close();
}
catch (IOException e){
System.err.println("Error creando socket");
}
}
}
答
我执行此代码,当我创建名为缓冲器字节数组,它是由0
初始化的字节
正确,假设你的意思是'用0初始化'。
所以当我做.read()函数时,它不会等待读取任何内容,因为缓冲区已满。
不正确的,确实完全是毫无意义的废话。由于Java中的所有原始数组都被初始化为零,所以您建议使所有I/O完全不可能,而这显然不是。这个建议没有开始有意义。
当我声明并初始化缓冲区并在此之后打印它时,它充满了零等等读取它不等待从套接字中recive数据。
再次,这是无稽之谈。实际的问题是read()
返回-1,表示对等体已断开连接。你完全忽视了那个返回值。
如果是肯定的,你也应该用它来代替256来限制你的打印循环。不能保证read()
填充缓冲区。
NB serverAddr
是Socket
,而不是'地址'。不要使用误导性的变量名称。你会误导你的第一个人是你自己。
请花些时间来清晰地设置代码的格式并使用常规名称 - 您应该尽可能让您的问题容易理解。它无助于你忽略'read'返回的值... –
它与缓冲区的初始值没有任何关系。这个cide不会等待读取任何东西的唯一原因是如果read()返回-1,这是一种你忽略的可能性,表明对等关闭了连接。请格式化这个难以辨认的混乱。 – EJP
是的,read()函数返回-1,但我不知道原因。如果你能帮助我......( – MrSman