2017-11-06 2 views
0

서버와 클라이언트로 멀티 스레드 행맨 게임을 만들어야하는 과제가 있습니다. 나는 게임 (Hangman)을 만들 클래스를 만들고 try 클래스의 catch 메소드를 사용하여 Server 클래스를 만듭니다. 클라이언트 클래스는 포트에 연결하여 재생할 수있는 클라이언트를 갖습니다.오브젝트를 Java 클라이언트의 클라이언트로 사용

제 질문은 행맨 게임에서 클라이언트를 만들고 서버에 요청을 별도의 프로그램이 아닌 객체로 보내는 방법은 무엇입니까? 미리 감사드립니다.

+0

신청서를 어떻게 보내시겠습니까? – Stultuske

+1

'별도의 프로그램이 아니라 객체로'란 의미는 무엇입니까? – EJP

+0

@EJP 질문 제목으로 판단하면, 그는 서버 측에서만 프로그램을 실행하려고하고, 다른 방법은 서버 측 프로그램을 사용하여 원격 컴퓨터에서 클라이언트 소켓을 열 것이라고합니다. (어느 쪽이 가능하지 않습니까) –

답변

0

Java에서는 Sockets이라는 객체를 사용하여 네트워크를 통해 특정 IP 및 포트로 데이터를 보낼 수 있습니다. 해당 데이터는 포트에서 수신 대기중인 ServerSocket에 의해 수신됩니다.

소켓은 서버 소켓과 연결되면 원격 연결을 받아 들일 것입니다 ServerSocket#accept, 를 호출 (호출이 응답 할 당신이 호출 할 경우 모든 호출을 대기 전에 accept, 그것은 것입니다 허용 할 때까지 모든 발신 전화를 큐에 돌아 오기 전에 요청을 기다리십시오). accept 메서드는 데이터를 보내고 받기위한 입력 및 출력 스트림을 모두 가진 일반 소켓 객체를 반환합니다.

참고 : 같은 시간에 전화를 대기 할 수 여러 소켓마다 당신이 이 accept() 서버가 다음중인 소켓을 받아 호출합니다. accept 메서드는 Scannernext() 메서드와 매우 유사하게 작동합니다. 은 혼란 스럽지만 여기에 대해 자세히 알아볼 수 있습니다 : ServerSocket listens without accept().

내가 (accept에서 얻은) 서버 소켓의 입력 스트림에서 ObejctInputStream를 구성 제안, 클라이언트 소켓의 출력 스트림에서 ObjectOutputStream.

수신 데이터를 전송하는 두 소켓을해야 할 경우, 단순히 서버 측에 ObjectOutputStream, 클라이언트 측의 ObjectInputStream을 만들 수 있습니다. 루프를 사용하거나 두 유형의 스트림을 청취하려면 어떤 유형의 Runnable을 사용해야합니다 (할당이 다중 스레드이므로 Runnable이 가장 좋습니다).

일반적으로 한이 유사한 방식으로 클라이언트 소켓에 접근하는 것입니다 : 당신이 소켓을 사용하여 완료 할 때 shutdown 메소드를 호출하는 것이 중요하다

public class ObjectSocket{ 

private Socket socket; 
private ObjectOutputStream streamOut; 
private ObjectInputStream streamIn; 

public ObjectSocket(String IP, int port) throws UnknownHostException, IOException { 
    //Request connection. 
    this.socket = new Socket(InetAddress.getByName(IP), port); 
} 
public void sendObject(Object obj) throws IOException { 
    if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream()); 

    //Make sure the connection is still there and the socket is still open. 
    if(this.socket.isConnected() && !this.socket.isClosed()) 
     //Send it! 
     this.streamOut.writeObject(obj); 
} 

public Object recieveObject() throws IOException, ClassNotFoundException { 
    if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream()); 

    //Cast appropriately. 
    return this.streamIn.readObject(); 
} 
public void shutdown() throws IOException { 
    //End the connection 
    this.socket.close(); 
} 
} 

. 포트를 열어두면 위험 할 수 있습니다.

서버 측 소켓은 거의 같은 방식으로 접근하고 있습니다 :

public class ServerObjectSocket { 

private ServerSocket servSocket; 
private Socket socket; 
private ObjectOutputStream streamOut; 
private ObjectInputStream streamIn; 

public ServerObjectSocket(int port) throws IOException { 
    //Listen on this port : 0 will listen on a random port. 
    this.servSocket = new ServerSocket(port); 
} 
public void acceptConnectionRequest() throws IOException { 
    //Connect with any client socket that is trying this port 
    this.socket = servSocket.accept(); 
} 
public Object recieveObject() throws IOException, ClassNotFoundException { 
    if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream()); 

    //Cast appropriately. 
    return this.streamIn.readObject(); 
} 
public void sendObject(Object obj) throws IOException { 
    if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream()); 

    //Make sure the connection is still there and the socket is still open. 
    if(this.socket.isConnected() && !this.socket.isClosed()) 
     //Send it! 
     this.streamOut.writeObject(obj); 
} 
public void shutdown() throws IOException { 
    //Close the port and end the connection : never leave a port open. 
    this.servSocket.close(); 
} 
} 

염두에 유지, 서로 다른 네트워크에 소켓 사이의 연결은 가능한 경우 전달 된 포트에서 실행에서 서버 소켓. LAN에서 실행중인 소켓은이 문제에 직면하지 않지만 방화벽에는 어려움이있을 수 있습니다.

더 나은 이해 또는 예제가 필요한 경우 인터넷에서 Java 소켓 자습서를 검색하십시오. 웹을 둘러싼 유용한 자습서가 많이 있으며 찾기가 어렵지 않습니다.

+0

데이터는'ServerSocket'에 의해 수신되지 않습니다. 'Socket.isConnected()'는 테스트하고있는 어떤 지점에서도 false가 될 수 없습니다. 'checkInput()'메쏘드는 잘못된 스트림을 검사하고,'available()'을 체크하는 것은 일반적으로 무의미하다. 입력 스트림이나 소켓을 닫을 필요는 없습니다. 허용 된 소켓은 인스턴스 멤버가 아니어야합니다. 품질이 매우 떨어지는 코드. – EJP

+0

그리고'accept()'에 의해 연결이 성립되지 않습니다. 심지어 호출되기 전에 존재할 수 있습니다. – EJP

+0

'데이터가'ServerSocket'에 의해 수신되지 않을 것입니다. 이것이 사실인지 어떻게 볼 수 없습니다. 열려있는 서버 소켓이있는 포트로 데이터를 보내면 매번 데이터가 수신됩니다. –

관련 문제