在java

时间:2018-01-13 11:21:52

标签: java tcp

我想创建一个示例TCP客户端 - 服务器对。客户端将从控制台获取输入字符串并将其发送到服务器,服务器将打印请求字符串并回复一些字符串。我不想在事务完成后关闭连接,使用我希望继续发送请求并从服务器获取响应的相同连接。

我编写了以下客户端 - 服务器代码,第一个事务正确发生但当我尝试发送第二个请求时,服务器和客户端没有收到任何内容。我试图谷歌寻求解决方案,但找不到任何有用的东西。请帮忙。

客户代码

public class Client {

    public static void main( String[] args ) throws UnknownHostException, IOException {
         Socket clientSocket = new Socket( "localhost", 81 );
         DataOutputStream out = new DataOutputStream( clientSocket.getOutputStream() );
         BufferedReader in =
            new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
         System.out.println( "connected to server" );

         while ( true ) {
             System.out.println( "enter data to send" );
             Scanner sc = new Scanner( System.in );
             String msg = sc.nextLine();
             out.writeBytes( msg + "\n" );
             System.out.println( "response from server : "+in.readLine() );

        }

    }
}

服务器代码

public class Server {

    public static void main(String args[]) throws IOException{
        ServerSocket ss = new ServerSocket(81);
        System.out.println( "server started" );
        while(true){
            System.out.println( "waiting for client" );
            Socket s = ss.accept();
            System.out.println( "connected to client" );
            BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
            DataOutputStream out = new DataOutputStream( s.getOutputStream() );
            out.flush();
            System.out.println( "recieved: "+ in.readLine()  );
            out.writeBytes( "200\n" );
        }
    }
}

2 个答案:

答案 0 :(得分:2)

当您的服务器启动时,它会创建一个绑定在端口81上的服务器套接字并进入无限循环。在这个循环中,你开始接受"接受"状态,您在那里监听要建立的连接并接受它。接受后,您等待来自客户端的一行输入,将其打印到System.out,并使用" 200"响应。您遇到的问题是,在您做出响应后,循环重置'并开始侦听新连接。

最简单的解决方案是持续检查服务器中的传入数据。

public class Server {

    public static void main(String args[]) throws IOException{
        ServerSocket ss = new ServerSocket(81);
        while(true){
            Socket s = ss.accept();
            BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
            DataOutputStream out = new DataOutputStream( s.getOutputStream() );
            while (true) {
                System.out.println( "recieved: "+ in.readLine()  );
                out.writeBytes( "200\n" );
                out.flush();
            }
        }
    }
}

虽然这适用于单个客户端,但这会阻止您在侦听数据时建立新连接。您可能希望为每个连接创建一个新线程,以处理每个不同套接字连接的读/写。

答案 1 :(得分:1)

正如Zachary所说,他的解决方案仅适用于单个客户端,对于多个客户端,您需要为每个客户端创建一个新线程,如下所示:

public class Server {

    private ServerSocket server;

    public Server(int port) {
        server = new ServerSocket(port);
    }

    public void listenForConnections() {
        while (true) {
            Client client = new Client(server.accept());
            new Thread(client).start();
        }
    }

}

public class Client implements Runnable {

    private Socket socket;

    public Client(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        while (true) {
            // Do something
        }
    }

}