Untuk aplikasi real-time atau game real-time, protokol HTTP sering kali tidak dapat memenuhi kebutuhan kita. Soket sangat praktis bagi kami. Di bawah ini adalah catatan untuk penelitian ini. Ini terutama menjelaskan aspek -aspek jenis pengecualian, prinsip interaksi, soket, server, dan multithreading.
Tipe pengecualian
Sebelum memahami konten soket, Anda perlu memahami beberapa jenis pengecualian yang terlibat. Empat jenis berikut semuanya diwarisi dari IOException, begitu banyak IoException muncul langsung setelah itu.
UnkownhostException: Nama host atau kesalahan IP
ConnectException: Server menolak untuk terhubung, server tidak dimulai, (jumlah antrian melebihi, koneksi ditolak)
SocketTimeOutException: Batas waktu koneksi
BindException: Objek soket tidak dapat terikat pada alamat IP atau port lokal yang diformulasikan
Proses interaksi
Saya pikir gambar berikut telah dijelaskan secara rinci dan jelas.
Stopkontak
Konstruktor
Socket()Socket(InetAddress address, int port)throws UnknownHostException, IOExceptionSocket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOExceptionSocket(String host, int port)throws UnknownHostException, IOExceptionSocket(String host, int port, InetAddress localAddress, int localPort)throws IoException
Kecuali untuk parameter pertama tanpa parameter, konstruktor lain akan mencoba membuat koneksi ke server. Jika gagal, kesalahan IOException akan dilemparkan. Jika berhasil, objek soket dikembalikan.
Inetaddress adalah kelas yang digunakan untuk merekam host. GetHostByName statisnya (String MSG) dapat mengembalikan instance, dan metode statisnya getLocalHost () juga dapat memperoleh alamat IP host saat ini dan mengembalikan instance. Parameter soket (host string, port int, inetaddress localAddress, int localport) konstruktor adalah IP target, port target, IP lokal, dan port lokal.
Metode soket
getInetAddress (); Alamat IP dari server jarak jauh
getport (); Port of Remote Server
GetLocalAddress () Alamat IP dari klien lokal
getLocalport () Port klien lokal
getInputStream (); getInputStream ();
getoutstream (); Dapatkan aliran output
Perlu dicatat bahwa di antara metode ini, yang paling penting adalah getInputStream () dan getoutputStream ().
Status soket
isclosed (); // Apakah koneksi ditutup? Jika ditutup, kembalikan true; Jika tidak, kembalikan salah
isConnect (); // Kembalikan true jika terhubung; jika tidak, kembalikan salah
isbound (); // Jika soket telah terikat ke pelabuhan lokal, return true; Jika tidak, kembalikan salah
Jika Anda ingin mengonfirmasi apakah status soket itu dalam suatu koneksi, pernyataan berikut adalah cara yang baik untuk menilai.
boolean isConnection = socket.isconnected () &&! socket.isclosed (); // menilai apakah saat ini dalam hubungan
Soket semi-tertutup
Sering kali, kita tidak tahu berapa lama untuk menyelesaikan dalam aliran input yang diperoleh. Berikut beberapa metode umum:
Server
Konstruktor
ServerSocket () melempar ioExceptionServerCocket (int port) melempar ioExceptionServerCocket (int port, int backlog) melempar ioExceptionServerCocket (int port, int backlog, inetaddress bindaddr) melempar ioException
Catatan:
1. Port yang akan didengarkan oleh server port; Panjang antrian dari permintaan koneksi klien backlog; server bindaddr mengikat IP
2. Jika port ditempati atau tidak memiliki izin untuk menggunakan port tertentu, kesalahan BindException akan dilemparkan. Misalnya, port dari 1 hingga 1023 mengharuskan administrator untuk memiliki izin mengikat.
3. Jika port diatur ke 0, sistem akan secara otomatis menetapkan port ke dalamnya;
4. Bindaddr digunakan untuk mengikat IP server. Mengapa ada pengaturan seperti itu? Misalnya, beberapa mesin memiliki beberapa kartu jaringan.
5. Setelah server terikat pada port mendengarkan, itu tidak dapat diubah. ServerSocket () dapat mengatur parameter lain sebelum mengikat port.
Contoh Server Single-Threaded
public void service () {while (true) {socket socket = null; coba {socket = serversocket.accept (); // ambil koneksi dari antrian koneksi, jika tidak, tunggu system.out.println ("Alamat:"+socket.getInetAddress ()+":"+socket.getport ()); ... // Terima dan kirim data} catch (ioException e) {e.printstacktrace ();} akhirnya {coba {if (socket! = Null) socket.close (); // setelah komunikasi dengan klien, tutup soket}}}}} {e.printstack ();Server Multithreaded
Tak perlu dikatakan, manfaat multi-threading adalah multi-threading, dan sebagian besar skenario multi-threading. Apakah itu permainan atau IM real-time kami, kebutuhan multi-threading diperlukan. Mari kita bicara tentang metode implementasi di bawah ini:
Metode yang mengimplementasikan multi-threading baik mewarisi kelas utas atau mengimplementasikan antarmuka runnable. Tentu saja, kumpulan utas juga dapat digunakan, tetapi esensi implementasi serupa.
Inilah contohnya:
Kode berikut adalah utas utama server. Tetapkan utas pekerja untuk setiap klien:
public void service () {while (true) {socket socket = null; coba {socket = serversocket.accept (); // utas utama mendapatkan utas koneksi klien workthread = utas baru (handler baru (soket)); // buat utas workthread.start (); // Mulai utas} catch (Exception e) {e.printstacktrace (); }}}Tentu saja, fokusnya di sini adalah cara mengimplementasikan kelas penangan. Handler perlu mengimplementasikan antarmuka runnable:
class handler mengimplementasikan runnable {soket soket pribadi; public handler (soket soket) {this.socket = socket; } public void run () {coba {System.out.println ("Koneksi baru:"+socket.getInetAddress ()+":"+socket.getport ()); Thread.sleep (10000); } catch (exception e) {e.printstacktrace ();} akhirnya {coba {System.out.println ("Tutup koneksi:"+socket.getInetAddress ()+":"+socket.getport ()); if (socket! = null) socket.close (); } catch (ioException e) {e.printstacktrace (); }}}} Tentu saja, ada cara lain untuk multi-thread terlebih dahulu, seperti kumpulan benang, atau kumpulan benang yang dibangun menjadi JVM. Saya tidak akan menjelaskannya di sini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.