2013-11-22 3 views
2

서버를 실행할 때 클라이언트 서버 응용 프로그램이 있습니다. 서버 클래스에서 인쇄 할 때 얻을 수 있지만 Client 클래스를 실행하면 연결이 설정된 경우에도 아무 것도 발생하지 않습니다. 클라이언트 클래스처럼 보입니다. 여기 클라이언트 서버가 통신하지 않습니다

서버

에서 모든 메시지를 수신하지 않는 것은 내 서버 코드

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server { 
ServerSocket provider; 
Socket clientsocket; 
OutputStream out; 
InputStream in; 
InetAddress clientAddress; 
StringBuilder sb; 
BufferedReader br; 
String msg=""; 
Server(){ 
} 
public void Communicate() 
{ 
    try { 

     provider=new ServerSocket(2013); 
     System.out.println("Server Waiting for connections"); 
     clientsocket=provider.accept(); 
     System.out.println("incoming connection from "); 
     clientAddress=clientsocket.getInetAddress(); 
     //System.out.println("Client Name"+clientAddress.getHostName()); 
     System.out.println("Client Address "+clientAddress.getHostAddress()); 
     out=clientsocket.getOutputStream(); 
     in=clientsocket.getInputStream(); 
     sendmsg("connection success"); 
     do 
     { 
      msg=read_instream(in); 
      System.out.println("client say"+msg); 
      if(msg.equals("bye")) 
      { 
       sendmsg(msg); 
       clientsocket.close(); 
       in.close(); 
       out.close(); 
      } 
     } 
     while(!msg.equals("bye")); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
private void sendmsg(String msg) throws IOException 
{ 

    out.write(msg.getBytes()); 
    out.flush(); 
} 
private String read_instream(InputStream in) throws IOException 
{ 
    br=new BufferedReader(new InputStreamReader(in)); 
    sb=new StringBuilder(); 
    while (br.readLine()!=null) 
     sb.append(br.readLine()); 

    return sb.toString(); 
} 

public static void main(String[] args){ 
    Server provider=new Server(); 
    while(true) 
     provider.Communicate(); 
} 

} 

와 클라이언트 코드

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 


public class Client { 
    Socket client; 
    String msg="give me the last degree"; 
    OutputStream out; 
    InputStream in; 
    StringBuilder sb; 
    BufferedReader br; 
    public void Communicate() 
    { 
     try { 
      client=new Socket("localhost",2013); 
      out=client.getOutputStream(); 
      in=client.getInputStream(); 
      System.out.println("Messege from server:"+read_instream(in)); 
      while (!msg.equals("bye")) 
      { 
       msg=read_instream(in); 
       System.out.println("server say"+msg); 
       sendmsg("hey from client"); 
       msg="bye"; 
       sendmsg(msg); 
      } 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private String read_instream(InputStream in) throws IOException 
    { 
     br=new BufferedReader(new InputStreamReader(in)); 
     sb=new StringBuilder(); 
     while (br.readLine()!=null) 
      sb.append(br.readLine()); 

     return sb.toString(); 
    } 
    private void sendmsg(String msg) throws IOException 
    { 

     out.write(msg.getBytes()); 
     out.flush(); 
    } 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Client requester=new Client(); 
     requester.Communicate(); 


    } 

} 

답변

1

귀하의 read_instrea입니다 m 메소드는, 스트림이 닫을 때까지 블록합니다. br.readline()은 "스트림의 끝에 도달 할 때까지"null을 반환하지 않습니다 (javadoc 참조). 서버 클래스는 메시지를 보내고 플러시하지만 스트림을 끝내지 않습니다.

편집 : 차단 문제는 여전히 발생합니다. 서버는 클라이언트로부터 메시지를 수신 한 후에 만 ​​클라이언트로의 출력 스트림을 닫습니다. 그러나 서버의 read_instream() 메소드는 클라이언트가 스트림을 닫을 때까지 대기합니다. 클라이언트는 서버가 처음부터 닫힐 때까지 기다리고 있기 때문에 절대로 닫지 않습니다. 그래서 하나의 옵션은 sendmsg() 메소드에서 outputstream을 닫는 것입니다. 그러나 다른 어떤 메시지도 보낼 수 없습니다. read_instream() 메서드를 변경하여 각 행 다음에 반환하고 스트림의 끝을 기다리지 않아도됩니다.

Oracle docs에서 클라이언트/서버 자습서를 읽으십시오. 그들은 서버와 클라이언트 사이의 장기간 대화를 위해 두 번째 옵션을 사용합니다. read_instream() 메소드에서 스트림의 끝을 기다리지 마십시오. 튜토리얼이 끝나면 간단히 여러 클라이언트를 지원할 것입니다.

+0

sry 나는 코드에서 무엇을해야하는지 알 수있는 답변을 얻지 못했습니다? – Tony

+0

나는 그것을 사용할 때마다 닫았지만 아무 것도 바뀌지 않았다. – Tony

관련 문제