我写一个网络socket服务器端的界面,但不知怎么回事,老是死在线程里,具体如下:
/////////开启服务方法
private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      
        try {
            serverSocket = new ServerSocket(port);
            displayArea.setText("服务器启动成功...");
            //若注掉下面××中的代码,可以显示  "服务器启动成功..."
            //但若未注掉,就不显示  "服务器启动成功...",且处于无响应状态
//××××××××××××××××××××××××××××××××××××××××
            while(true){
                Socket socket;
                try {
                    socket = serverSocket.accept();
                    Thread workThread = new serverThread(socket);
                    workThread.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
//××××××××××××××××××××××××××××××××××××××××        } catch (IOException ex) {
            Logger.getLogger(serverJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }    }              
///////////////////////////若有请求,服务端调用的线程
package sock.network;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;/**
 *
 * @author qinguan
 */
public class serverThread extends Thread{
    public serverThread(Socket socket) {
        this.socket = socket;
    }
    
    public void run(){
        BufferedReader br = null;
        PrintWriter pw = null;
        try {
            str = "New connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
            System.out.println(str);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw = new PrintWriter(socket.getOutputStream(), true);
            while ((msg = br.readLine()) != null) {
               msg=socket.getInetAddress()+":"+socket.getPort()+"say:"+msg;
               System.out.println(msg);
               pw.println(msg);
               if(msg.equals("bye"))
                   break;
            }
        } catch (IOException ex) {
            Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }    private Socket socket;
    private String str;
    private String msg;
}不知道为什么,求知道的指点下。谢谢。。

解决方案 »

  1.   

    我们把 startActionPerformed 方法放到一个线程里面去调用。因为如果没有客户端连接上来,你的方法阻塞在 accept() 上面,这会导致 Swing 事件处理阻塞了。
      

  2.   

    你吧workThread.start();
    线程写在循环里了,
    只需要在run方法里循环监听就可以了。
    你这样等于无限创造线程了,不死才怪啊
      

  3.   


    public void run()
    {
    try
    {

    /** 监听端口,如果有用户登陆就建立连接 */
    while(true)
    {
    socket = serverSocket.accept();
                                    new serverThread(socket);
    //然后在serverThread的构造方法里启动线程this.start();
    }
    }
    catch(IOException e)
    {
    System.err.println("Not listening......"+e);
    }

    }
      

  4.   

    startActionPerformed 方法是对界面按钮的响应,当我点按钮时,我需要开启服务等待客户端的请求,我怎么才能把它放到线程里?
      

  5.   

    startActionPerformed方法所在的类,实现Runnable,写run方法,当你点击按钮就启动线程this.start();
      

  6.   


    这个run方法指的是哪里的?serverThread里的?如果依旧放在主类中,还是卡死啊?
      

  7.   

    2个线程,serverThread是处理你的client端消息用的,需要一个线程,然后你监听端口的是另一个线程
      

  8.   

    如果没看错的话,你应该是要做个类似聊天室的程序。n年前我也写过,当时你这里的serverThread我是用的内部类来做的,同样两个线程,一个监听,一个处理连接建立以后的消息
      

  9.   

    差不多,主要是练习socket编程。  private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      
            try {
                // TODO add your handling code here:
                serverSocket = new ServerSocket(port);
                displayArea.setText("服务器启动成功...");
                this.start();//color=#FF0000]方法未找到[[/color]
    //            this.service();
            } catch (IOException ex) {
                Logger.getLogger(serverJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }    } 
      

  10.   

    我对主类实现了Runnable,添加了你说的run方法,尴尬的是在startActionPerformed方法里,this没有start方法 public void run() {
             Socket socket;
             try {
                 //监听端口,如果有用户登陆就建立连接
                 while(true){
                    socket = serverSocket.accept();
                    new serverThread(socket);
                 //然后在serverThread的构造方法里启动线程this.start();
                 }
             } catch (Exception e) {
                 System.err.println("Not listening......"+e);
             }
        }
      

  11.   

    new Thread(this).start();实现runnable的要这样启动
      

  12.   

    不过你按钮里面最好多个判断,如果线程已启动就不要再启动了,可以在类成员里定义个
    Thread current;
    然后按钮里
    多个判断,免得重复启动了
    if(current == null && !current.isAlive()) {
    current= new Thread(this);
    current.start();
    }