Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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 tham gia
    Sep 2015
    Bài viết
    0
    Tại sao lại close khi chưa giải quyết xong vậy [IMG]images/smilies/icon_question.gif[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi fly_boy_9x
    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

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Wazi Armstrong
    Tại sao lại close khi chưa giải quyết xong vậy [IMG]images/smilies/icon_question.gif[/IMG]
    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 ợ

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi fly_boy_9x
    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í [IMG]images/smilies/icon_question.gif[/IMG]

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Wazi Armstrong
    Ý mình là tại sao gọi s.close() ngay sau khi vừa start thread xử lí [IMG]images/smilies/icon_question.gif[/IMG]
    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

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Wazi Armstrong
    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

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •