[英]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.