Java menyediakan dua kelas untuk protokol TCP, yang masing-masing digunakan dalam pemrograman sisi klien dan pemrograman sisi server. Sebelum aplikasi memulai komunikasi, koneksi harus dibuat terlebih dahulu, diprakarsai oleh program klien, dan program sisi server harus selalu mendengarkan nomor port spesifik dari host, menunggu koneksi klien. Di klien, kita hanya perlu menggunakan instance Socket, sedangkan server perlu menangani instance ServerSocket dan instance Socket, keduanya menggunakan OutputStream dan InpuStream untuk mengirim dan menerima data.
Cara terbaik untuk mempelajari suatu pengetahuan adalah dengan menggunakannya. Melalui catatan sebelumnya, kita telah mengetahui cara mendapatkan informasi alamat host. Sekarang kita menggunakan program sederhana untuk mempelajari pemrograman Socket menggunakan protokol TCP dalam transport lapisan.
Sisi server TCP
Dalam pemrograman Socket, sisi server jauh lebih rumit daripada sisi klien. Tugas server adalah membangun terminal komunikasi dan secara pasif menunggu koneksi klien. Contoh program sisi server berikut digunakan untuk mendengarkan nomor port yang diperoleh dari input konsol, dan mengirim kembali pesan yang dikirim oleh klien.
Copy kode kodenya sebagai berikut:
importjava.net.*;
importjava.text.MessageFormat;
importjava.io.*;
publicclassTCPEchoServer{
privatestaticfinalintBUFSIZE=32;
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
//Dapatkan nomor port yang akan dipantau dari konsol
if(args.panjang!=1)
thrownewIllegalArgumentException("Parameter):<Port>");
//Dapatkan nomor port
intservPort=Bilangan Bulat.parseInt(args[0]);
//Membuat instance objek ServerSocket
ServerSocketservSocket=ServerSocket baru(servPort);
System.out.println(MessageFormat.format("Mulai mendengarkan, nomor port: {0}",args[0]));
//Jumlah total byte data awal yang diterima
intrecvMsgSize;
//buffer untuk menerima data
byte[]receiveBuf=byte baru[BUFSIZE];
//Ulangi iterasi, dengarkan nomor port, dan proses permintaan koneksi baru
sementara(benar){
//Blokir dan tunggu, buat instance koneksi baru setiap kali permintaan diterima
SocketclntSocket=servSocket.accept();
//Dapatkan SocketAddress dari klien yang terhubung
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//Cetak informasi alamat klien koneksi
System.out.println("Penanganan klien"+alamat klien);
//Objek yang menerima data dari klien
InputStreamin=clntSocket.getInputStream();
//Objek yang mengirimkan data ke klien
OutputStreamout=clntSocket.getOutputStream();
//Setelah membaca data yang dikirim oleh klien, kirimkan ke klien
while((recvMsgSize=in.read(receiveBuf))!=-1){
keluar.tulis(receiveBuf,0,recvMsgSize);
}
//Ketika klien menutup koneksi, tutup koneksi
System.out.println("Klien menutup koneksi");
clntSocket.close();
}
}
}
klien TCP
Dalam pemrograman Socket, pertama-tama klien perlu mengirim ke server, dan kemudian secara pasif menunggu respons server. Dalam contoh berikut: kita mengirimkan informasi ke server, menunggu pesan dikirim oleh server, dan mencetaknya.
Copy kode kodenya sebagai berikut:
importjava.io.*;
importjava.net.Socket;
importjava.net.SocketException;
publicclassTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
//Tentukan apakah parameter yang diterima dari konsol sudah benar
if((args.panjang<2)||(args.panjang>3))
thrownewIllegalArgumentException(
"Parameter:<Server><Word>[<Port>]]");
//Dapatkan alamat server
Stringserver=args[0];
//Dapatkan informasi yang perlu dikirim
byte[]data=args[1].getBytes();
//Jika ada tiga parameter budak, dapatkan nomor port untuk mengirim informasi. Nomor port default adalah 8099.
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
//Membuat instance Socket berdasarkan alamat server dan nomor port
Socketsocket=soket baru(server,servPort);
System.out.println("Tersambung ke server...mengirim echostring");
//Kembalikan aliran input soket ini, yang merupakan objek data yang diterima dari server
InputStreamin=socket.getInputStream();
//Kembalikan aliran output dari soket ini, yang merupakan objek data yang dikirim ke server
OutputStreamout=soket.getOutputStream();
//Kirim data yang diterima dari konsol ke server
keluar.tulis(data);
//Penghitung yang menerima data akan menulis offset awal data
inttotalBytesRcvd=0;
//Inisialisasi jumlah total byte data yang diterima
intbytesRcvd;
while(totalBytesRcvd<data.panjang){
//Jika server menutup koneksi, ia mengembalikan -1. Metode baca mengembalikan jumlah total byte data yang diterima.
if((bytesRcvd=dalam.baca(data,totalBytesRcvd,data.panjang
-totalBytesRcvd))==-1)
thrownewSocketException("Koneksi ke server telah ditutup");
totalBytesRcvd+=byteRcvd;
}
//Cetak data yang dikirim oleh server
System.out.println("Diterima:"+newString(data));
//Tutup koneksi
soket.close();
}
}
Pertama jalankan server dan dengarkan pada port 8099:
Kemudian jalankan program klien dan kirim pesan ke server:
Melihat lagi konsol sisi server, kita dapat melihat informasi alamat koneksi klien sebelumnya: