Решение в программе сервера / клиента в JAVA - PullRequest
1 голос
/ 08 февраля 2012

У меня проблема с моим кодом. Я делаю сервер с Java, который ждет подключения. Когда клиент подключается, если мы (сервер) отправляем команду "showinfo", клиент отправляет свой IP-адрес обратно на сервер.

Проблема в том, что это многопоточный сервер, и многие клиенты подключаются. Таким образом, если, например, к серверу подключаются 2 клиента, нам нужно 2 раза ввести showinfo, а затем клиенты передадут нам информацию. Как я могу заставить клиентов отвечать немедленно, набрав «showinfo» для каждого, и не ждать, пока я введу showinfo для всех клиентов. Немного утомительно набирать 50 раз showinfo, если есть 50 клиентов, прежде чем вы сможете выполнить свою команду. Заранее спасибо (я пробовал некоторые потоки синхронизации и некоторые sleep() join() команды, но пока не пришел к выводу, надеюсь, вы сможете немного помочь.)

Вот код сервера

import java.io.*;
import java.net.*;
import java.security.*;

public class Server implements Runnable{  
    private Socket server;
    private static String command,info,message;
    BufferedReader infromclient =null;
    InputStream infromclient2=null;
    DataOutputStream outtoclient =null;
    static BufferedReader infrommaster=null;
    private static int port=6789;

    Server( Socket server ){
        try{    
            this.server=server;
            infromclient =new BufferedReader(new InputStreamReader(server.getInputStream()));
            outtoclient =new DataOutputStream(server.getOutputStream());
            infrommaster=new BufferedReader(new InputStreamReader(System.in));
        }catch( IOException e ){
            System.out.println("Exception accessing socket streams: "+e);
        }
    }

    // main()
    // Listen for incoming connections and handle them
    public static void main(String[] args) {
        ThreadGroup clients = new ThreadGroup("clients");
        System.out.print("Waiting for connections on port " + port + "...");
        System.out.println("\nIn total there are:"+clients.activeCount()+" clients\n");
        try{
            ServerSocket server = new ServerSocket(port);
            Socket nextsocket;

            // waiting for connections
            while(true){
                nextsocket = server.accept();
                Thread client= new Thread(clients,new Server(nextsocket),"client"+(clients.activeCount()+1));
                System.out.println("Client connected");
                System.out.println("There are "+clients.activeCount()+" clients connected");
                client.start();                                
            }

        }catch (IOException ioe){
            System.out.println("IOException on socket listen: " + ioe);
            ioe.printStackTrace();
        }      
    }

    public void run (){                 
        try{                              
            command=infrommaster.readLine();  
            outtoclient.writeBytes(command+"\n");

            // showinfo
            if(command.equals("showinfo")){        
                info=infromclient.readLine();
                System.out.println("\nClient information\n\n" +info+"\n");                    
            }

            server.close();                         
        }catch (IOException ioe){
            System.out.println("IOException on socket listen: " + ioe);
            ioe.printStackTrace();
        }       
    }
}

и вот код для клиента:

import java.io.*;
import java.net.*;
import java.lang.*;


public class Client{

    public static void main(String args[]) throws Exception{
        String command2;
        String info;
        Socket clientSocket=null;
        Socket scket=null;    
        BufferedReader inFromUser=null;
        DataOutputStream outToServer=null;
        BufferedReader inFromServer=null;
        BufferedWriter tosite=null;

        try{
            clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789);
            inFromUser =new BufferedReader(new InputStreamReader(System.in));
            outToServer =new DataOutputStream(clientSocket.getOutputStream());
            inFromServer =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     
        }catch(UnknownHostException | IOException e ){
            System.out.println("Problem "+e);
        }                           

        command2=inFromServer.readLine();
        System.out.println("From Server:" +command2);

        // showinfo
        if (command2.equals("showinfo")){
            try{
                InetAddress myip=InetAddress.getLocalHost();
                info =("IP: " +myip.getHostAddress()+"\n");

                System.out.println("\nSome system information\n" + info);
                outToServer.writeBytes(info);           
            }catch (Exception e){
                System.out.println("Exception caught ="+e.getMessage());
            }
        }

        outToServer.flush();
        outToServer.close();
        inFromUser.close();
        inFromServer.close();
        clientSocket.close();
    }
}

** команда clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789); означает, что она проверяет мой компьютер (мой ip в порту 6789).

1 Ответ

1 голос
/ 08 февраля 2012

Если один поток блокирует readline, другой должен в конечном итоге получить контроль.В этом весь смысл многопоточности.Я думаю, я знаю вашу проблему.Вместо этого переместите код, в котором вы читаете команду ввода, в метод run () сервера.Тогда тебе должно быть хорошо.Я думаю, проблема в том, что ваши потоки запускаются после того, как вы запрашиваете ввод.

Переместите эти строки из конструктора сервера в метод run () сервера:

 infromclient =new BufferedReader(new InputStreamReader(server.getInputStream()));
            outtoclient =new DataOutputStream(server.getOutputStream());
            infrommaster=new BufferedReader(new InputStreamReader(System.in));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...