应用程序未进入线程



我正在尝试使用multhitreading功能创建聊天应用程序,这是处理连接的会话类的代码和接受连接的服务器类的代码:

会话课:

public class Session extends Thread{
Socket Sock;
BufferedReader din;
PrintWriter dout;
Thread receive;
Server serv;
boolean connected = false;
String lineSep = System.getProperty("line.separator");
public Session(Socket s, Server n){
    super("ThreadSessions");
   this.Sock = s;
   this.serv = n;
}
public void run(){
    try{
    din = new BufferedReader(new InputStreamReader(Sock.getInputStream()));
    dout = new PrintWriter(Sock.getOutputStream());
    connected = true;
    Receive();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }
    receive.start();
}
public void sendTo(String text){
    dout.write(text);
    dout.flush();
}
public void sendToAll(String text){
    for(int ind = 0; ind < serv.sessions.size(); ind++){
        Session s = serv.sessions.get(ind);
        s.sendToAll(text);
    }
}
public void Receive(){
    receive = new Thread(new Runnable(){
        @Override
        public void run() {
            receive = new Thread(new Runnable(){
                String msgIn;
                    public void run() {
                        while(connected){
                        try{
                            msgIn = din.readLine(); 
                            if(msgIn != "" || msgIn != null){
                            System.out.println(msgIn);
                            msgIn = "";
                            }else{
                            }
                        }
                        catch(SocketException exc){
                            exc.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                       }
                    } 
            });
        }
  });
 }
}

服务器类:

public class Server {
private JFrame frame;
private JTextField txtPort;
JTextArea textArea, textSessions;
String lineSep = System.getProperty("line.separator");
ServerSocket ServSock;
Socket Sock;
String port;
public JTextField textField;
int numbSess = 0, actSess = 0;
ArrayList<Session> sessions = new ArrayList<Session>();
boolean shouldRun = true;

public static void main(String[] args) 
{
    Server window = new Server();
    window.frame.setVisible(true);
}

   public Server() {
    initializeComponents(); //This void initializes the graphic components
   }
 private void Connect(){
  port = txtPort.getText();
  int portN = 0;
   try{
    portN = Integer.parseInt(port);
     }
   catch(NumberFormatException exc)
    {
     exc.printStackTrace();
    } 

 try{
ServSock = new ServerSocket(9081);
while(shouldRun){
Sock = ServSock.accept();
String ip = Sock.getInetAddress().getHostAddress();
Session s = new Session(Sock, this);
s.start();
sessions.add(s);    
numbSess++;
 }
 }
 catch(Exception exc){
     exc.printStackTrace();
     System.exit(3);
   }
 }

private void initializeComponents() {
    [...]
    Button btnConn = new JButton("Open Connection");
    btnConn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Connect();
        }
    });
    btnConn.setBackground(new Color(0, 0, 0));
    btnConn.setForeground(new Color(0, 128, 0));
    btnConn.setBounds(160, 13, 137, 25);
    frame.getContentPane().add(btnConn);
    [...]
  }

我想做的是创建一个可以同时处理更多连接的聊天应用程序,而不是输入第一个连接(在我的应用程序中的会话)。它继续等待其他连接并将其添加到arrayList中。代码可能充满了错误,所以请原谅我。如果有人知道一种更好的方法来创建可以处理更多客户连接的服务器,那么欢迎这些连接。希望有人可以帮助我,谢谢。

而不是输入第一个连接(我的应用程序中的会话)。它继续等待其他连接并在arraylist

中添加这些连接

这是由于如何设置线程

每次进行并开始一个会话时,其run方法都称为...

public void run()
{
    Receive();
    [...]
    receive.start();
}

...又在Receive();中设置receive

public void Receive()
{
    receive = new Thread(new Runnable()
    {
        public void run()
        {
            receive = new Thread(new Runnable()
            {
                public void run()
                {
                    //your actual code that you wanted to run
                }
            });
        }
    });
}

在运行时创建的线程将做一件事,再次设置receive,使用代码您想要第一次

receive = new Thread(new Runnable()
{
    public void run()
    {
        //your actual code that you wanted to run
    }
});

,但是在调用Receive();后,您仅致电receive.start();一次

您要么需要两次调用它,并以某种方式确保它在时间上更新,要么删除多余的线程

最新更新