Ответ 1
Я прокомментирую ваш код по частям.
private static ServerSocket serverSocket;
Нет причин для статичности.
while(true)
{
try
{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
Последние две строки должны быть впереди цикла. Это является причиной отказа в подключении, и это также вызовет BindExceptions
, о котором вы не упомянули. Непонятно, зачем вам нужен тайм-аут.
Socket clientSoc = serverSocket.accept();
System.out.println("Waiting for client on port " +serverSocket.getLocalPort() + "...");
Нет, нет. Он уже подключился. Вы ждали до accept().
System.out.println("Just connected to " + clientSoc.getRemoteSocketAddress());
InputStream in = clientSoc.getInputStream();
while(in!=null)
Оба цикла и теста бесполезны. Первоначально переменная не является нулевой, и она никогда не может стать нулевой. Цикл бесполезен, потому что метод writeToFile()
полностью исчерпывает входной поток, поэтому больше ничего не читать. Это приведет к появлению нежелательных данных, о которых вы не упомянули.
{
writeToFile(in);
}
System.out.println("socket");
Беспредметное сообщение.
clientSoc.close();
Весь код из строки после accept()
здесь должен быть выполнен в отдельном потоке. Контур принятия должен ничего не делать, кроме как принимать соединения и запускать потоки.
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
То, что здесь было, было accept()
, так как прослушивающий сокет - это единственный сокет, на который вы установили таймаут. Я сомневаюсь, что вам это нужно.
break;
}catch(IOException e)
{
e.printStackTrace();
System.out.println("some io");
Другое бесполезное сообщение.
break;
} catch (Exception e) {
System.out.println("some e");
Еще один. Когда вы получите исключение, распечатайте исключение. Не какое-то тщетное сообщение о вашем собственном проекте. В противном случае отладка станет простой гадательной игрой.
e.printStackTrace();
}
}
}
private void writeToFile(InputStream in) throws IOException {
// Write the output audio in byte
String filePath = "8k16bitMono1.wav";
short sData[] = new short[1024];
Неиспользованный. Удалить.
byte[] bData = IOUtils.toByteArray(in);
Не используйте это. Он тратит пространство и добавляет латентность. Ниже приведено правильное решение.
FileOutputStream os = null;
try {
os = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Плохая техника. Этот catch
находится не в том месте. Код, который зависит от успеха кода в блоке try
, должен находиться внутри одного и того же блока try
. В настоящее время вы проваливаете этот try-catch
, как будто исключение никогда не происходило, что приведет к появлению NullPointerException
в коде ниже.
System.out.println("Short wirting to file" + sData.toString());
Другое бессмысленное сообщение. С ошибками в написании; sData
ничего не имеет; sData.toString()
не печатает ничего полезного вне зависимости от содержимого; и неправильно, поскольку вы вообще не пишете sData
.
try {
os.write(bData, 0, 2048);
Это записывает ровно 2048 байт, независимо от прочитанной суммы, которая может быть меньше или больше. Если бы он был меньше, он выбрал бы ArrayIndexOutOfBoundsException
или аналогичный, который я ожидал бы увидеть во втором вызове, хотя вы его не упомянули, потому что массив должен быть нулевой длиной во втором и последующих вызовах, если они есть. Это должен быть цикл общей формы:
int count;
byte[] buffer = new byte[8192]; // or more if you like
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
Вернуться к вашему коду:
} catch (IOException e) {
e.printStackTrace();
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
Thread serverThread = new auServer();
serverThread.run();
Это запускает метод run()
потока. Он не запускает нить. Это должно быть serverThread.start().
System.out.println("runing");
С ошибками в написании. Пока вы не устраните проблему с запуском/запуском выше, вы не увидите это сообщение до тех пор, пока не выйдет сервер run()
.
и клиент:
private void streamData(byte[] bData) throws UnknownHostException, IOException, InterruptedException { //bData is byte array to transmit
Thread.sleep(500);
Бессмысленно. Удалить. Не помещайте спальные места в сетевой код.
Socket client = new Socket("10.221.40.41",3333);
Не создавайте новое соединение для каждого буфера. Используйте одно и то же соединение для жизни клиента.
OutputStream outToServer = client.getOutputStream();
outToServer.write(bData);
if(!isRecording)
client.close();
Это должно быть безусловным, и оно должно быть в другом месте вместе с созданием сокета.
В чем может быть проблема?
Проблемы. Множественное число. Множественный. См. Выше.