2013-03-02 3 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()이 호출 될 때까지 서버가 데이터로 응답하지 않을 가능성이 있으므로이 함수는 0을 반환합니다.

때문에 바이트 배열 b (나중에 더 많은 변수 이름을 사용하십시오)은 길이가 0입니다.

일단 크기가 0 인 배열이 생성되면 bis.read()을 호출하여 데이터를 기다립니다. 호출을 차단합니다. 그것은 서버로부터의 데이터를 기다릴 것이다. 이 데이터는 실제로 읽히지 않습니다. 읽는 배열은 크기가 0이기 때문입니다. 이 결과 빈 문자열이 인쇄됩니다.

다음 코드는 문제를 해결할 예정이지만 나중에는 .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

관련 문제