Sila betulkan saya: Kemungkinan perkara utama masalah: Pelanggan hanya menerima() sekali dan tidak menutup aliran keluaran
1. Pelanggan mengekalkan contoh clientSocket (sambungan dipanggil sekali sahaja), dan pelayan mengekalkan tika ServerSocket. Hanya mengekalkan satu soket pelanggan dan mengharapkan pemprosesan input kedua nampaknya sedang bersedia untuk sambungan yang panjang.
Apabila aliran keluaran ditutup, soket yang sepadan dengan aliran keluaran juga akan ditutup - "Crazy Java Lecture Notes (Edisi Ketiga)" p786
2. Mari lihat pelayan. ss.accept() diletakkan dalam gelung, iaitu untuk mengendalikan sambungan pelanggan berbilang, terdapat operasi baca untuk setiap pelanggan, dan tiada operasi baca seterusnya, yang mungkin menjadi masalah.
Sambungan pendek atau sambungan panjang? Untuk komunikasi berbilang berterusan, anda boleh menggunakan satu sambungan, baca dan tulis berbilang kali (sambungan panjang), atau anda boleh berbilang sambungan, setiap sambungan membaca dan menulis sekali ( Pendek sambungan) Pelanggan anda ingin membuat sambungan yang panjang, tetapi pelayan nampaknya ingin membuat sambungan yang singkat. Cadangan:
Sambungan lama: Pelanggan kekal tidak berubah Pelayan hanya menerima () sekali untuk setiap klien, memproses berbilang komunikasi input dalam satu gelung dan memantau strim. Tetapi soket tidak ditutup.
Sambungan pendek: Setiap kali pelanggan memulakan sambungan soket baharu (mencipta tika soket baharu), setiap kali operasi selesai, menutup strim dan menutup soket. Badan gelung pelayan kekal tidak berubah, strim ditutup dalam badan gelung dan soket yang dikembalikan oleh setiap terima() ditutup.
Oleh kerana saya tidak tahu perniagaan anda, saya tidak tahu niat sebenar kod tersebut. Perkara lain yang patut dikembangkan ialah:
Sambungan berbilang pelanggan, berbilang sambungan, pengurusan sesi, konkurensi dan banyak lagi.
Sila betulkan saya:
Kemungkinan perkara utama masalah: Pelanggan hanya menerima() sekali dan tidak menutup aliran keluaran
1. Pelanggan mengekalkan contoh clientSocket (sambungan dipanggil sekali sahaja), dan pelayan mengekalkan tika ServerSocket. Hanya mengekalkan satu soket pelanggan dan mengharapkan pemprosesan input kedua nampaknya sedang bersedia untuk sambungan yang panjang.
2. Mari lihat pelayan. ss.accept() diletakkan dalam gelung, iaitu untuk mengendalikan sambungan pelanggan berbilang, terdapat operasi baca untuk setiap pelanggan, dan tiada operasi baca seterusnya, yang mungkin menjadi masalah.
Sambungan pendek atau sambungan panjang? Untuk komunikasi berbilang berterusan, anda boleh menggunakan satu sambungan, baca dan tulis berbilang kali (sambungan panjang), atau anda boleh berbilang sambungan, setiap sambungan membaca dan menulis sekali ( Pendek sambungan)
Pelanggan anda ingin membuat sambungan yang panjang, tetapi pelayan nampaknya ingin membuat sambungan yang singkat. Cadangan:
Sambungan lama: Pelanggan kekal tidak berubah Pelayan hanya menerima () sekali untuk setiap klien, memproses berbilang komunikasi input dalam satu gelung dan memantau strim. Tetapi soket tidak ditutup.
Sambungan pendek: Setiap kali pelanggan memulakan sambungan soket baharu (mencipta tika soket baharu), setiap kali operasi selesai, menutup strim dan menutup soket. Badan gelung pelayan kekal tidak berubah, strim ditutup dalam badan gelung dan soket yang dikembalikan oleh setiap terima() ditutup.
Oleh kerana saya tidak tahu perniagaan anda, saya tidak tahu niat sebenar kod tersebut. Perkara lain yang patut dikembangkan ialah:
Sambungan berbilang pelanggan, berbilang sambungan, pengurusan sesi, konkurensi dan banyak lagi.
Anda boleh melihat lebih dekat pada kod anda. Anda menutupnya setiap kali dalam gelung sementara.