Java 简单客户机-服务器程序的问题
我已经编写了双向客户机-服务器通信,其中客户机首先发送消息,然后服务器发送回复。但是,客户端在读取服务器发送的回复时被阻止(即,客户端没有打印任何内容,但服务器已正确发送回复)。代码如下:- 服务器代码:-Java 简单客户机-服务器程序的问题,java,client-server,Java,Client Server,我已经编写了双向客户机-服务器通信,其中客户机首先发送消息,然后服务器发送回复。但是,客户端在读取服务器发送的回复时被阻止(即,客户端没有打印任何内容,但服务器已正确发送回复)。代码如下:- 服务器代码:- import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputS
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
// Socket for accepting connections.
private static Socket socket;
public static void main( String[] args )
{
try
{
int port = 2550;
// Creating server socket on specified port.
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started listening on port "+port);
while(true)
{
// Accept the connection and read the message.
socket = serverSocket.accept();
BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream()));
String message = br.readLine();
System.out.println("Message recieved from client is :- " + message);
// Prepare and send the response back to client.
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));
String reply = "Thanks.Your reply has been recieved";
bw.write(reply);
bw.flush();
}
}
catch( Exception e )
{
e.printStackTrace();
}
finally
{
try
{
socket.close();
}
catch( Exception e )
{
}
}
}
}
客户端代码:-
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Client
{
private static Socket socket;
public static void main( String[] args )
{
try
{
String host = "localhost";
int port = 2550;
InetAddress address = InetAddress.getByName(host);
socket = new Socket(address, port);
// Send the message to the server.
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));
String message = "This is the message from Client.\n";
bw.write(message);
bw.flush();
System.out.println("Message sent to the server :- " + message);
// Get the reply from the server.
BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream()));
String reply = br.readLine();
System.out.println("Message recieved from the server :- " + reply);
}
catch( Exception e )
{
e.printStackTrace();
}
finally
{
// Closing the socket.
try
{
socket.close();
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
}
D:\Java_P>java Server
Server started listening on port 2550
Message recieved from client is :- This is the message from Client.
D:\Java_P>java Client
Message sent to the server :- This is the message from Client.
我发生这种情况是因为您的服务器发送的“谢谢。您的答复已收到”,其中不包含任何换行符。原因是,在客户机中,缓冲读取器readline方法阻塞,直到找到换行符 进行以下更改:
String reply = "Thanks.Your reply has been recieved\nDummy line 1";
现在,您可以在客户端日志中看到这些行。是否有可能到服务器的内部套接字连接足够快,以至于服务器在客户端创建读卡器捕获回复之前发送回复?另外,您是否启动了两个单独的终端,或者只启动一个终端来运行两个程序?在客户端代码中,在发送消息之前,请尝试创建
BufferedReader
。由于客户机和服务器同时运行,服务器*可能*在客户机能够接收到回复之前发送回复。@Gliderman我也怀疑这一点。是的,我启动了不同的终端。@Uber也尝试了,但没有成功。:)。我最近也遇到了同样的问题。我试图实现自己的简单web服务器。