Java มีสองคลาสสำหรับโปรโตคอล TCP ซึ่งใช้ในการเขียนโปรแกรมฝั่งไคลเอ็นต์และการเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ตามลำดับ ก่อนที่แอปพลิเคชันจะเริ่มการสื่อสาร จะต้องสร้างการเชื่อมต่อก่อน โดยเริ่มต้นโดยโปรแกรมไคลเอนต์ และโปรแกรมฝั่งเซิร์ฟเวอร์จะต้องฟังหมายเลขพอร์ตเฉพาะของโฮสต์เสมอ เพื่อรอการเชื่อมต่อของไคลเอ็นต์ ในไคลเอนต์ เราจำเป็นต้องใช้อินสแตนซ์ Socket เท่านั้น ในขณะที่เซิร์ฟเวอร์จำเป็นต้องจัดการทั้งอินสแตนซ์ ServerSocket และอินสแตนซ์ Socket ทั้งสองใช้ OutputStream และ InpuStream เพื่อส่งและรับข้อมูล
วิธีที่ดีที่สุดในการเรียนรู้ความรู้คือการใช้มัน จากบันทึกก่อนหน้านี้ เรารู้วิธีรับข้อมูลที่อยู่ของโฮสต์แล้ว ตอนนี้เราใช้โปรแกรมง่ายๆ ในการเรียนรู้การเขียนโปรแกรม Socket โดยใช้โปรโตคอล TCP ในการขนส่ง ชั้น.
ฝั่งเซิร์ฟเวอร์ TCP
ในการเขียนโปรแกรม Socket ฝั่งเซิร์ฟเวอร์มีความซับซ้อนมากกว่าฝั่งไคลเอ็นต์มาก งานของเซิร์ฟเวอร์คือการสร้างเทอร์มินัลการสื่อสารและรอการเชื่อมต่อของลูกค้าอย่างอดทน ตัวอย่างต่อไปนี้ของโปรแกรมฝั่งเซิร์ฟเวอร์ใช้เพื่อฟังหมายเลขพอร์ตที่ได้รับจากอินพุตคอนโซล และส่งข้อความที่ไคลเอ็นต์ส่งกลับ
คัดลอกรหัสรหัสดังต่อไปนี้:
importjava.net.*;
importjava.text.MessageFormat;
importjava.io.*;
คลาสสาธารณะTCPEchoServer{
ส่วนตัวขั้นสุดท้ายขั้นสุดท้ายBUFSIZE=32;
publicstaticvoidmain (สตริง [] args) พ่น IOException {
//TODOวิธีสร้างอัตโนมัติ
// รับหมายเลขพอร์ตที่จะตรวจสอบจากคอนโซล
ถ้า(args.length!=1)
ThrownewIllegalArgumentException("พารามิเตอร์:<พอร์ต>");
//รับหมายเลขพอร์ต
intservPort=Integer.parseInt(args[0]);
//สร้างอินสแตนซ์ของวัตถุ ServerSocket
ServerSocketservSocket=newServerSocket(servPort);
System.out.println(MessageFormat.format("เริ่มฟัง หมายเลขพอร์ต: {0}",args[0]));
//จำนวนไบต์ทั้งหมดของข้อมูลที่ได้รับครั้งแรก
intrecvMsgSize;
//บัฟเฟอร์สำหรับการรับข้อมูล
ไบต์[]receiveBuf=newbyte[BUFSIZE];
//วนซ้ำ ฟังหมายเลขพอร์ต และประมวลผลคำขอการเชื่อมต่อใหม่
ในขณะที่ (จริง) {
//บล็อกและรอ สร้างอินสแตนซ์การเชื่อมต่อใหม่ทุกครั้งที่ได้รับคำขอ
SocketclntSocket=servSocket.accept();
//รับ SocketAddress ของไคลเอ็นต์ที่เชื่อมต่อ
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//พิมพ์ข้อมูลที่อยู่ไคลเอ็นต์การเชื่อมต่อ
System.out.println("การจัดการลูกค้า"+ที่อยู่ลูกค้า);
//วัตถุที่รับข้อมูลจากไคลเอนต์
InputStreamin=clntSocket.getInputStream();
//วัตถุที่ส่งข้อมูลไปยังไคลเอนต์
OutputStreamout=clntSocket.getOutputStream();
//หลังจากอ่านข้อมูลที่ลูกค้าส่งแล้ว ให้ส่งไปยังลูกค้า
ในขณะที่((recvMsgSize=in.read(receiveBuf))!=-1){
ออก.write(receiveBuf,0,recvMsgSize);
-
//เมื่อไคลเอนต์ปิดการเชื่อมต่อ ให้ปิดการเชื่อมต่อ
System.out.println("ไคลเอนต์ปิดการเชื่อมต่อ");
clntSocket.close();
-
-
-
ไคลเอ็นต์ TCP
ในการเขียนโปรแกรม Socket ขั้นแรกไคลเอ็นต์จะต้องส่งไปยังเซิร์ฟเวอร์ จากนั้นจึงรอการตอบกลับของเซิร์ฟเวอร์ ในตัวอย่างต่อไปนี้: เราส่งข้อมูลไปยังเซิร์ฟเวอร์ รอข้อความที่เซิร์ฟเวอร์ส่ง และพิมพ์ออกมา
คัดลอกรหัสรหัสดังต่อไปนี้:
importjava.io.*;
importjava.net.Socket;
importjava.net.SocketException;
คลาสสาธารณะTCPEchoClient{
publicstaticvoidmain (สตริง [] args) พ่น IOException {
//TODOวิธีสร้างอัตโนมัติ
//ตรวจสอบว่าพารามิเตอร์ที่ได้รับจากคอนโซลถูกต้องหรือไม่
ถ้า((args.length<2)||(args.length>3))
ThrownewIllegalArgumentException(
"พารามิเตอร์:<เซิร์ฟเวอร์><Word>[<พอร์ต>]]");
//รับที่อยู่เซิร์ฟเวอร์
สตริงเซิร์ฟเวอร์=args[0];
//รับข้อมูลที่ต้องการส่ง
ไบต์[]ข้อมูล=args[1].getBytes();
//หากมีพารามิเตอร์ทาสสามตัว ให้รับหมายเลขพอร์ตสำหรับการส่งข้อมูล หมายเลขพอร์ตเริ่มต้นคือ 8099
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
//สร้างอินสแตนซ์ซ็อกเก็ตตามที่อยู่เซิร์ฟเวอร์และหมายเลขพอร์ต
Socketsocket=newSocket(เซิร์ฟเวอร์ เซิร์ฟเวอร์พอร์ต);
System.out.println("Connectedtoserver...sendingechostring");
//ส่งคืนสตรีมอินพุตของซ็อกเก็ตนี้ ซึ่งเป็นวัตถุข้อมูลที่ได้รับจากเซิร์ฟเวอร์
InputStreamin=socket.getInputStream();
//ส่งคืนสตรีมเอาต์พุตของซ็อกเก็ตนี้ ซึ่งเป็นวัตถุข้อมูลที่ส่งไปยังเซิร์ฟเวอร์
OutputStreamout=socket.getOutputStream();
//ส่งข้อมูลที่ได้รับจากคอนโซลไปยังเซิร์ฟเวอร์
ออกเขียน(ข้อมูล);
//ตัวนับที่รับข้อมูลจะเขียนออฟเซ็ตเริ่มต้นของข้อมูล
inttotalBytesRcvd=0;
// เริ่มต้นจำนวนไบต์ทั้งหมดของข้อมูลที่ได้รับ
intbytesRcvd;
ในขณะที่(totalBytesRcvd<data.length){
//หากเซิร์ฟเวอร์ปิดการเชื่อมต่อ ก็จะส่งกลับ -1 วิธีการอ่านจะส่งคืนจำนวนไบต์ทั้งหมดของข้อมูลที่ได้รับ
ถ้า((bytesRcvd=in.read(ข้อมูล,totalBytesRcvd,data.length
-totalBytesRcvd))==-1)
ThrownewSocketException("การเชื่อมต่อไปยังเซิร์ฟเวอร์ถูกปิด");
TotalBytesRcvd+=bytesRcvd;
-
//พิมพ์ข้อมูลที่ส่งมาจากเซิร์ฟเวอร์
System.out.println("ได้รับ:"+newString(data));
//ปิดการเชื่อมต่อ
ซ็อกเก็ต.ปิด();
-
-
ขั้นแรกให้รันเซิร์ฟเวอร์และฟังพอร์ต 8099:
จากนั้นรันโปรแกรมไคลเอนต์และส่งข้อความไปยังเซิร์ฟเวอร์:
เมื่อดูที่คอนโซลฝั่งเซิร์ฟเวอร์ของเราอีกครั้ง เราจะเห็นข้อมูลที่อยู่ของการเชื่อมต่อไคลเอนต์ก่อนหน้านี้: