readLine()取不出数据的问题

csbinchina 2010-01-06 11:45:12
BufferedReader br = null;
PrintStream pw = null;
private Socket s = null;
InputStreamReader isr;
private GetMessage getMessage;

s = new Socket(host,8000);
isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);//输入流
pw = new PrintStream(s.getOutputStream());//输出流


GetMessage g = new GetMessage();//
st = new Thread(g);
st.start();


class GetMessage extends Thread{
public void run(){
String line = null;
while(true){
ta.append("600\n");
try{
if((line = br.readLine())!= null){//为什么运行到这里程序就停止了,一直在等待,只有socket关闭了,才会继续运行。这是什么原因?
ta.append("接收到信息:"+line+"\n");
}
else{
ta.append("超时");
}
}catch(Exception e){
}
try{
sleep(600);
}catch(Exception e){
}
}
}
}



if((line = br.readLine())!= null){//为什么运行到这里程序就停止了,一直在等待,只有socket关闭了,才会继续运行。这是什么原因?数据能发出去,同时服务器也确实返回数据了,为什么这里会停止,请达人指教。
...全文
579 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
csbinchina 2010-01-07
  • 打赏
  • 举报
回复
这个问题已经解决了,但收到的东西有点不对。呵呵。 先结贴。谢谢大家。

gannian的东西不错。

为什么每次发送后需要flush(),这个有点不明白。而且还需要有结束符。
zhaining522 2010-01-06
  • 打赏
  • 举报
回复
readLine 方法是阻塞的方法
你不输入信息它就停在这里 不继续执行
所以一般有阻塞的时候要用到多线程。
这样你就既可以 获取readLine方法的信息
又不影响你的主函数运行

所以你现在要引入线程咯 。。。。。
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hsf_1982 的回复:]
SocketInputStream的read方法是阻塞等待的操作,如果没有可接收数据,就会一直等待。同时OutputStream的实例往往需要调用flush才能真正执行写操作。如果是这个原因,在发送端加个flush试试。
BufferedReader中存在缓存,采用br.readLine()是按单位接收,回车换行为终结或则是流结束。建议如果发送端不是按指令行发送,就别用这种东西。
[/Quote]

你意思是说发送端需要加回车换行作为结尾才可以?
py330316117 2010-01-06
  • 打赏
  • 举报
回复
把null改成-1试试
if((line = br.readLine())!=-1)
阿_布 2010-01-06
  • 打赏
  • 举报
回复
GetMessage是继承的Thread类,直接创建线程对象。
你那种创建线程的方法是GetMessage实现Runnable接口的情况。
hsf_1982 2010-01-06
  • 打赏
  • 举报
回复
SocketInputStream的read方法是阻塞等待的操作,如果没有可接收数据,就会一直等待。同时OutputStream的实例往往需要调用flush才能真正执行写操作。如果是这个原因,在发送端加个flush试试。
BufferedReader中存在缓存,采用br.readLine()是按单位接收,回车换行为终结或则是流结束。建议如果发送端不是按指令行发送,就别用这种东西。
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoupuyue 的回复:]
st = new Thread(g);  -->  GetMessage gm = new GetMessage ();
[/Quote]

啥意思,能说明白点吗?
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mezhou 的回复:]
客户端的端口要和服务器的端口一样才行的
要不你把br.readline()打印出来吧
[/Quote]

客户端的端口要和服务器的端口一样才行的?
还有这回事?不太可能吧。 再说了,br.readline()都已经等待了,没法打印。
阿_布 2010-01-06
  • 打赏
  • 举报
回复
st = new Thread(g); --> GetMessage gm = new GetMessage ();
meZhou 2010-01-06
  • 打赏
  • 举报
回复
客户端的端口要和服务器的端口一样才行的
要不你把br.readline()打印出来吧
gannian 2010-01-06
  • 打赏
  • 举报
回复
记着给分..下次好下东东...
jay314159 2010-01-06
  • 打赏
  • 举报
回复
学习,我也刚好遇到这个问题。
gannian 2010-01-06
  • 打赏
  • 举报
回复
Streams are a fairly simple data structure; they are best thought of as linear sequences of bytes.
gannian 2010-01-06
  • 打赏
  • 举报
回复
用字节比较好。。。SOCKET接口走的是CLI。谁知道哪里是行啊。readline读文件还可以.读SOCKET不好吧.。所以用字符串读取不是好的IDEA中字节流吧。。我们项目中的一段代码。。

private Socket myClientSocket;

private PrintWriter myWriter;
private BufferedReader myReader;

private String myRemoteAddress;

String command;

char[] resp;
int read = 0;

timeoutTask = new TimeOutTask(this);
mySessionMgr.startTimeoutTask(this);

while( !isStopping )
{
resp = new char[4000];
try
{
read = myReader.read(resp);

if (read == -1) //if remote socket is closed
{
logger.info("Remote Disconnected: " + myRemotePort + "@" + myRemoteAddress);
isStopping = true;

myWriter.close();
myReader.close();
myClientSocket.close();

myWriter = null;
myReader = null;
myClientSocket = null;

continue;
}

command = new String(resp,0,read);
timeoutTask.cancel();
myProcessor.processCLIMsg(command, this);
//
timeoutTask = new TimeOutTask(this);
mySessionMgr.startTimeoutTask(this);
// myClientSocket.close();



以上信息.FRI
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
再顶一下,等达人回答。
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chdw 的回复:]
问题的原因应该是对方发送的字符中并不包含回车,所以readLine()会一直阻塞


你应该让对方发送回车
[/Quote]

我发了 0D 0A依然如此。
ChDw 2010-01-06
  • 打赏
  • 举报
回复
问题的原因应该是对方发送的字符中并不包含回车,所以readLine()会一直阻塞


你应该让对方发送回车
csbinchina 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wangzi7745453 的回复:]
GetMessage g = new GetMessage();//
st = new Thread(g);    --------这个是Runnable接口的启动方法把
st.start();


class GetMessage extends Thread{
public void run(){



[/Quote]


这不重点。关系也不大。
不白吃饭 2010-01-06
  • 打赏
  • 举报
回复
GetMessage g = new GetMessage();//
st = new Thread(g); --------这个是Runnable接口的启动方法把
st.start();


class GetMessage extends Thread{
public void run(){


gongyi0929 2010-01-06
  • 打赏
  • 举报
回复
readline是一个阻塞模式啊,要碰到回车才会继续执行
加载更多回复(4)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧