2013-03-02 214 views
1

我制作了一个基于TCP/IP的基本项目,其中服务器监听客户端,然后提供传入数据的大写句子。简单客户端服务器程序

Server.java:

import java.io.*; 
import java.net.*; 
public class Server 
{ 

    public static void main(String[] args) throws Exception 
    { 
     ServerSocket ss = new ServerSocket(7948); 
     Socket s= ss.accept(); 
     System.out.print("Server connected\n"); 

     BufferedInputStream bis = new BufferedInputStream (s.getInputStream()); 
     BufferedOutputStream bos = new BufferedOutputStream (s.getOutputStream()); 

     while(true) 
     { 
      int a = bis.available(); 
      byte b[] = new byte[a]; 
      bis.read(b); 
      String str = new String(b); 
      str = str.toUpperCase(); 
      b = str.getBytes(); 
      bos.write(b,0,b.length); 
      bos.flush(); 

      if(str.equals("BYE")) 
       break; 
      else 
       continue; 
     } 
     System.out.print("\nServer Disconnecting"); 
     String str = "Adios Amigo"; 
     bos.write(str.getBytes()); 
     bos.flush(); 

     bis.close(); 
     bos.close(); 
     ss.close(); 
     s.close(); 
    } 
} 

Client.java:

import java.io.*; 
import java.net.*; 
public class Client 
{ 

    public static void main(String[] args) throws Exception 
    { 
     BufferedReader clientStream = new BufferedReader(new InputStreamReader(System.in)); 
     String str; 
     int a; 
     byte[] b; 

     Socket s = new Socket(InetAddress.getLocalHost(), 7948); 

     BufferedOutputStream bos = new BufferedOutputStream (s.getOutputStream()); 
     BufferedInputStream bis = new BufferedInputStream (s.getInputStream()); 

     one:while(true) 
     { 
      str = clientStream.readLine(); 
      b =str.getBytes(); 
      bos.write(b); 
      bos.flush(); 

      a=bis.available(); 
      b = new byte[a]; 
      bis.read(b); 
      str = new String (b); 
      str.trim(); 
      System.out.print("The server says: "+str); 
      if (str.equals("BYE")) 
      { 
       bis.read(b); 
       str = new String (b); 
       System.out.print("The server says: "+str); 
       break one; 
      } 
     } 

     s.close(); 
     clientStream.close(); 
     bos.close(); 
     bis.close(); 
    } 
} 

该方案是除了一个问题正常工作,在客户端侧的输出来的两个输入之后。这意味着我必须提供来自客户端的两个输入以获得第一个输出,并且这继续。我无法跟踪该错误。 任何人都可以请帮忙吗?

回答

3

在客户端,您发送数据到服务器,然后立即呼叫a.available() - 此功能不会等待从服务器发送数据。由于调用.available()时服务器不太可能用数据做出响应,函数返回零。

因此,您的字节数组b(请在将来使用更多的描述性变量名称)长度为零。

一旦创建了大小为零的数组,您最终通过调用bis.read()来等待数据 - .read()是一个阻塞调用。它会等待来自服务器的数据。这个数据实际上没有读取,因为你正在读取的数组大小为零。这会导致打印出空字符串。

下面的代码将解决这个问题,但对于未来,我不建议使用.available()--这在我的经验中是相当不可靠的。您应该通过简化尝试读取数据来检查数据是否可用。

Client.java:

one:while(true) 
    { 
     str = clientStream.readLine(); 
     b =str.getBytes(); 
     bos.write(b); 
     bos.flush(); 

     while (bis.available() <= 0) 
     { 
      // wait for data! 
     } 

     a=bis.available(); 
     b = new byte[a]; 
     bis.read(b); 
     str = new String (b); 
     str.trim(); 
     System.out.print("The server says: "+str); 
     if (str.equals("BYE")) 
     { 
      bis.read(b); 
      str = new String (b); 
      System.out.print("The server says: "+str); 
      break one; 
     } 
    } 
+0

感谢亚历克斯 我会记住你的建议,而在未来的变量命名:) – Rajat 2013-03-02 08:23:52