我想创建一个示例TCP客户端 - 服务器对。客户端将从控制台获取输入字符串并将其发送到服务器,服务器将打印请求字符串并回复一些字符串。我不想在事务完成后关闭连接,使用我希望继续发送请求并从服务器获取响应的相同连接。
我编写了以下客户端 - 服务器代码,第一个事务正确发生但当我尝试发送第二个请求时,服务器和客户端没有收到任何内容。我试图谷歌寻求解决方案,但找不到任何有用的东西。请帮忙。
客户代码
public class Client {
public static void main( String[] args ) throws UnknownHostException, IOException {
Socket clientSocket = new Socket( "localhost", 81 );
DataOutputStream out = new DataOutputStream( clientSocket.getOutputStream() );
BufferedReader in =
new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
System.out.println( "connected to server" );
while ( true ) {
System.out.println( "enter data to send" );
Scanner sc = new Scanner( System.in );
String msg = sc.nextLine();
out.writeBytes( msg + "\n" );
System.out.println( "response from server : "+in.readLine() );
}
}
}
服务器代码
public class Server {
public static void main(String args[]) throws IOException{
ServerSocket ss = new ServerSocket(81);
System.out.println( "server started" );
while(true){
System.out.println( "waiting for client" );
Socket s = ss.accept();
System.out.println( "connected to client" );
BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
DataOutputStream out = new DataOutputStream( s.getOutputStream() );
out.flush();
System.out.println( "recieved: "+ in.readLine() );
out.writeBytes( "200\n" );
}
}
}
答案 0 :(得分:2)
当您的服务器启动时,它会创建一个绑定在端口81上的服务器套接字并进入无限循环。在这个循环中,你开始接受"接受"状态,您在那里监听要建立的连接并接受它。接受后,您等待来自客户端的一行输入,将其打印到System.out,并使用" 200"响应。您遇到的问题是,在您做出响应后,循环重置'并开始侦听新连接。
最简单的解决方案是持续检查服务器中的传入数据。
public class Server {
public static void main(String args[]) throws IOException{
ServerSocket ss = new ServerSocket(81);
while(true){
Socket s = ss.accept();
BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
DataOutputStream out = new DataOutputStream( s.getOutputStream() );
while (true) {
System.out.println( "recieved: "+ in.readLine() );
out.writeBytes( "200\n" );
out.flush();
}
}
}
}
虽然这适用于单个客户端,但这会阻止您在侦听数据时建立新连接。您可能希望为每个连接创建一个新线程,以处理每个不同套接字连接的读/写。
答案 1 :(得分:1)
正如Zachary所说,他的解决方案仅适用于单个客户端,对于多个客户端,您需要为每个客户端创建一个新线程,如下所示:
public class Server {
private ServerSocket server;
public Server(int port) {
server = new ServerSocket(port);
}
public void listenForConnections() {
while (true) {
Client client = new Client(server.accept());
new Thread(client).start();
}
}
}
public class Client implements Runnable {
private Socket socket;
public Client(Socket socket) {
this.socket = socket;
}
public void run() {
while (true) {
// Do something
}
}
}