2011-11-01 28 views
9

tôi tạo một DatagramSocket trong chủ đề chính, và sau đó tạo một chuỗi lớp bên trong để nghe cổng. khi tôi đóng các DatagramSocket trong chủ đề chính, nó luôn luôn đi qua một lỗi socket closed vì trong thread lớp bên trong tôi gọi là phương pháp , và nó bị chặn các chủ đề lớp bên trong. đây là đoạn code của lớp bên trong:làm thế nào tôi có thể dừng phương thức chặn DatagramSocket.receive() trong một chủ đề

class ReceiveText extends Thread 
{ 
    @Override 
    public void run() 
    { 
     while(true) 
     { 
      byte[] buffer = new byte[1024]; 
      DatagramPacket dp = new DatagramPacket(buffer, buffer.length); 
      try { 
       udpSocket.receive(dp);//blocked here 
       byte[] data = dp.getData(); 
       String message = new String(data, 0 , dp.getLength()); 
       setTxtAreaShowMessage(message); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

tôi muốn dừng thread lớp bên trong trước khi đóng DatagramSocket, nhưng phương pháp stop() không được khuyến khích. Làm thế nào tôi có thể làm điều đó?

Trả lời

13

Đóng ổ cắm, điều này sẽ chặn cuộc gọi nhận() chặn. Nếu trước tiên bạn thiết lập một cờ khép kín thì trong khối catch (IOException), bạn có thể bỏ qua một cách an toàn ngoại lệ nếu cờ được đặt. (Bạn cũng có thể sử dụng phương thức isClosed() trên DatagramSocket thay vì cờ)

+0

đó là một giải pháp, nhờ – cloud

+0

tôi cũng có thể khẳng định công trình này! Cách tốt nhất để thoát ra khỏi một chuỗi công nhân mà là trong một vòng lặp nhận trên một ổ cắm datagram. – Nerdtron

1

Với UDP, bạn có thể gửi socket từ một luồng khác, vì vậy hãy bỏ chặn phần read(). Datagran có thể, (tùy thuộc vào giao thức của bạn), chứa lệnh 'tự tử' hoặc bạn có thể sử dụng boolean 'shutdown' bổ sung mà thread đọc sau khi read() trả về.

2

Socket.close() thực hiện thủ thuật. Hoặc bạn có thể sử dụng socket.setSoTimeout (1000); phương thức setSoTimeout() cho phép bạn xác định một khoảng thời gian chờ bằng mili giây. Ví dụ:

//if the socket does not receive anything in 1 second, 
//it will timeout and throw a SocketTimeoutException 
//you can catch the exception if you need to log, or you can ignore it 
socket.setSoTimeout(1000); 
socket.receive(); 

Đây là javadoc for setSoTimeout();

Theo mặc định, thời gian chờ là 0 không xác định, bằng cách thay đổi thành số dương, nó sẽ chỉ chặn số tiền bạn chỉ định. (Hãy chắc chắn rằng bạn cài đặt nó trước khi gọi socket.receive())

Dưới đây là một ví dụ đã trả lời trên trang web này: set timeout for socket receive

Các vấn đề liên quan