2014-01-26 2 views
0

Мне нужна помощь Я пытаюсь сделать приложение клиентского сервера для копирования файлов в java ... У меня есть объект MainWnd, который создает объект TCPServer и кнопку отправки, он будет создайте объект TCPClient, который отправляет исходные данные противнику TCPServer и откроет заданное число Listen Thread (пусть оно будет n) (здесь Прослушать темы здесь только потому, что они принимают файл) (каждый поток прослушивается на другом порту, который отправляет обратно TCPClient) Затем TCPClient создает n другие потоки TCPClients, которые отправляют файл ... Это у меня есть, и он работает. Проблема в том, что прием файла может быть прерван приемником, когда он нажимает кнопку «Прерывание». Я не могу получить информацию об этом прерывании потоку TCPServer получателя, который должен убить этот поток n, который загружает файл.java введите другой поток при использовании цикла с сокетами

Я думаю, проблема в TCPServer, где есть бесконечный цикл, но Socket в этом вызовет блокировку цикла, поэтому я не могу войти в класс Connection и убить это n потоков.

TCP SERVER

public void setSendInterruption() { 
    this.interruptedSending = true; 
    //c.setSendInterruption(); 
} 

public TCPServer(int port, int socketNums, Map<Byte, LinkedList<Byte>> realData, File file, int fileLength) { 
    this.serverPort = port; 
    this.socketNums = socketNums; 
    if(file != null) 
     this.file = file; 
    if(fileLength != -1) 
     this.fileLength = fileLength; 
    if(realData != null) 
     this.realData = realData; 

    if(tmpData != null) 
     this.tmpData = tmpData; 
} 

@Override 
public void run() { 
    try { 
     System.out.println(this.getId()); 
     listenSocket = new ServerSocket(serverPort); 

     System.out.println("server start listening... ... ..."); 

     while(true) { 
      if(interruptedSending) 
       System.out.println("Here I never come"); 
      Socket clientSocket = listenSocket.accept(); 
      Connection c = new Connection(clientSocket, socketNums, realData, file, fileLength); 
     } 
} 
catch(IOException e) { 
     System.out.println("Listen :"+e.getMessage());} 
} 

Подключение

while (true) 
       { 
        byteRead = input.read(); 
        //Thread.sleep(100); 
        if(interruptedSending) { 
         TCPClient tcpClient = new TCPClient(clientSocket.getPort(), clientSocket.getInetAddress().getHostAddress()); 
         tcpClient.sendInterruptedData(); 
         interruptedSending = false; 
        } 
        char lowChar; 

        if(byteRead == -1) { 
         break; 
        } else 
         lowChar = (char)byteRead; 

        lowData += lowChar; 

        if(lowData.length() >= 2) { 
         if (lowData.substring(lowData.length()-2).compareTo("//") == 0) { 
          break; 
         } else if (lowData.length() > 6) { 
          byteData.add((byte)byteRead); 
         } 
        } 
       } 

В связи с этим есть несколько строк, но они только в основном разбор протокола. Спасибо за помощь. Надеюсь, я написал это чистым ...

ответ

0

Из того, что я понимаю, у каждого Connection есть Thread, который его запускает. Вы хотите прервать каждый из этих потоков, но не можете сделать это из потоков, потому что они застряли в input.read().

Если это то, что вы имели в виду, просто сделать это:

В конструкторе Connection сохранить тему, так что вы можете получить доступ к нему позже. Сделать killThread() - метод или therelike, так что вы можете получить доступ к нитке снаружи:

public void killThread() { 
    thread.interrupt(); //thread is the thread you saved in the constructor 
} 

Если вы хотите, чтобы убить killThread Connection-нить вызова(). Это заставит Thread выкинуть java.lang.InterruptedException, где бы он ни находился. Это один вы можете либо игнорировать (так как вы хотите, чтобы нить, чтобы умереть в любом случае), или вы заключите целое, а с обратной связью с

try { 
    //your loop 
} catch (InterruptedException e) { 
    return; 
} 

, который закончится нить красиво, не бросать исключения из.

Смежные вопросы