2012-10-31 71 views
0

目的:将数据发送到服务器,并有服务器返回的东西回来,并打印的内容服务器发回读取和写入服务器

问题:如果我关闭了流,它可以将数据发送到服务器,但我的输入流将无法工作,我无法收到服务器试图给我的东西。如果我使用flush()将数据发送到服务器,则服务器永远不会接收数据。我一直坚持这3个小时。你怎么做,同时阅读和写入。

Client.java

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

class Client { 
    public static void main(String args[]) { 
     String data = "head"; 
     try { 
      Socket skt = new Socket("server", 5050); 
      PrintWriter out = new PrintWriter(skt.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
      out.print(data); 
      out.close(); 

      System.out.println("Sent data"); 
      while (!in.ready()) { 
      } 

      String input = in.readLine(); 
      System.out.println(input); 

      out.close(); 
      in.close(); 
      skt.close(); 
     } catch (Exception e) { 
      System.out.print("Whoops! It didn't work!\n" +e.toString()); 
     } 
    } 
} 

Server.java

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.PrintWriter; 

class Server { 
    public static void main(String args[]) { 
     String data; 
     String input; 
     try { 
      ServerSocket srvr = new ServerSocket(5050); 
      Socket skt = srvr.accept(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        skt.getInputStream())); 
      PrintWriter out = new PrintWriter(skt.getOutputStream(), true); 

      // /////Waits for message from client///////// 
      while (!in.ready()) { 
      } 
      // /////////////////////////////////////////// 

      input = in.readLine(); // Read the message 
      System.out.println("Received String input: " + input); 
      // Send output to client 
      System.out.println("After output"); 
      if (input.equals("head")) 
       data = "haha"; 
      else 
       data = "Wtf did you send me"; 
      Thread.sleep(2000); 
      out.print(data); 
      // /////////////////// 

      System.out.println("Sent data: " + data); 
      in.close(); 
      out.close(); 
      skt.close(); 
      srvr.close(); 
     } catch (Exception e) { 
      System.out.print("Whoops! It didn't work!\n"); 
     } 

    } 
} 
+0

服务器阻塞什么声明?客户端在哪里阻塞?你有没有在IDE调试器中运行它? –

回答

2

在你的客户,你必须:

out.print(data); 
out.close(); 

,并在您的服务器必须:

input = in.readLine(); 

客户端发送消息无需换行字符 - 这就是为什么in.ready()。更重要的是 - 它关闭PrintWriter而不是刷新(您也在程序结束时关闭流)。如果您将该行更改为:

out.println(data); // sends message with new line character 
out.flush();  // unnecessary 

客户端发送消息。同样的事情是,当服务器发送消息 - 您使用print代替println但使用readLine读取到新行字符的客户端读取,或更确切地说(BufferedReader|readLine()):

读取一行文本。换行符被换行符('\ n'),回车符('\ r')或回车符后面的换行符中的任何一个结束。

一两件事 - 您连接到使用"server"主机服务器。对于我的测试,我将其更改为"localhost"。也许还有其他错误?

+0

非常感谢,这非常有帮助 –

相关问题