即使有这个非常基本的客户端 - 服务器应用程序,我也遇到问题客户端没有发送数据/服务器没有收到。我无法理解问题出在哪里。我甚至开始认为我对套接字一无所知。
这是服务器代码:
public class Server
{
public static void main(String args[])
{
try{
ServerSocket serverSocket = new ServerSocket(3000);
Socket socket = serverSocket.accept();
System.out.println("Client connected: "+socket.getInetAddress.toString());
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
System.out.println(scanner.nextLine());
}
}catch(IOException e)
{
System.out.println("error");
}
}
}
这是客户端代码:
public class Client
{
public static void main(String args[])
{
Socket socket;
PrintWriter printWriter;
try {
socket = new Socket("127.0.0.1", 3000);
printWriter = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
printWriter.write("frejwnnnnnnnnnnnnnnnnnnnnnnnnosfmxdawehtcielwhctowhg,vort,hyvorjtv,h");
printWriter.flush();
}
}catch(IOException e)
{
System.out.print("error\n");
}
}
}
如果我在同一台机器上运行,服务器打印正确“客户端连接.....”,但然后不再打印。
问题是什么?
服务器读取下一行。客户端不发送任何行结束。因此服务器不可能知道该行应该结束,并阻塞直到它在流中找到EOL。或者直到客户端关闭其套接字。
在客户端代码中,您使用PrintWriter
装饰输出流,因此您可以使用println
。更换
printWriter.write("frejwnnnnn...rjtv,h");
printWriter.flush();
通过:
printWriter.println("frejwnnnnn...rjtv,h");
因为请求autoflush(在PrintWriter构造函数中为true),刷新是没用的。
在服务器代码中,您可以使用BufferedReader装饰器而不是Scanner:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}