Java – 服务器仅在客户端停止时响应
Java – Server Only Responds when the Client has Stopped
我最近编写了一个简单的 Java 服务器,以及一个用于测试服务器的客户端。服务器应该从客户端接收消息,并发回消息的随机子字符串。问题是这样的:当我使用客户端程序发送消息时,服务器没有响应。然后,当我终止客户端程序时,服务器开始行动,并尝试将数据发送回客户端。服务器正确读取数据但仅在我停止客户端程序时才开始处理它。
这是客户端代码:
import java.io.*;
import java.net.*;
class ServerTest{
public static void main(String args[]) throws Exception{
Socket clientSocket = new Socket(myIpAdress, 8001);
//Send the message to the server
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String sendMessage = "randSubstring:WhosebugIsAwsome";
bw.write(sendMessage);
bw.flush();
System.out.println("Message sent: "+sendMessage);
String message = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())).readLine();
System.out.println("Message received from the server : " +message);
clientSocket.close();
}
}
我的服务器代码由两个 类 组成。这个是监听器:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerListener {
public static void main(String args[]) throws Exception {
String clientSentence;
ServerSocket socket = new ServerSocket(8001);
while(true) {
Socket connectionSocket = socket.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
//DataOutputStream output = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = input.readLine();
if(clientSentence.startsWith("randSubstring:")){
Thread connection = new Thread(new ServerConnection(connectionSocket, clientSentence));
connection.start();
}
Thread.sleep(300);
}
}
}
这是在客户端停止之前不会启动的线程:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Random;
public class ServerConnection implements Runnable{
private Socket serverConnection;
private String sentence;
public ServerConnection(Socket connection, String clientSentence){
serverConnection = connection;
sentence = clientSentence;
}
@Override
public void run() {
Random r = new Random();
String substring = sentence.substring(0, r.nextInt(sentence.length()));
try {
OutputStream os = serverConnection.getOutputStream();
OutputStream out = new BufferedOutputStream(os);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(substring);
bw.close();
out.close();
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我在 Yosemite 上使用 Macintosh。发生这种情况是因为我试图 运行 同一台计算机上的程序,还是如果程序是 运行 来自不同计算机的程序,是否会出现问题?感谢任何帮助。
在服务器中执行 readLine(..),这意味着它将等待行尾字符。
但是在您的发件人代码中,您只是发送了一个没有行尾的字符串。
所以要么你确保你也发送行尾字符,要么你的服务器等待其他东西作为 "delimiter"
您正在阅读一行但没有写一行。在发送的消息中添加一个行终止符。否则 readLine()
不会 return 直到对等方关闭连接。
NB accept之后try
块中的I/O应该在Runnable中,而不是它所在的位置。不要在接受循环中做 I/O。
我最近编写了一个简单的 Java 服务器,以及一个用于测试服务器的客户端。服务器应该从客户端接收消息,并发回消息的随机子字符串。问题是这样的:当我使用客户端程序发送消息时,服务器没有响应。然后,当我终止客户端程序时,服务器开始行动,并尝试将数据发送回客户端。服务器正确读取数据但仅在我停止客户端程序时才开始处理它。
这是客户端代码:
import java.io.*;
import java.net.*;
class ServerTest{
public static void main(String args[]) throws Exception{
Socket clientSocket = new Socket(myIpAdress, 8001);
//Send the message to the server
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String sendMessage = "randSubstring:WhosebugIsAwsome";
bw.write(sendMessage);
bw.flush();
System.out.println("Message sent: "+sendMessage);
String message = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())).readLine();
System.out.println("Message received from the server : " +message);
clientSocket.close();
}
}
我的服务器代码由两个 类 组成。这个是监听器:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerListener {
public static void main(String args[]) throws Exception {
String clientSentence;
ServerSocket socket = new ServerSocket(8001);
while(true) {
Socket connectionSocket = socket.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
//DataOutputStream output = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = input.readLine();
if(clientSentence.startsWith("randSubstring:")){
Thread connection = new Thread(new ServerConnection(connectionSocket, clientSentence));
connection.start();
}
Thread.sleep(300);
}
}
}
这是在客户端停止之前不会启动的线程:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Random;
public class ServerConnection implements Runnable{
private Socket serverConnection;
private String sentence;
public ServerConnection(Socket connection, String clientSentence){
serverConnection = connection;
sentence = clientSentence;
}
@Override
public void run() {
Random r = new Random();
String substring = sentence.substring(0, r.nextInt(sentence.length()));
try {
OutputStream os = serverConnection.getOutputStream();
OutputStream out = new BufferedOutputStream(os);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(substring);
bw.close();
out.close();
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我在 Yosemite 上使用 Macintosh。发生这种情况是因为我试图 运行 同一台计算机上的程序,还是如果程序是 运行 来自不同计算机的程序,是否会出现问题?感谢任何帮助。
在服务器中执行 readLine(..),这意味着它将等待行尾字符。
但是在您的发件人代码中,您只是发送了一个没有行尾的字符串。
所以要么你确保你也发送行尾字符,要么你的服务器等待其他东西作为 "delimiter"
您正在阅读一行但没有写一行。在发送的消息中添加一个行终止符。否则 readLine()
不会 return 直到对等方关闭连接。
NB accept之后try
块中的I/O应该在Runnable中,而不是它所在的位置。不要在接受循环中做 I/O。