JAVA中服务器/客户端程序的解决方案

时间:2012-02-07 21:45:48

标签: java client-server

我的代码存在问题。我用Java创建一个等待连接的服务器。当客户端连接时,如果我们(服务器)发送命令“showinfo”,则cliend将其IP地址发送回服务器。

问题是它是一个多线程服务器,许多客户端连接。因此,例如,如果2个客户端连接到服务器,我们必须键入2次showinfo,然后客户端向我们提供信息。如何为每个客户端键入“showinfo”立即响应客户端,并且不要等到我为所有客户端键入showinfo。如果在执行命令之前有50个客户端,则输入50次showinfo有点累人。提前谢谢(我已尝试过一些线程同步和一些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 个答案:

答案 0 :(得分:1)

如果一个线程在readline上阻塞,另一个线程最终应该获得控制权。这是多线程的重点。我想我知道你的问题。将读取输入命令的代码移动到服务器的run()方法中。那你应该好。我认为问题在于轮询输入后你的线程正在启​​动。

将这些行从Server构造函数移动到Server的run()方法:

 infromclient =new BufferedReader(new InputStreamReader(server.getInputStream()));
            outtoclient =new DataOutputStream(server.getOutputStream());
            infrommaster=new BufferedReader(new InputStreamReader(System.in));