2016-03-31 3 views
0

Я пытаюсь сделать что-то похожее на teamviewer, мой сервер отправляет команду клиенту, клиент начинает отправлять скриншоты, я продолжаю показывать их в JLabel, теперь, если мой сервер отправляет другая команда говорит «потоковое аудио», как я могу сделать свой поток потока клиента тоже вместе с потоком рабочего стола (сервер должен уметь понимать, какие данные получены)? следует ли использовать NIO? , Я не понимаю, как NIO могли бы помочь в написании нескольких выходов и чтении многоступенчатых выходов.Как правильно отправлять и получать несколько потоков

Редактировать - Например, мой сервер отправляет команду, и клиент передает этот поток в новый поток, и мой сервер снова отправляет команду для получения звука, а мой клиент запускает другой поток для получения звука, на данный момент есть два байта, поступающие на сервер, как мой сервер может правильно их обработать?

+0

NIO будет в основном мешать. Вам необходимо отправить идентификатор потока и длину перед каждым потоком. DataInput/OutputStreams - это путь. – EJP

+0

@EJP Я использую DataInputStream и DataOutputStream, и я конвертирую их в байт [], а затем отправляю их и воссоздавая ими изображение, моя архитектура клиент-сервер - это то, что мой сервер принимает ответы только в том случае, если он отправил клиенту ответ, а также какой тип данных идентификатор shal i use ?, будет ли он поврежден, если я отправлю его вместе с байтами изображения? –

+0

Отправьте его первым, вместе с длиной, как я уже сказал. * Перед * байтами изображения. Короткий или int будет делать для типа, а int (вероятно) для длины. – EJP

ответ

0

Вам необходимо отправить идентификатор потока и длину перед каждым потоком. NIO будет в основном мешать. DataInput/OutputStreams - это путь.

Короткий или int для типа и int (возможно) для длины.

dos.writeShort(type); 
dos.writeInt(length); 
dos.write(data); 

и ...

int type = dis.readShort(); 
int length = dis.readInt(); 
byte[] buffer = new byte[length]; 
dis.readFully(buffer); 

Вы должны послать команду, если у вас есть команда для отправки, но читать все, что клиент посылает вам нужен другой поток, который постоянно в чтении () до разъединения.

Правильно ли отключить клиента, если при чтении или записи выбрано исключение IOException? или это может быть из-за некоторых других причин, таких как задержки?

Вы должны закрыть розетку на любом IOException, отличном от `SocketTimeoutException.

+0

Спасибо @EJP, используется короткое, о, я вижу, кроме SocketTimeout хорошо получил его сейчас –