2014-04-14 291 views
2

我有一个简单的socket/serversocket示例,我正在试图运行,但客户端和服务器在BufferedReader试图读取时挂起。下面是每个代码:Java客户端/服务器不通过Socket/ServerSocket进行通信

服务器

package picturePerfect; 
--imports-- 

public class PictureServer implements Runnable{ 
static ServerSocket serverSocket; 

public static void main(String[] args) throws IOException { 
    serverSocket = new ServerSocket(2342); 
    Thread firstSessionThread = new Thread(new PictureServer()); 
    firstSessionThread.start(); 
} 

@Override 
public void run() { 
    Socket socket = null; 
    try { 
     socket = serverSocket.accept(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String clientRequest = bufferedReader.readLine(); 
     System.out.println(clientRequest); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     printWriter.println("Sent from server!"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
} 

}

CLIENT

package picturePerfect; 
--imports-- 

public class PictureClient { 
    public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException { 
     Socket socket = new Socket("localhost", 2342); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     printWriter.write("Sent from client!"); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String response = bufferedReader.readLine(); 
     System.out.println(response); 
     socket.close(); 
    } 
} 

这是我能简化我的代码,以最起码的。我有一个示例程序,我一直遵循,这似乎几乎完全相同。这是样板服务器和客户端(即工作):

示例服务器

--imports-- 

public class Server implements Runnable{ 
    static ServerSocket ss; 

    public static void main(String[] args) throws IOException { 
     ss = new ServerSocket(3142); 
     Thread thread = new Thread(new Server()); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      Socket s = null; 

      try { 
       s = ss.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       String operands = br.readLine(); 
       System.out.println(operands + " was received"); 
       PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 
       pw.println(operands + " right back!"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

样本客户

--imports-- 

public class Server implements Runnable{ 
    static ServerSocket ss; 


    public static void main(String[] args) throws IOException { 
     ss = new ServerSocket(3142); 
     Thread thread = new Thread(new Server()); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      Socket s = null; 

      try { 
       s = ss.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       String operands = br.readLine(); 
       System.out.println(operands + " was received"); 
       PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 
       pw.println(operands + " right back!"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

我试图把while循环进入我的服务器和我的客户端和服务器移动到默认包,但都没有帮助。我也尝试使用read()而不是readLine(),并以\r\n结束printWriter的行,但在那里没有成功。

为什么我的代码挂在readLine()上,特别是当示例代码不是?

+0

如果您使用的是Windows,请查看http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx中的TCPView,以监视由端口/进程发送/接收的数据包。几个星期前,我在Java中创建服务器/客户端应用程序时使用了它,并且可以很方便地查看它是显示错误还是网络错误。 – Matthew

+0

哦,这很酷!我并没有在这里需要它,但它对我下一个项目会很有用。谢谢! –

回答

2

什么readline()所做的是等到它看到一个新的行字符,直到它返回,因此readLine()。

在你的客户端,你不写一个新行。您可以使用:

printWriter.write("Sent from client!"); 

相反,写一个换行符到使用的println流,

printWriter.println("Sent from client!"); 
+1

哦,伙计。我觉得我需要重新学习基本知识,哈哈。谢谢!猜猜你只是需要另一双眼睛来看看它有时。 :P –

2

Server希望读取行,所以你需要你的按摩后添加行分隔符。要做到这一点,而不是

printWriter.write("Sent from client!"); 

在客户端使用

printWriter.println("Sent from client!"); 
//   ^^^^^^^ 

printWriter.write("Sent from client!"+System.lineSeparator()); 
printWriter.flush(); 

您将需要flush自己,因为自动冲洗中的PrintWriter仅适用于printlnprintf,或format,不适用于write方法

+0

谢谢!我想你有时候必须让其他人看到它,哈哈。 –

+0

大多数问题的故事:)无论如何,我很高兴我可以提供帮助。 – Pshemo