2017-01-06 2 views
0

Im создание сервера для моей игры, но этот вопрос более связан с Java. Поэтому я хочу проверить, является ли это сопутствующим сокетом, но я все же хочу запускать игру, потому что сервер размещается пользователем, а не отдельно от внешней программы. Но все же я хочу проверить, является ли кто-то соединение с помощью сокета. Что у меня сейчас есть:Проверка наличия входящего сокета

public void updateConnection() throws IOException { 


    Socket connection = server.accept(); 

    System.out.println("Ape is connecting"); 

    ServerClient client = new ServerClient(connection); 

    clientsWaiting.add(client); 

} 

Я хочу, чтобы этот метод использовался каждый кадр и не постоянно проверял, возможно ли это. Если не представляется возможным, что еще я должен использовать для создания своего сервера и проверить, подключены ли некоторые из них к каждому фрейму.

ответ

2

Лучше всего, если бы ваша игра проверила входящие соединения сокетов в отдельном потоке. Вы можете создать Runnable, который будет постоянно прослушивать подключения.

Когда вы проверяете наличие входящего соединения: Socket connection = server.accept();, то, что на самом деле происходит, вы размещаете блок на этом конкретном потоке, пока не получите соединение. Это приведет к тому, что ваш код перестанет выполняться. Единственный путь вокруг этого - распараллеливание. Вы можете обрабатывать все свои сетевые задачи в одном потоке, одновременно обрабатывая свою игровую логику и рендеринг на другом.

Помните, что при написании кода, который будет выполняться на нескольких потоках, много пит-падений. 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 s, чтобы отслеживать их, создавая новый Thread каждый раз, когда будет создано новое соединение, поэтому я предлагаю вам провести некоторое исследование этого.

Удачи вам, это непростая дорога, по которой вы собираетесь рисковать.

+0

Что вы имеете в виду? – Caspermartijn

+0

@Caspermartijn Я отредактировал мое сообщение – CraigR8806

+0

, и этот runnable я могу начать в любое время, когда хочу? – 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 

Таким образом, когда клиент заканчивает писать, но поток все еще открыт, ваш метод чтения блоков. Если вы ожидаете определенных данных от клиента, вы читаете его, а затем вызываете свой метод печати или, тем не менее, хотите сообщить, и т. Д.

Смежные вопросы