2017-05-03 203 views
0

我正在尝试编写一个简单的客户端服务器,它会向用户请求回送带有字符串“Response:”的用户请求。Java套接字客户端服务器响应应用程序

他们是类似的问题,我看过,但我无法理解发生了什么。我试图写这个,但不能让它工作。主要是因为我对发生的事情非常困惑。

我已经评论过我的代码,因为我可以尝试解释我认为正在发生的事情。 我不知道是什么问题,当我运行这一点,并进入一个消息我没有得到响应

客户

public class Client { 

public void go() { 

    try { 
     //Create a Socket with ip and port number 
     Socket s = new Socket("127.0.0.1", 4242); 

     //Get input from user 
     Scanner in = new Scanner(System.in); 
     System.out.println("Please enter a message"); 
     String clientMessage = in.nextLine(); 

     //Make a printwriter and write the message to the socket 
     PrintWriter writer = new PrintWriter(s.getOutputStream()); 
     writer.write(clientMessage); 
     writer.close(); 

     //StreamReader to read the response from the server 
     InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
     BufferedReader reader = new BufferedReader(streamReader); 

     //Get the response message and print it to console 
     String responseMessage = reader.readLine(); 
     System.out.println(responseMessage); 
     reader.close(); 

    } catch (IOException ex) { 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

public static void main(String[] args) { 
    Client c = new Client(); 
    c.go(); 
} 

} 

服务器

public class Server { 

public void go() { 
    try { 
     //Make a ServerSocket to listen for message 
     ServerSocket ss = new ServerSocket(4242); 

     while (true == true) 
     { 
      //Accept input from socket 
      Socket s = ss.accept(); 

      //Read input from socket 
      InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
      BufferedReader reader = new BufferedReader(streamReader);     
      String message = reader.readLine(); 

      //get the message and write it to the socket as response 
      PrintWriter writer = new PrintWriter(s.getOutputStream()); 
      String response = "Response : " + message; 
      writer.println(response); 
      writer.close(); 

     } 
    } catch (IOException ex) { 
     Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public static void main(String[] args) { 
    Server server = new Server(); 
    server.go(); 
} 

} 
+1

当客户端充当客户端和服务器时,有点困难,但首先您的客户端和服务器客户端代码使用相同的端口号。大问题。 – jiveturkey

+0

你告诉我们你想要做什么,并且向我们展示了代码,但是你没有告诉我们发生了什么问题。毫无疑问。 “我无法理解正在发生的事情”不是一个问题。 –

+0

@ Mike Nakis当我尝试首先得到回应 –

回答

1

删除袜子serverSock从你的客户端代码中使用s.getInputStream。

套接字在双方都是双向的,所以当您发送回消息时您不需要在服务器上新建一个套接字,您不需要在客户端上接收套接字。

编辑

另外, “关闭返回的OutputStream将关闭关联的插座。” (文档为getOutputSteam),所以不要关闭写入器,只需刷新它。

服务器可以在其目前的形式工作,和客户端开始与小的变化(的println和flush)工作:

//Create a Socket with ip and port number 
Socket s = new Socket("127.0.0.1", 4242); 

//Get input from user 
Scanner in = new Scanner(System.in); 
System.out.println("Please enter a message"); 
String clientMessage = in.nextLine(); 

//Make a printwriter and write the message to the socket 
PrintWriter writer = new PrintWriter(s.getOutputStream()); 
writer.println(clientMessage); // <- println 
writer.flush();    // <- flush 

//StreamReader to read the response from the server 
InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
BufferedReader reader = new BufferedReader(streamReader); 

//Get the response message and print it to console 
String responseMessage = reader.readLine(); 
System.out.println(responseMessage); 
reader.close(); 
writer.close();    // <- new location for close (*) 

(*)主try块内使用接近不认为是安全的,因为无论何时有一个例外,这些行不会运行(另外,如果您使用任何一种智能IDE,它可能指出Socket对象本身和扫描器根本没有关闭)。延伸阅读:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

所以最终客户端可以,而这个样子,下面有更多的“当代”的方法:

try (
    Socket s = new Socket("127.0.0.1", 4242); 
    Scanner in = new Scanner(System.in); 
    PrintWriter writer = new PrintWriter(s.getOutputStream()); 
    InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
    BufferedReader reader = new BufferedReader(streamReader); 
) { 
    //Create a Socket with ip and port number 

    //Get input from user 
    System.out.println("Please enter a message"); 
    String clientMessage = in.nextLine(); 

    //Make a printWriter and write the message to the socket 
    writer.println(clientMessage); 
    writer.flush(); 

    //StreamReader to read the response from the server 

    //Get the response message and print it to console 
    String responseMessage = reader.readLine(); 
    System.out.println(responseMessage); 
} catch (IOException ex) { 
    ex.printStackTrace(); // (**) 
} 

(**)我绝对相信你没有检查日志,否则你会知道关于提前关闭Socket。当试验一小段代码时,我不会建议在晦涩难懂的日志中隐藏异常。实际上,我通常只是在所有地方写上“抛出异常”(包括main,这也是可能的),并让JRE把所有东西都转移到我的脸上。

+0

我已经删除了这个,但现在什么都没有hame –

+0

@MichaelGrinnell是的,您也需要println,正如WalterM所建议的 – tevemadar

+0

非常感谢,您已经清除了我的分配,我将在未来在房间中清除异常: ) –