一个关于socket通信的问题,高手进!!
自己写了一个Socket通信的小程序,实现了服务端和客户端的通信.
下面一段程序是当客户端程序上的Connect按钮按下时就开始连接服务器并接受服务器发回的信息
为了接受信息我新开的一个线程.
按道理来说,run里面没有嵌套也没有循环,在运行一次后就应该退出了.<<Core Java>>一书中也写道
当线程的run方法返回时,该线程就中止运行.
但测试却发觉这个线程是一直运行的:因为此程序一直可以接收服务器发回的信息.
为什么?
JButton buttonConnect = new JButton("Connect");
buttonConnect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
try {
m_socket = new Socket("127.0.0.1", 8189);
new Thread() {//新开一个线程,使用内部类
public void run() {
try {
m_in = new BufferedReader(new InputStreamReader(m_socket.
getInputStream()));
String str = m_in.readLine();
while(str != null){
System.out.println(str);
str = m_in.readLine();
}//注意这儿,利用调试模式跟踪发现,当读完字符后,到此处跟踪失效,
//只有当服务器端再发来信息又可以继续进入while循环.也就是说在此处程序在等待消息.
}
catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
问题点数:20、回复次数:7Top
1 楼725137(2006年不会菜)回复于 2006-03-02 18:05:14 得分 0
没有循环?你这句是做什么的?
while(str != null)//改成if就不是循环
{
System.out.println(str);
str = m_in.readLine();//
}Top
2 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-03-02 18:08:39 得分 0
while(str != null){
System.out.println(str);
str = m_in.readLine();
}//
这里你需要定义一个标志信息通知客户端停止读数据
不然会一直等待 ,因为你这里有一个while循环
或者不要循环Top
3 楼Helloooooo(每天,我都新的)回复于 2006-03-02 18:21:38 得分 0
2位兄台啊,这儿是有一个循环。
但是问题本身并不出在循环上,
如果按照你们的解释,
那么只要读完数据就应该退出循环。
但问题是并没有退出循环,
而是程序等在那儿,
直到服务器又传来数据!!!Top
4 楼725137(2006年不会菜)回复于 2006-03-02 18:36:18 得分 20
晕。。你在这里不停的循环,readLine()如果一但读不到数据时他会自动发生阻塞,等待有信息过来..
readLine()方法是会发生阻塞的。。建议多看下书..
Top
5 楼725137(2006年不会菜)回复于 2006-03-02 18:38:56 得分 0
你应该加个判断
while(str != null)
{
System.out.println(str);
str = m_in.readLine();
if (str.equals("quit")) //如果服务器过来的信息是quit.那么退出while
break;
}Top
6 楼725137(2006年不会菜)回复于 2006-03-02 18:40:05 得分 0
str!=nullTop
7 楼Helloooooo(每天,我都新的)回复于 2006-03-02 19:20:46 得分 0
好的,帅哥,这个就是我要问的东西:
它实现的原理是什么?
我如何也这样构建一个类?
谢谢。
----------------------------
725137(2006年不会菜) ( ) 信誉:100 2006-03-02 18:36:00 得分: 0
晕。。你在这里不停的循环,readLine()如果一但读不到数据时他会自动发生阻塞,等待有信息过来..
readLine()方法是会发生阻塞的。。建议多看下书..
Top




