首页 文章

多线程服务器仅从一个客户端JAVA接收数据

提问于
浏览
2

我创建了一个简单的MultiThreaded服务器 . 每次接受客户端时,都会创建一个DataInputStream和DataOutputStream,并开始通信

服务器:

public class Connection implements Runnable{
boolean isAlreadyOpened = false;

@Override
public void run() {
    // TODO Auto-generated method stub  
    try {           
        ServerSocket ss = new ServerSocket(7000);
        while(true){
            System.out.println("Il Server sta cercando Connessioni");
            Socket s = ss.accept();
            System.out.println("Il Server ha accettato un Client");

            Thread t2 = new Thread(new Runnable(){
                public void run(){             
                   try {

                        DataInputStream dis = new DataInputStream(s.getInputStream());
                        isAlreadyOpened = true;
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                        while(true){
                            String test = dis.readUTF();
                            dos.writeUTF(test);
                            System.out.println(test);
                            dos.flush();
                        }                       
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        isAlreadyOpened = false;
                    }  
                }           
            });
            t2.start();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }  
}

我试图连接Android应用程序和JavaApp;每40秒这两个程序都通过writeUTF发送一个字符串 . 从两个客户端正确 Build 连接,但服务器仅从连接到服务器的最后一个接收数据 . 如何允许服务器从/向所有客户端接收/发送数据?

编辑:

我试图设置这个:

public class Connection implements Runnable {

 @Override
  public void run() {

    try {
        ServerSocket ss = new ServerSocket(7000);
        while (true) {
            System.out.println("Server is listening");
            Socket s = ss.accept();
            System.out.println("Client Accepted");

            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        DataInputStream dis = new DataInputStream(s.getInputStream());
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                        while (true) {
                            String test = dis.readUTF();
                            dos.writeUTF(test);
                            System.out.println(test);
                            dos.flush();
                        }
                    } catch (IOException 
                        e.printStackTrace();
                    } finally {
                        try {
                            s.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });                 
    t2.start();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但结果是一样的

编辑:

Andorid客户代码

public class Connection implements Runnable {
@Override
public void run() {
    try {
        Socket s = new Socket("127.0.0.1", 7000);
        DataInputStream dis = new DataInputStream(s.getInputStream());
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());

        while(true){
           dos.writeUTF("FromAndroid");
            Log.d("InputStreammmm", dis.readUTF());
         Thread.sleep(10000)
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

}

JAVA APP客户端代码

@Override
public void run() {
     try {

        Socket socket = new Socket("127.0.0.1", 7000);
        System.out.println("Connessooo");
         DataInputStream dis = new DataInputStream(socket.getInputStream());
         DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

         while(true){
         dos.writeUTF("Invioooooooooooooooooooooooooo");
         result = dis.readUTF();
         System.out.println(result);
         Thread.sleep(10000);
         }

    } catch (IOException e) {

        e.printStackTrace();
    } catch (InterruptedException e) {

        e.printStackTrace();
    }
}

编辑插座列表:

public class Connection implements Runnable {
List<Socket> sList = new ArrayList<>();
Socket s;
int i = 0;

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        ServerSocket ss = new ServerSocket(7000);
        while (true) {
            System.out.println("Server Listening");
            s = ss.accept();
            sList.add(s);

            System.out.println("Accepted Client --- " +s.toString());
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        DataInputStream dis = new DataInputStream(s.getInputStream());  

                        while (true) 
                        {
                            String test = dis.readUTF();
                            System.out.println("Message sent from -- " + sList.get(i).toString());
                            System.out.println(test);

                            while(i < sList.size()){
                                 DataOutputStream dos = new DataOutputStream(sList.get(i).getOutputStream());
                                 dos.writeUTF(test);    
                                 System.out.println("Message Sent to -- " + sList.get(i).toString());
                                 dos.flush();
                                 ++i;
                             }
                            i=0;
                        }
                    } catch (IOException e) 
                    {
                        e.printStackTrace();
                    } finally
                    {
                        try
                        {                      
                            System.out.println("Closing Socket --- " + sList.get(i).toString());
                            sList.get(i).close();
                            sList.remove(i);

                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            });
            t2.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

这样做我的问题就像EJP所建议的那样解决了......

1 回答

  • 1

    无法重现 .

    测试程序,从您编辑的代码中复制粘贴,并在我使用Java 7时添加 finalSocket s ,并添加了客户端代码:

    public class Connection implements Runnable
    {
    
        @Override
        public void run()
        {
    
            try
            {
                ServerSocket ss = new ServerSocket(7000);
                while (true)
                {
                    System.out.println("Server is listening");
                    final Socket s = ss.accept();
                    System.out.println("Client Accepted");
    
                    Thread t2 = new Thread(new Runnable()
                    {
                        public void run()
                        {
                            try
                            {
                                DataInputStream dis = new DataInputStream(s.getInputStream());
                                DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                                while (true)
                                {
                                    String test = dis.readUTF();
                                    dos.writeUTF(test);
                                    System.out.println(test);
                                    dos.flush();
                                }
                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                            }
                            finally
                            {
                                try
                                {
                                    s.close();
                                }
                                catch (IOException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    t2.start();
                }
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    
        public static void main(String[] args) throws InterruptedException
        {
            Connection c = new Connection();
            Thread  t1 = new Thread(c);
            t1.setDaemon(true);
            t1.start();
            Runnable    r = new Runnable()
            {
                public void run()
                {
                    try (Socket s = new Socket("localhost", 7000))
                    {
                        DataOutputStream    dos = new DataOutputStream(s.getOutputStream());
                        DataInputStream dis = new DataInputStream(s.getInputStream());
                        for (int i = 0; i < 10; i++)
                        {
                            dos.writeUTF("Hello from "+Thread.currentThread().getName());
                            String  reply = dis.readUTF();
                            Thread.sleep(10*1000);
                        }
                    }
                    catch (IOException|InterruptedException exc)
                    {
                        exc.printStackTrace();
                    }
                }
            };
            Thread  t2 = new Thread(r);
            Thread  t3 = new Thread(r);
            t2.start();
            t3.start();
            t2.join();
            t3.join();
        }
    }
    

    输出:

    Server is listening
    Client Accepted
    Server is listening
    Client Accepted
    Server is listening
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-2
    Hello from Thread-1
    Hello from Thread-2
    Hello from Thread-1
    

相关问题