【发布时间】:2014-07-05 16:58:20
【问题描述】:
这是我拥有的服务器的代码:
public class XXServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(4545);
while (true) {
Thread newThread = new Thread(new XXServerRunner(serverSocket.accept()));
newThread.start();
}
}
}
我将为每个接受的套接字创建一个单独的线程:
public class XXServerRunner implements Runnable {
Socket socket;
public XXServerRunner(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String readLine = bufferedReader.readLine();
if(readLine!=null) {
System.out.println(readLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这就是我运行客户端的方式:
public class XXClient {
Socket socket;
PrintWriter printWriter;
public static void main(String[] args) throws IOException {
XXClient xxClient = new XXClient();
xxClient.setSocket(new Socket("localhost",4545));
XXClientDataSender xxClientDataSender = new XXClientDataSender(xxClient);
Thread xxClientDataSenderThread = new Thread(xxClientDataSender);
xxClientDataSenderThread.start();
}
public PrintWriter getPrintWriter() {
return printWriter;
}
public void setSocket(Socket socket) throws IOException {
this.socket = socket;
this.printWriter = new PrintWriter(socket.getOutputStream());
}
public void sendText(String stringToBeSent) {
printWriter.write(stringToBeSent);
printWriter.flush();
}
}
我想要实现的也是一个用于发送文本的单独线程,所以我有这个:
public class XXClientDataSender implements Runnable {
XXClient xxClient;
Scanner scanner = new Scanner(System.in);
public XXClientDataSender(XXClient xxClient) {
this.xxClient = xxClient;
}
@Override
public void run() {
while (true) {
String stringToBeSent = scanner.nextLine();
xxClient.sendText(stringToBeSent);
}
}
}
当我运行我的代码时会发生什么,我在控制台中键入文本并按 Enter 几次,我在运行 ServerSocket 的控制台中什么也看不到。但是,当我停止执行客户端(我的意思是那个 Java 进程,当我杀死客户端的 Java 进程时),在服务器的控制台中,我看到现在可以看到所有文本。为什么会这样?
如果我说的不清楚,是这样的: 启动服务器 启动客户端 输入一些文字,按回车键.. 没有 输入一些文字,按回车键.. 没有 为客户端终止进程 服务器现在读取所有文本。
为什么?
在我终止客户端进程后,我也得到了这个异常:
Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at XXClientDataSender.run(XXClientDataSender.java:20)
at java.lang.Thread.run(Thread.java:745)
【问题讨论】:
-
因为从服务器上的套接字读取时有缓冲?
-
@jcaron 我认为这不是原因。无论我发送多长时间的文字,它仍然没有看到。
-
您的服务器套接字由于
while (true)而进入无限循环 -
@faizal 以便它可以继续从客户端套接字读取。当我终止客户端进程时,我会看到所有发送的数据。
-
您发送的行是否以换行符结尾?我不确定 printwriter 是否添加了它们。
标签: java multithreading sockets