Java为什么服务器不响应第二个客户端?

时间:2016-11-26 20:47:42

标签: java sockets server connection client

我编写了一个简单服务器客户端程序,当我启动服务器和客户端时,客户端获取它发送给服务器的消息并终止自身。但是,当我启动另一个客户端时,它不会收到消息。为什么? 非常感谢!

头等舱:客户

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class StringClient {

    public static void main(String[] args) {

        Socket socket = null;
        try{
            socket = new Socket("localhost", 3141);

            OutputStream raus = socket.getOutputStream();
            PrintStream ps = new PrintStream(raus, true);
            System.out.println("1");
            ps.println("Hello World!");
            ps.println("Hello Universe!");

            InputStream rein = socket.getInputStream();
            System.out.println("verf\u00FCgbare Bytes: " + rein.available());
            BufferedReader br  =new BufferedReader(new InputStreamReader(rein));
            System.out.println(2);

            while(br.ready()){
                System.out.println(br.readLine());
            }


        }catch(UnknownHostException e ){
            System.out.println("Unknown Host..."); 
            e.printStackTrace();

        } catch (IOException e) {
            System.out.println("IOProbleme..."); 
            e.printStackTrace();
        }finally{
            if(socket != null){
                try{
                    socket.close();
                    System.out.println("Socket geschlossen...");
                }catch(IOException e){
                    System.out.println("Fehler beim Schließen des Sockets!");
                    e.printStackTrace();
                }
            }
        }
    }

}

第二课:服务器

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class StringServer {
    private final ServerSocket server;

    public StringServer(int port) throws IOException {
        server = new ServerSocket(port);
    }


    private void connect(){

        while(true){
            Socket socket = null;
            try{
                socket = server.accept();
                reinRaus(socket);
            }catch(IOException e){
                e.printStackTrace();
            }finally{
                if(socket != null){
                    try{
                        socket.close();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    private void reinRaus(Socket socket) throws IOException{
        BufferedReader rein = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream raus = new PrintStream(socket.getOutputStream());
        String s;

        while(rein.ready()){
            s = rein.readLine();
            raus.println(s);
        }
    }

    public static void main(String[] args) throws IOException {
        StringServer server = new StringServer(3141);
        server.connect();
    }


}

1 个答案:

答案 0 :(得分:0)

主线程应该为传入的客户端分配单独/不同的线程,因此为不同的线程分配不同的客户端(它们获得不同的套接字)。在您当前的代码中,只有服务器的服务器。

StringServer.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class StringServer {
    private final ServerSocket server;

    public StringServer(int port) throws IOException {
        server = new ServerSocket(port);
    }


    private void connect(){

        while(true){
            Socket socket = null;
            try{
                socket = server.accept();


                 clientHandler ch = new clientHandler(socket);
                   ch.start();



            }catch(IOException e){
                e.printStackTrace();
            }finally{
                if(socket != null){
                    try{
                        socket.close();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }



    public static void main(String[] args) throws IOException {
        StringServer server = new StringServer(3541);
        server.connect();
    }


}
class clientHandler extends Thread {

    Socket client;


    public clientHandler(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {

        try {

          BufferedReader rein = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintStream raus = new PrintStream(client.getOutputStream(),true);
        String s;

        while(rein.ready()){
            s = rein.readLine();
            raus.println(s);
        }
            client.close(); // IOException

        } catch (IOException e) {
        }

    }

}

StringClient.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class StringClient {

    public static void main(String[] args) {

        Socket socket = null;
        try{
            socket = new Socket("localhost", 3541);

            OutputStream raus = socket.getOutputStream();
            PrintStream ps = new PrintStream(raus, true);
            System.out.println("1");
            ps.println("Hello World!");
            ps.println("Hello Universe!");

            InputStream rein = socket.getInputStream();
            System.out.println("verf\u00FCgbare Bytes: " + rein.available());
            BufferedReader br  =new BufferedReader(new InputStreamReader(rein));
            System.out.println(2);

            while(br.ready()){
                System.out.println(br.readLine());
            }


        }catch(UnknownHostException e ){
            System.out.println("Unknown Host..."); 
            e.printStackTrace();

        } catch (IOException e) {
            System.out.println("IOProbleme..."); 
            e.printStackTrace();
        }finally{
            if(socket != null){
                try{
                    socket.close();
                    System.out.println("Socket geschlossen...");
                }catch(IOException e){
                    System.out.println("Fehler beim Schließen des Sockets!");
                    e.printStackTrace();
                }
            }
        }
    }

}