[英]Java socket - Read & Write
The problem: Client doesn't receive any message. 问题:客户端没有收到任何消息。
Here is the full code for both client and server: 这是客户端和服务器的完整代码:
CLIENT 客户
public class Client extends Socket{
public Client(String hostName, int port) throws UnknownHostException, IOException {
super(hostName,port);
BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
while(true) {
String line = in.readLine();
System.out.println("Text received: " + line);
}
}
SERVER 服务器
public final class Server extends ServerSocket{
public Server(int port) throws IOException {
super(port);
System.out.println("Server waiting for client 1");
Socket client1 = accept();
PrintWriter writer = new PrintWriter(client1.getOutputStream(), true);
writer.write("Hello user 1");
System.out.println("Server waiting for client 2");
Socket client2 = accept();
PrintWriter writer2 = new PrintWriter(client2.getOutputStream(), true);
writer2.write("Hello user 2");
System.out.println("Clients connected");
}
You have to include a newline character at the end of the message, and also flush the PrintWriter if the connection is not immediately altered, forcing an automatic flush: 您必须在消息末尾添加换行符,并且如果未立即更改连接,还必须刷新PrintWriter,从而强制进行自动刷新:
writer.write("Hello user 1\n");
writer.flush();
EDIT: 编辑:
It is possible to enable automatic flushing on a PrintWriter using the constructor new PrintWriter(someOutputStream, true)
使用构造函数
new PrintWriter(someOutputStream, true)
可以在PrintWriter上启用自动刷新
However, as explained in the documentation: 但是,如文档中所述:
if automatic flushing is enabled it will be done only when one of the println, printf, or format methods is invoked, rather than whenever a newline character happens to be output
如果启用了自动刷新,则仅在调用println,printf或format方法之一时才会执行此操作,而不是在碰巧输出换行符时执行
This means that even with automatic flushing, the PrintWriter would still have to be manually flushed after write
is called, and a newline character ( \\n
) would still have to be included at the end of the string. 这意味着即使使用自动刷新,在调用
write
操作后,仍必须手动刷新PrintWriter,并且在字符串的末尾仍必须包含换行符( \\n
)。
EDIT 2: 编辑2:
Here is a small example of a fully functional client/server application: 这是功能齐全的客户端/服务器应用程序的一个小示例:
Client: 客户:
public static void main(String[] args){
try{
Socket socket = new Socket(HOST_ADDRESS, PORT);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
bufferedReader.close();
socket.close();
}catch(IOException e){}
}
Server: 服务器:
public static void main(String[] args){
try{
ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("Hello user!\n");
printWriter.flush();
printWriter.close();
socket.close();
serverSocket.close();
}catch(IOException e){}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.