我尝试使用InputStream类中的read()方法,但它阻塞了线程,我尝试了阻塞线程的readLine()方法。
在尝试之后我使用了这个:
public static void main(String[] args) throws IOException{
Socket s = new Socket();
String host = "";
s.connect(new InetSocketAddress(host, 23));
Response response = new Response(s);
response .start();
if(response .isInterrupted()){
System.out.println(response .getSb().toString());
}
}
public class Response extends Thread {
Socket s;
BufferedReader s_in = null;
InputStream in = null;
private StringBuffer sb = new StringBuffer();
public Response(Socket s){
this.s = s;
}
@Override
public void run() {
try {
s_in = new BufferedReader(new InputStreamReader(s.getInputStream()));
in = s.getInputStream();
char ch;
int i;
while(!Thread.currentThread().isInterrupted()){
i = s_in.read();
ch = (char) i;
System.out.print(ch);
getSb().append(getSb());
}
System.out.print(getSb());
} catch (IOException ex) {
Logger.getLogger(Response.class.getName()).log(Level.SEVERE, null, ex);
}
}
public StringBuffer getSb() {
return sb;
}
}
public class Message extends Thread{
Socket s;
PrintWriter s_out = null;
public Message(Socket s){
this.s = s;
}
@Override
public void run(){
try {
s_out = new PrintWriter(s.getOutputStream(), true);
} catch (IOException ex) {
Logger.getLogger(Message.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
但是当我运行应用程序时,套接字没有足够的时间将所有数据发送到InputStream。
因此,我可以验证流何时结束。开始阅读。
感谢您的帮助!
答案 0 :(得分:1)
我不知道为什么你没有使用缓冲流,或者把这个读卡器放在它自己的线程中,因为它应该始终从套接字读取(或准备读取) ,这意味着阻止。
但是,根据您提供的代码,改善您情况的最简单方法是阅读,直到不再需要读取字节,这不是您实际所做的事情。当您执行for
循环时,可能会有更多字节进入。试试这个:
int i;
char c;
while (in.available() > 0)
{
i = s_in.read();
System.out.print(ch = (char)i);
sb.append(ch);
}
它确实无法解决您的问题,因为您没有使用单独的线程缓冲输入,并且您仍然可以在收到预期获得的所有数据之前退出循环。