服务器的套接字未输出数据单元客户端代码停止运行



我在玩网络游戏,并试图使用Java中的套接字通过网络发送一条简单的消息。

这是服务器代码:

public class Server {
public static void main(String[] args) throws IOException {
String clientSentence;
String uppercaseSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
System.out.println("Server Running.");
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
clientSentence = inFromClient.readLine();
System.out.println("Client message received: " + clientSentence);
}

这是客户端代码:

public class Client {
public static void main(String[] args) throws IOException {
String originalSentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("localhost", 6789);
System.out.println("Please enter a sentence: ");
originalSentence = inFromUser.readLine();
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(originalSentence);
System.out.println("Message Sent");
}

当我同时运行它们并向客户端输入消息时,控制台中的服务器端没有确认,但客户端确认消息已发送。如果我结束客户端并停止运行,服务器将向控制台输出发送的消息,他们会立即抛出错误。

我认为这与实际的BufferedReader没有真正收到消息或其他什么有关?

再次,我是一个非常新的网络,所以任何帮助都将非常感谢

确保一个连接发送数据的方式和另一方接收数据的方式对称。因此,如果客户端通过DataOutputStream发送数据,那么最好将数据作为DataInputStream读取。如果OTOH,你只发送字符串,我会使用像PrintWriter这样的Writer,然后用Reader阅读。我会通过println(...)发送每一行,并在PrintWriter上调用.flush(),以确保缓冲区在需要时发送该行。例如,一个简单的客户端可能是这样的:

import java.util.*;
import java.net.*;
import java.io.*;
public class Client {
public static final String EXIT = "exit";
public static final int HOST_ID = 6789;

public static void main(String[] args) {

// using try-with-resources so that I close all streams when done
try (
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("localhost", HOST_ID);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
) {     
String input = "";
do {
System.out.print("Please enter a sentence, or "exit" to exit: ");
input = inFromUser.readLine();
out.println(input);

// flush the output stream to send all pending bites:
out.flush();  

} while (!input.equalsIgnoreCase(EXIT));
System.out.println("All Done");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

服务器可能看起来像:

import java.util.*;
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) {
// using try-with-resources so that I close all streams when done
try (
ServerSocket welcomeSocket = new ServerSocket(6789);
Scanner scanner = new Scanner(welcomeSocket.accept().getInputStream());
) {
System.out.println("Server Running.");
System.out.println("socket accepted");
while (scanner.hasNextLine()) {
String text = scanner.nextLine();
System.out.println("text: " + text);
System.out.println("uppercase: " + text.toUpperCase());
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

相关内容

最新更新