2017-01-06 10 views
0

내 게임용 서버를 만들고 있는데이 질문은 자바와 관련이 있습니다. 그래서 나는 그들의 소켓을 확인하고 싶지만 서버가 사용자에 의해 호스팅되고 외부 프로그램에 의해 분리되지 않기 때문에 게임을 계속 실행하려고합니다. 하지만 여전히 누군가가 소켓을 사용하여 연결되었는지 확인하고 싶습니다. 내가 지금 가지고있는 것은 :들어오는 소켓이 있는지 확인

이 방법을 모든 프레임에서 사용하고 그것이 가능한지 계속 확인하지 않기를 바란다. 그것이 가능하지 않다면 내 서버를 만들고 각 프레임을 연결하는 서버가 있는지 확인해야합니다.

답변

2

게임 소켓 연결을 별도의 스레드에서 확인하는 것이 가장 좋습니다. 연결을 계속 수신하는 Runnable을 만들 수 있습니다.

들어오는 연결을 확인하면 실제로 발생하는 것은 연결을받을 때까지 특정 스레드에 블록을 배치하는 것입니다. 이렇게하면 코드 실행이 중지됩니다. 이 문제를 해결하는 유일한 방법은 병렬 처리입니다. 한 스레드에서 모든 네트워킹 작업을 처리 할 수 ​​있으며 게임 논리를 처리하고 다른 논리에서 렌더링 할 수 있습니다.

비록 여러 스레드에서 실행될 코드를 작성하는 경우 많은 오류가 발생합니다. Java는 잠재적 인 문제를 최소화 할 수있는 몇 가지 도구를 제공하지만 코드가 스레드로부터 안전함을 보장하는 것은 프로그래머에게 달려 있습니다. 병렬 프로그래밍과 관련된 많은 우려 사항에 대해 자세히 설명하는 것은이 질문의 범위를 벗어납니다. 이런 종류의 프로그래밍에서 발생하는 버그는 때로는 재현하고 추적하기가 어렵 기 때문에 약간의 연구를 해보는 것이 좋습니다. 지금은 당신이, 당신이 비슷한을 할 수있는 무엇을하려고 달성하기 위해 Runnable을 사용하려면이 면책 조항을 준 것을

:

Runnable networkListener =() -> { 
    //declare and instantiate server here 
    while(true){ 
     Socket connection = server.accept(); 
     //whatever you would like to do with the connection would go here 
    } 
} 
Thread networkThread = new Thread(networkListener); 
networkThread.start(); 

당신은 배치 할 당신의 게임 루프과 전 게임을 중단하지 않고 연결을 수신하는 스레드를 생성합니다. Socket을 처리하는 방법에 대한 좋은 관용구가 많이 있는데,이를 추적하기 위해 ThreadPool을 사용하고, 새로운 연결이 생성 될 때마다 Thread을 새로 산란합니다. 그래서 당신도 그 연구에 대해 연구 할 것을 권합니다.

당신에게 행운을 빈다, 당신이 곧 위험을 감수하고있는 길은 아닙니다.

+0

무엇을 의미합니까? – Caspermartijn

+0

@Caspermartijn 나는 내 게시물 – CraigR8806

+0

을 편집했으며이 실행 파일은 언제든지 시작할 수 있습니다. ?? – Caspermartijn

1

한 번 더 추가 : TCP 연결을 설정하면 프레임을 처리하지 않습니다 (UDP는 프레임 기반 프로토콜 임). 사용자는 바이트 스트림을 처리하고 있습니다. 낮은 레버 Byteoutpustream 예 :

InputStream inputStream = socket.getInputStream(); 

// read from the stream 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] content = new byte[ 2048 ]; 
int bytesRead = -1; 
while((bytesRead = inputStream.read(content)) != -1) { 
    baos.write(content, 0, bytesRead); 
} // while 

클라이언트가 작성 완료하지만, 스트림이 열려있는 그래서 때, 당신의 read 메소드 블록. 클라이언트의 특정 데이터가 필요하다고 생각되면 읽은 다음 인쇄 방법을 호출하거나 알리고 싶습니다.