簡體   English   中英

讀寫服務器

[英]Reading and Writing to Server

目標:將數據發送到服務器並讓服務器返回一些內容並打印服務器發回的內容

問題:如果我關閉流出,那么它會將數據發送到服務器,但我的輸入流將無法工作,我無法收到服務器試圖給我的內容。 如果我使用flush()將數據發送到服務器,則服務器永遠不會接收數據。 我已經堅持了3個小時。 你如何同時讀寫。

Client.java

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

class Client {
    public static void main(String args[]) {
        String data = "head";
        try {
            Socket skt = new Socket("server", 5050);
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            out.print(data);
            out.close();

            System.out.println("Sent data");
            while (!in.ready()) {
            }

            String input = in.readLine();
            System.out.println(input);

            out.close();
            in.close();
            skt.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n" +e.toString());
        }
    }
}

Server.java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.PrintWriter;

class Server {
    public static void main(String args[]) {
        String data;
        String input;
        try {
            ServerSocket srvr = new ServerSocket(5050);
            Socket skt = srvr.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    skt.getInputStream()));
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);

            // /////Waits for message from client/////////
            while (!in.ready()) {
            }
            // ///////////////////////////////////////////

            input = in.readLine(); // Read the message
            System.out.println("Received String input: " + input);
            // Send output to client
            System.out.println("After output");
            if (input.equals("head"))
                data = "haha";
            else
                data = "Wtf did you send me";
            Thread.sleep(2000);
            out.print(data);
            // ///////////////////

            System.out.println("Sent data: " + data);
            in.close();
            out.close();
            skt.close();
            srvr.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n");
        }

    }
}

在您的客戶中,您有:

out.print(data);
out.close();

在您的服務器中,您有:

input = in.readLine();

客戶端發送沒有換行符的消息 - 這就是in.ready()真的原因 更重要的是 - 它關閉PrintWriter而不是刷新(你也在程序結束時關閉流)。 如果您將這些行更改為:

out.println(data); // sends message with new line character
out.flush();       // unnecessary

客戶端發送消息。 同樣的事情是當服務器發送消息時 - 你使用print而不是println但客戶端使用readLine讀取,直到新行字符讀取,或者更精確( BufferedReader | readLine() ):

讀一行文字。 一條線被認為是由換行符('\\ n'),回車符('\\ r')或回車符中的任何一個終止,后面緊跟換行符。

還有一件事 - 您使用"server"主機名連接到服務器。 對於我的測試,我將其更改為"localhost" 也許還有其他錯誤?

暫無
暫無

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

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