Я пытаюсь реализовать простой сервер (приложение 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(); часть. Любая идея почему?
Убедитесь, что clientthread завершен, прежде чем вы начнете новый. – greenapps
Лучше использовать только одну резьбу и постоянный подключенный разъем. – greenapps
Вы всегда создаете новый поток в цикле? –