Я написал код клиент / сервер, используя сокет Java-сервера (TCP). Сервер работает как радио, слушает микрофон и отправляет байты подключенным клиентам. Когда я запускаю код, используя «localhost» в качестве имени сервера, он работает очень хорошо, и я могу слышать голос в динамиках без каких-либо проблем.
Теперь, когда я хочу выставить localhost в интернет, используя ngrok:
Forwarding tcp://0.tcp.ngrok.io:11049 -> localhost:5000
Я начинаю получать ниже исключения на стороне клиента:
java.lang.IllegalArgumentException: illegal request to write non-integral number of frames (1411 bytes, frameSize = 2 bytes)
at com.sun.media.sound.DirectAudioDevice$DirectDL.write(Unknown Source)
at client.Client.Start(Client.java:79)
at client.Receiver.main(Receiver.java:17)
Кто-нибудь знает, почему и как я могу решить такую проблему?
Я попытался изменить длину массива байтов.
// код сервера
byte _buffer[] = new byte[(int) (_mic.getFormat().getSampleRate() *0.4)];
// byte _buffer[] = new byte[1024];
_mic.start();
while (_running) {
// returns the length of data copied in buffer
int count = _mic.read(_buffer, 0, _buffer.length);
//if data is available
if (count > 0) {
server.SendToAll(_buffer, 0, count);
}
}
// код клиента, где происходит исключение:
_streamIn = _server.getInputStream();
_speaker.start();
byte[] data = new byte[8000];
System.out.println("Waiting for data...");
while (_running) {
// checking if the data is available to speak
if (_streamIn.available() <= 0)
continue; // data not available so continue back to start of loop
// count of the data bytes read
int readCount= _streamIn.read(data, 0, data.length);
if(readCount>0){
_speaker.write(data, 0, readCount); // here throws exception
}
}
должен воспроизводить звук черездинамик.