Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: em có thắc mắc về socket

  1. #1
    Ngày gia nhập
    04 2012
    Bài viết
    0

    Mặc định em có thắc mắc về socket

    public class server{
    public server(){
    try{
    ServerSocket ss = new ServerSocket(9999);
    Socket s;
    while(true){
    s = ss.accept();
    new Thread(new process(s)).start();
    s.close();
    }
    }catch(IOException e){
    e.printStackTrace();
    }
    }
    }


    =================================
    public class process implements Runnable{
    Socket a;
    public process(Socket s){
    a = s;
    }
    public void run(){
    // do something
    }
    }


    // đoạn code trên là về một server sử dụng đa tuyến phục vụ nhiều client cùng lúc
    // vấn đề ở đây là khi s (của lớp server đóng lại) (s.close()) thì a (của lớp process) (a được gán = s) //cũng đóng theo, mặc dù lớp process chưa chạy xong
    // mọi người có cách j giải quyết ko ợ?

  2. #2
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Tại sao lại close khi chưa giải quyết xong vậy
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  3. #3
    Ngày gia nhập
    04 2012
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi Wazi Armstrong Xem bài viết
    Tại sao lại close khi chưa giải quyết xong vậy
    nếu a,b là socket;
    a đã có giá trị; b gán = a;
    khi a đóng, thì b cũng tự động đóng theo (cái này do JVM làm) em ko can thiệp j hết ợ

  4. #4
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Trích dẫn Nguyên bản được gửi bởi fly_boy_9x Xem bài viết
    nếu a,b là socket;
    a đã có giá trị; b gán = a;
    khi a đóng, thì b cũng tự động đóng theo (cái này do JVM làm) em ko can thiệp j hết ợ
    Ý mình là tại sao gọi s.close() ngay sau khi vừa start thread xử lí
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  5. #5
    Ngày gia nhập
    04 2012
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi Wazi Armstrong Xem bài viết
    Ý mình là tại sao gọi s.close() ngay sau khi vừa start thread xử lí
    s.close() để s được giải phóng, sau đó s = ss.accept() (trong vòng lặp while) để server có thể phục vụ thêm client mới

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Mặc định em có thắc mắc về socket

    Em hiểu sai hoàn toàn kiến thức về Thread rồi. Thread start sẽ chạy một luồng mới, trong khi đó luồng chính (main Thread) vẫn tiếp tục. Vì thế nên process của em chưa kịp xử lí gì thì close mất rồi.
    Thêm nữa là sau trước khi dừng server nên close serversocket lại
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  7. #7
    Ngày gia nhập
    04 2012
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi Wazi Armstrong Xem bài viết
    Em hiểu sai hoàn toàn kiến thức về Thread rồi. Thread start sẽ chạy một luồng mới, trong khi đó luồng chính (main Thread) vẫn tiếp tục. Vì thế nên process của em chưa kịp xử lí gì thì close mất rồi.
    Thêm nữa là sau trước khi dừng server nên close serversocket lại
    vậy anh có giải pháp nào thay thế ko ợ? mục đích của em vẫn là 1 server dùng đa tuyến phục vụ nhiều client

  8. #8
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Trích dẫn Nguyên bản được gửi bởi fly_boy_9x Xem bài viết
    vậy anh có giải pháp nào thay thế ko ợ? mục đích của em vẫn là 1 server dùng đa tuyến phục vụ nhiều client
    Cứ thế mà làm thôi. Thằng nào xong thì close nó lại. Có gì phức tạp lắm đâu
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  9. #9
    Ngày gia nhập
    03 2011
    Bài viết
    70

    Mình nghĩ bạn nên đóng close() trong method run() để đảm bảo thực hiện xong công việc thì mới đóng socket ( cái mà ta đang dùng đảm nhiệm trao đổi thông tin trong luồng hiện tại). Để đa luồng thì bạn cần mở socket mới nếu có luồng mới cần thực hiện và tất nhiên lại chỉ đóng nó khi hoàn thành xong.

    while(true){
    Socket s =new Socket( ss.accept());
    new Thread(new process(s)).start();
    s.close();
    }
    và cuối hàm run() bạn đóng cái socket mà run() đang dùng lại.

    Mình nghĩ là kiểu j bạn cũng cần mở các socket mới nếu như 1 tiến trình mới xuất hiện và chỉ close nó sau khi nó thực hiện xong.

Các đề tài tương tự

  1. Kiểm tra kết nối Socket TCP như thế nào?
    Gửi bởi cuogbk14 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 25-09-2012, 09:14 PM
  2. Kỹ thuật C socket ( sys/socket.h) và GET (sau khi telnet + tên host)
    Gửi bởi tuanc trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 14
    Bài viết cuối: 22-08-2012, 04:24 PM
  3. Socket Tính tổng 1 dãy số trong socket như thế nào?
    Gửi bởi sunictu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 23-08-2011, 10:22 AM
  4. Tái sử dụng socket như thế nào?
    Gửi bởi Ding trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 08-05-2011, 09:10 PM
  5. Thắc mắc về hàm send của socket
    Gửi bởi cold_blood_boy178 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 19-11-2010, 01:27 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn