日期:2014-05-20  浏览次数:20795 次

关于Socket编程里面的问题
在Socket编程中,我再服务端写了如下代码

      while (true) {
int port = Integer.parseInt(textField.getText());
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket sk = serverSocket.accept();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(sk.getInputStream()));
textArea.setText(bReader.readLine());
serverSocket.close();
bReader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

这个方法是监听一个button按钮的,这个按钮的功能就是打开一个服务端口。我用了一个while(true),虽然是死循环,但是这样子为什么程序就不能运行呀?我知道这个可以用线程来解决,但是我觉得我自己这样写也没有错啊?至少程序可以运行吧。但是现在的问题是程序居然不能运行了,ServerSocket serverSocket = new ServerSocket(port);当运行到这句的时候,程序应该会停下来,发生阻塞。监听客户端的信息!所以这个循环式成立的呀?为什么不能执行?

------解决方案--------------------
引用:
Quote: 引用:

 serverSocket.close();

你把ServerSocket都关闭,肯定无法监听了。

不是运行完了再关闭的吗?额。。。然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!


这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。
------解决方案--------------------
楼主服务器端ServerSocket应该一直监听,有客户端连接就new 新线程,关闭的是这个线程,而不是主线程中ServerSocket,给你例子。
package conn;

import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*对象反串行化,与客户端定义一样*/
class Customer extends Object implements java.io.Serializable //封装登录信息
{
String custName;     //用户名
String custPassword; //密码
}

class ChaXun extends Object implements java.io.Serializable  //封装查询信息
{
String neirong;      // 用户ID或用户姓名
}

class Exit extends Object implements java.io.Serializable    //封装退出信息