在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);当运行到这句的时候,程序应该会停下来,发生阻塞。监听客户端的信息!所以这个循环式成立的呀?为什么不能执行?

解决方案 »

  1.   

    完整的代码在这里!import javax.swing.JApplet;public class ServerGUI extends JApplet {
    private JTextField textField;
    private JTextArea textArea; /**
     * Create the applet.
     */
    public ServerGUI() {
    getContentPane().setLayout(null); JPanel panel = new JPanel();
    panel.setBounds(56, 33, 367, 239);
    getContentPane().add(panel);
    panel.setLayout(null); JButton button_1 = new JButton("\u53D1\u9001");
    button_1.setBounds(74, 183, 57, 23);
    panel.add(button_1); textField = new JTextField();
    textField.setBounds(242, 91, 94, 26);
    panel.add(textField);
    textField.setColumns(10); JButton button = new JButton("\u6253\u5F00\u7AEF\u53E3");
    button.setBounds(243, 124, 93, 23);
    panel.add(button); textArea = new JTextArea();
    textArea.setBounds(37, 35, 129, 122);
    panel.add(textArea);
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    action_Performed(e);
    }
    }); } public void action_Performed(ActionEvent e) {
    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();
    }
    }
    }
    }
      

  2.   

     serverSocket.close();
    你把ServerSocket都关闭,肯定无法监听了。
      

  3.   

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

  4.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。
      

  5.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!
      

  6.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!这样不就可以了,有报错?
      

  7.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!这样不就可以了,有报错?恩!以前的方法没有报错!这个方法是开始报错了。循环报错!
      

  8.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!这样不就可以了,有报错?恩!以前的方法没有报错!这个方法是开始报错了。循环报错!报的是什么错,会不会是下面的关闭顺序反了。
     serverSocket.close();
     bReader.close();
      

  9.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!这样不就可以了,有报错?恩!以前的方法没有报错!这个方法是开始报错了。循环报错!报的是什么错,会不会是下面的关闭顺序反了。
     serverSocket.close();
     bReader.close();主要不是这个!我觉得我没改之前没有错啊!重新生成一个server么?应该思路是对的呀!
      

  10.   

    不是运行完了再关闭的吗?额然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。如果移到外面去,这样子的话应该不能实现我想要的功能了!现在我只需要能应答一个客户端的请求就可以了!这样不就可以了,有报错?恩!以前的方法没有报错!这个方法是开始报错了。循环报错!报的是什么错,会不会是下面的关闭顺序反了。
     serverSocket.close();
     bReader.close();主要不是这个!我觉得我没改之前没有错啊!重新生成一个server么?应该思路是对的呀!
    。报错信息是什么?