2011-10-01 26 views
6

Tôi cảm thấy thực sự ngu ngốc ngay bây giờ guys .... về cơ bản tôi đang kết nối qua TCP trên một máy địa phương ... và khi tôi cố gắng để làm cho các luồng vào/ra tại khách hàng nó sẽ không được thông qua tạo luồng đầu vào đối tượng. Đưa cái gì? Điều này dừng lại sau khi in 2 ... không có trường hợp ngoại lệ hoặc bất cứ điều gì ... Đây không phải là lần đầu tiên tôi sử dụng lớp học này là một phần lý do tại sao tôi bối rối.Java ObjectInputStream treo

try { 
      System.out.println("1"); 
      mySocket = new Socket("localhost", 11311); 
      System.out.println("12"); 
      oos = new ObjectOutputStream(mySocket.getOutputStream()); 
      System.out.println("2"); 
      ois = new ObjectInputStream(mySocket.getInputStream()); 
      System.out.println("13"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

Máy chủ có gửi đối tượng không? Có vẻ như máy chủ không gửi bất kỳ thứ gì. – MasterCassim

+0

'ObjectInputStream' có thể chờ một tiêu đề luồng được nhận. – NiematojakTomasz

+0

Tôi không theo dõi ... máy chủ chấp nhận kết nối TCP. Tôi nghĩ rằng để đọc bạn sẽ đi ois.readObject()? Tôi đã thiết lập để khách hàng gửi đối tượng đầu tiên ... Tôi chỉ muốn tạo luồng. – Michael

Trả lời

6

Từ specification của ObjectInputStream:

constructor này sẽ chặn cho đến khi ObjectOutputStream tương ứng đã viết và đỏ mặt tiêu đề.

1

(Đối với người đọc trong tương lai :) Tôi đã gặp vấn đề tương tự vì tôi đã thực hiện thay đổi ngớ ngẩn trong chương trình máy chủ và không kiểm tra trong một thời gian dài.

ServerSocket chấp nhận kết nối (responderSocket = serverSock.accept();) sau đó đột nhiên một if không phù (Sự thay đổi ngớ ngẩn tôi đã đề cập!) Chương trình nhảy ra khỏi sợi và vì tôi đã không thêm một khối finally để đóng suối và ổ ổ cắm còn lại bị bỏ rơi với việc gửi hoặc nhận lại bất kỳ thứ gì (ngay cả tiêu đề luồng). Vì vậy, trong chương trình phía client không có tiêu đề dòng (Khi tôi debbugged Mã tôi thấy rằng chức năng cuối cùng thực hiện trước khi khóa là:

public ObjectInputStream(InputStream in) throws IOException { 
    verifySubclass(); 
    bin = new BlockDataInputStream(in); 
    handles = new HandleTable(10); 
    vlist = new ValidationList(); 
    enableOverride = false; 
    readStreamHeader();     //// <== This function 
    bin.setBlockDataMode(true); 
} 

readStreamHeader();)

Vì vậy, hãy cẩn thận về những gì xảy ra ở phía máy chủ, có lẽ vấn đề không phải là nơi bạn mong đợi nó!

+3

Bạn không nên xây dựng luồng đối tượng trong vòng lặp accept() ở vị trí đầu tiên. Bạn nên xây dựng chúng trong phương thức run() của luồng xử lý kết nối. Nếu không, bạn có nguy cơ chặn vòng lặp accept() trên I/O cho các tiêu đề luồng, điều này sẽ chặn các máy khách khác. – EJP