簡體   English   中英

BufferedReader 等待請求/響應套接字連接

[英]BufferedReader Pending for Request/Response Socket Connection

我正在嘗試構建一個簡單的請求/響應服務器。

客戶端向服務器發送消息。 然后,服務器向客戶端響應消息。

服務器端代碼

package com.techoffice.example;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.net.ServerSocketFactory;

public class TcpServerAppl {

    static int port = 1010;
    static ServerSocket serverSocket;
    static {
        try {
            serverSocket = ServerSocketFactory.getDefault().createServerSocket(port);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {

        System.out.println("Server is running on " + port);
        while(true){
            Socket socket = null;
            try{        
                socket = serverSocket.accept();
                System.out.println("Someone is connecting to the server");
                InputStream is = socket.getInputStream();
                OutputStream os = socket.getOutputStream();

                PrintWriter printWriter = new PrintWriter(os);

                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));

                // read message from client 
                String line = bufferedReader.readLine();
                while(line != null && line.length() > 0){
                    System.out.println(line);
                    line = bufferedReader.readLine();
                }
//              reader.close();

                // send message to client
                System.out.println("Server starts sending message to client");
                printWriter.println("This is a message sent from server");
                printWriter.flush();
//              printWriter.close();

            } catch(Exception e){
                System.err.println(e.getMessage());
            } finally {
                if (socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        System.err.println(e.getMessage());
                    }
                }
            }
        }

    }
}

客戶端代碼

package com.techoffice.example;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.net.SocketFactory;

public class TcpClientAppl {
    public static void main(String[] args) throws UnknownHostException, IOException{
        // start socket connection
        Socket socket = SocketFactory.getDefault().createSocket("localhost", 1010);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        // send message to server
        printWriter.println("Send Message From Client" );
        printWriter.flush();
//      printWriter.close();

        // read message from server
        System.out.println("Client starts reading from Server");
        String line = bufferedReader.readLine();
        while(line != null && line.length() > 0){
            System.out.println(line);
            line = bufferedReader.readLine();
        }
//      bufferedReader.close();

        // close scoket connection
        socket.close();
    }
}

服務器在緩沖讀取器處被阻塞。 但是,如果我嘗試通過關閉客戶端中的打印寫入器來關閉緩沖讀取器,客戶端會拋出“連接關閉”異常。

眾所周知,在 PrintWriter 或 BufferedReader 中關閉將關閉套接字連接。

更新

指定請求/消息結束將是解決方案之一。 但在這種情況下,我不希望請求結束。 無論請求中沒有多少行,我只想對請求做出響應。

客戶端拋出“連接關閉”異常

不,它沒有。 如果取消對printWriter.close()行的注釋,它將拋出異常“套接字已關閉”。

但是對於你真正的問題。 服務器在發送任何內容之前讀取行直到流結束:在對等方關閉連接之前永遠不會發生流結束; 除上述情況外,對等方沒有關閉連接; 所以它永遠不會發送任何東西,只是停留在readLine() 所以客戶端也將永遠阻塞在readLine()

由於這顯然是一個回顯服務器,它應該在接收到每一行時回顯。

問題是缺少客戶端拋出的異常。 也許嘗試在您的通信完成后關閉服務器端的所有內容(讀取器、寫入器)。 順便提一句。 你不需要在調用 close 之前調用flush。 您也可以在服務器端使用帶有套接字的 try-catch-withResources

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM