2013-03-16 4 views
1

Я пытаюсь реализовать простой сервер (приложение java) и клиент (приложение для Android), где клиент отправляет строку примерно 10 раз в секунду. Все работает нормально в течение минуты или около того, после чего сервер перестает получать сообщения от клиента. Соответствующий код ниже.Java-сокет продолжает замораживаться

ClientThread.java

public class ClientThread implements Runnable{ 
static Socket socket; 
static String message = ""; 
InetAddress serverAddr; 
BufferedOutputStream bos; 

public ClientThread(String message){ 
    ClientThread.message = message; 
} 

@Override 
public void run() { 
    try{ 
     serverAddr = InetAddress.getByName(SERVER_IP); 
     if(socket != null && socket.isConnected())socket.close(); 
     socket = new Socket(serverAddr, SERVER_PORT); 
     bos = new BufferedOutputStream (socket.getOutputStream()); 
     OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII"); 
     osw.write(message); 
     osw.flush(); 
     socket.shutdownOutput(); 
     socket.close(); 
    }catch (Exception e) { 
    } 
} 
} 

ServerThread.java

public class ServerThread extends Thread{ 
    private ServerSocket serverSocket; 
    static String clientSentence; 

    public ServerThread(int port) throws IOException, AWTException{ 
     serverSocket = new ServerSocket(port); 
    } 

    public void run() { 
     while(true){ 
     try{ 
      Socket server = serverSocket.accept(); 
      BufferedReader d = new BufferedReader(new InputStreamReader(server.getInputStream())); 
      clientSentence = d.readLine(); 
      System.out.println(clientSentence); 
      server.close(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
      break; 
     } 
     } 
    } 
} 

ClientThread.java называется примерно 10 раз в секунду, используя:

Thread clientThread = new Thread(new ClientThread(message)); 
clientThread.start(); 

ServerThread.jav a инициализируется и начинается с использования:

t = new ServerThread(8888); 
t.start(); 

Любые мысли о том, почему это может замерзнуть после бега на немного? Единственный способ исправить это - перезапустить сервер, после чего одна и та же проблема повторится через минуту. Я потратил много времени на изучение этой проблемы, но не смог найти решение.

EDIT: Я понял, что сервер зависает у клиентаSentence = d.readLine(); часть. Любая идея почему?

+0

Убедитесь, что clientthread завершен, прежде чем вы начнете новый. – greenapps

+1

Лучше использовать только одну резьбу и постоянный подключенный разъем. – greenapps

+0

Вы всегда создаете новый поток в цикле? –

ответ

1

60 подключение в секунду, одна минута: 3600 соединений в минуту.

Closing a socket doesn't release immediately the associated file descriptor. У вас может закончиться ресурс на уровне ОС.

Попробуйте запустить netstat со стороны сервера, чтобы увидеть активные, незавершенные и закрытые соединения.

Вы можете read this post on SU.

0

Ваша нить никогда не выходит, и вы продолжаете создавать новые. Итак, у вас что-то закончилось: пространство резьбы, гнезда, FDs, ...

Это все неправильно. Либо Ваша нить должна быть петля или вы должны создать новую. Не оба.

также:

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