簡體   English   中英

當從客戶端(Java,套接字)接收到特定消息時,如何給出自動響應

[英]How to give an automated response back when receiving a specific message from the client (Java, sockets)

如果我的客戶向我發送消息“ Hello mr server”,我基本上是試圖從服務器返回響應。 但是事實並非如此。

這是我的代碼:

public class Server {

    public static final int PORT = 6666;

    public static void main(String[] args) throws IOException {
        new Server().runServer();
    }

    public void runServer() throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Server up and ready for connections.....");
        while (true) {
            Socket socket = serverSocket.accept();

            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //for fetching data
            String str = br.readLine(); //for fetching data

            System.out.println("Client Data:" + str + '\n');


            String dataSendingToClient = "gg";
            OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream()); //for sending data
            PrintWriter out = new PrintWriter(os); //for sending data
            out.println(dataSendingToClient);
            os.flush();



            if (br.equals("hey mr server")){
                OutputStreamWriter os2 = new OutputStreamWriter(socket.getOutputStream()); //for sending data
                PrintWriter out2 = new PrintWriter(os); //for sending data
                out2.println("hey mr client");
                os.flush();
            }

        }
    }

}

您正在使用br.equals("hey mr server") ,由於br不是String,而是BufferedReader,它將始終返回false

相反,您應該使用已經定義的str變量str.equals("hey mr server")


另請注意,使用當前代碼,服務器將僅從客戶端讀取一條消息,然后再繼續進行下一個連接

如果希望服務器從單個客戶端讀取更多消息,則需要循環直到客戶端發送斷開連接消息/套接字關閉

while(true)
{
    Socket socket = serverSocket.accept();
    BufferedReader br = [...];
    PrintWriter out = [...];

    for(String message = br.readLine(); message != null; message = br.readLine())
    {
        //do stuff
        //message is each line from the client
    }
}

如果有多個客戶端嘗試連接,則需要對連接進行多線程

我建議使用一個類來封裝連接詳細信息,並使用堆棧來輪詢客戶端是否發送了數據

public static void main(String[] args) //or whatever other method you're running in
{
    List<Connection> clients = new ArrayList<Connection>(); //some data structure to hold the clients

    //start accepting connections
    new Thread(new Runnable()
        {
            public void run()
            {
                while(true)
                    Connection client = new Connection(serverSocket.accept());
            }
        }).start();

    //do something with the clients, read/write/whatever
}

private class Connection extends Runnable
{
    private BufferedReader reader;
    private PrintWriter writer;
    private Queue<String> messages;

    public Connection(Socket s)
    {
        reader = [...];
        writer = [...];
        messages = new LinkedList<String>();
    }

    public void run()
    {
        //just keep reading
        while(true)
            messages.add(reader.readLine();
    }

    public String read()
    {
        messages.poll();
    }

    public void write(String msg)
    {
        writer.write(msg);
        writer.flush();
    }
}

注意:將其作為粗略的偽代碼

暫無
暫無

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

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