Это неопределенное поведение в соответствии со стандартом C ++:
Значение E1 & lt; E2 - левые сдвинутые позиции E2; освобожденные биты заполняются нулями. Если E1 имеет неподписанный тип, значение результата E1 × 2 ^ E2, приведенное по модулю больше, чем максимальное значение, представляемое в типе результата. В противном случае, если E1 имеет подписанный тип и неотрицательное значение, а E1 × 2 ^ E2 представляется в типе результата, то это результирующее значение; в противном случае поведение не определено.
blockquote>
Как уже упоминалось в комментариях read
и accept
, операции обычно блокируются на Socket
.
Вы можете создать собственный Thread
, который ожидает сообщения от вашего Socket
, а затем изменить графический интерфейс. Имейте в виду, что Swing не безопасен для потоков.
Если мне нужно создать собственный Thread
, я использую интерфейс Runnable
. Вы можете достичь этого следующим образом:
public class MySocketListener implements Runnable {
private final GUIClass guiClass;
private final ServerSocket serverSocket;
private Socket clientSocket;
public MySocketListener(GUIClass guiClass, ServerSocket serverSocket) {
this.guiClass = guiClass;
this.serverSocket = serverSocket;
}
/* Everything that happens in this method, is done on another Thread. */
@Override
public void run() {
try{
this.clientSocket = this.serverSocket.accept();
Scanner sc = new Scanner(this.clientSocket.getInputStream());
while(true) {
/* Blocking operations */
this.guiClass.doSomething();
}
} catch(IOException ex) {
ex.printStackTrace();
}
}
}
Затем можно легко запустить Thread
:
Thread socketListenerThread = new Thread(new MySocketListener(this, serverSocket));
socketListenerThread.start();
Для получения дополнительной информации ознакомьтесь с темой и документация на сокет .