使用在客户端阻塞的套接字的客户端-服务器通信
Client-Server communication using sockets blocked at client-side
我正在编写一个简单的 local 客户端-服务器程序,它应该执行以下操作:
- 客户端将他的名字发送到服务器 ("client1")
- 服务器returns一个字符串"hello client1"
我遇到的问题是 "hello client1" 消息从未被检索到,相反程序只是保持 运行ning 而没有抛出任何异常或错误。我猜它与阻塞 bufferedReader 的 readLine 方法有关,但我还没有找到解决问题的合适方法。对于 运行 本地程序(参见 Main),我使用了一个 serverThread 和一个 clientThread,也许这也是问题的一部分。
注意:在下面的代码中,我在似乎导致问题的行上放置了注释块,其余代码 运行 没问题:
服务器:
public class Serverside implements Runnable{
PrintStream out;
int port;
Serverside(int port){
out = new PrintStream(System.out);
this.port = port;
}
void start(){
try{
ServerSocket serverSocket = new ServerSocket(port);
Socket connSocket = serverSocket.accept();
BufferedReader clientInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
DataOutputStream clientOutput = new DataOutputStream(connSocket.getOutputStream());
String clientName = clientInput.readLine();
String reply = "Hello " + clientName + "\n";
//clientOutput.writeBytes(reply);
clientOutput.close();
clientInput.close();
connSocket.close();
serverSocket.close();
}catch(Exception e){
out.println("Server: An exception has been thrown: " + e.getMessage());
}
}
@Override
public void run() {
out.println("Server running");
start();
}
}
客户:
public class ClientSide implements Runnable {
String hostname;
String clientName;
int port;
public ClientSide(String name, int port) {
hostname = "localhost";
this.port = port;
clientName = name;
}
void start(){
try{
Socket connSocket = new Socket(hostname, port);
BufferedReader serverInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
DataOutputStream serverOutput = new DataOutputStream(connSocket.getOutputStream());
serverOutput.writeBytes(clientName);
//String reply = serverInput.readLine();
//System.out.println("Server says: " + reply);
serverOutput.close();
serverInput.close();
connSocket.close();
}catch(Exception e){
System.out.println("Client: An exception has been thrown: " + e.getStackTrace().toString());
}
}
@Override
public void run() {
System.out.println("Client-side running");
start();
}
}
主要:
public class Main {
static final int PORT = 20000;
void start() {
Serverside server = new Serverside(PORT);
ClientSide client = new ClientSide("Elias",PORT);
Thread serverThread = new Thread(server);
Thread clientThread = new Thread(client);
clientThread.start();
serverThread.start();
}
public static void main(String[] args) {
new Main().start();
}
}
您正在读取线路但没有发送线路。您需要在客户端名称中添加一个行终止符。
我正在编写一个简单的 local 客户端-服务器程序,它应该执行以下操作:
- 客户端将他的名字发送到服务器 ("client1")
- 服务器returns一个字符串"hello client1"
我遇到的问题是 "hello client1" 消息从未被检索到,相反程序只是保持 运行ning 而没有抛出任何异常或错误。我猜它与阻塞 bufferedReader 的 readLine 方法有关,但我还没有找到解决问题的合适方法。对于 运行 本地程序(参见 Main),我使用了一个 serverThread 和一个 clientThread,也许这也是问题的一部分。
注意:在下面的代码中,我在似乎导致问题的行上放置了注释块,其余代码 运行 没问题:
服务器:
public class Serverside implements Runnable{
PrintStream out;
int port;
Serverside(int port){
out = new PrintStream(System.out);
this.port = port;
}
void start(){
try{
ServerSocket serverSocket = new ServerSocket(port);
Socket connSocket = serverSocket.accept();
BufferedReader clientInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
DataOutputStream clientOutput = new DataOutputStream(connSocket.getOutputStream());
String clientName = clientInput.readLine();
String reply = "Hello " + clientName + "\n";
//clientOutput.writeBytes(reply);
clientOutput.close();
clientInput.close();
connSocket.close();
serverSocket.close();
}catch(Exception e){
out.println("Server: An exception has been thrown: " + e.getMessage());
}
}
@Override
public void run() {
out.println("Server running");
start();
}
}
客户:
public class ClientSide implements Runnable {
String hostname;
String clientName;
int port;
public ClientSide(String name, int port) {
hostname = "localhost";
this.port = port;
clientName = name;
}
void start(){
try{
Socket connSocket = new Socket(hostname, port);
BufferedReader serverInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
DataOutputStream serverOutput = new DataOutputStream(connSocket.getOutputStream());
serverOutput.writeBytes(clientName);
//String reply = serverInput.readLine();
//System.out.println("Server says: " + reply);
serverOutput.close();
serverInput.close();
connSocket.close();
}catch(Exception e){
System.out.println("Client: An exception has been thrown: " + e.getStackTrace().toString());
}
}
@Override
public void run() {
System.out.println("Client-side running");
start();
}
}
主要:
public class Main {
static final int PORT = 20000;
void start() {
Serverside server = new Serverside(PORT);
ClientSide client = new ClientSide("Elias",PORT);
Thread serverThread = new Thread(server);
Thread clientThread = new Thread(client);
clientThread.start();
serverThread.start();
}
public static void main(String[] args) {
new Main().start();
}
}
您正在读取线路但没有发送线路。您需要在客户端名称中添加一个行终止符。