การเขียนโปรแกรมซ็อกเก็ตใน Java: A Brief Guide
เผยแพร่แล้ว: 2022-05-21ใน Java การเขียนโปรแกรมซ็อกเก็ตเป็นวิธีการสื่อสารระหว่างโปรแกรมและเชื่อมต่อกับ JRE ที่แตกต่างกัน ทั้งเซิร์ฟเวอร์ที่เน้นการเชื่อมต่อและเซิร์ฟเวอร์ที่ไม่เน้นการเชื่อมต่อ ซ็อกเก็ตเซิร์ฟเวอร์ Java ใช้เพื่อเริ่มต้นและประมวลผลการสื่อสารระหว่างเซิร์ฟเวอร์และไคลเอ็นต์เท่านั้น
บล็อกนี้จะครอบคลุมทุกสิ่งที่ควรรู้เกี่ยวกับการเขียนโปรแกรมซ็อกเก็ต
การเขียนโปรแกรมซ็อกเก็ตใน Java
การเขียนโปรแกรมซ็อกเก็ตเป็นกระบวนการของการเสริมและการใช้โหนดเครือข่ายแยกกันในลักษณะโต้ตอบ เป็นระบบการสื่อสารสองทางที่ซ็อกเก็ตหนึ่ง (โหนด) รับฟังบนพอร์ตเฉพาะที่ที่อยู่ IP ในขณะที่ซ็อกเก็ตอื่นเชื่อมต่อ
ซ็อกเก็ตใน Java
ใน Java ซ็อกเก็ตคือปลายด้านหนึ่งของช่องทางการสื่อสารแบบสองทางที่เชื่อมต่อสองโปรแกรมในเครือข่าย เลเยอร์ TCP ใช้เพื่อกำหนดหมายเลขพอร์ตให้กับซ็อกเก็ต Java ที่กำหนด เพื่อระบุแอปพลิเคชันที่เรากำลังถ่ายโอนข้อมูล เราใช้ที่อยู่ IP และหมายเลขพอร์ตร่วมกันเพื่อสร้างปลายทาง
แพลตฟอร์ม Java มีคลาสที่เรียกว่า Socket ซึ่งใช้ด้านหนึ่งของการเชื่อมต่อเครือข่ายแบบสองทางระหว่างแอปพลิเคชัน Java ของคุณกับโปรแกรมอื่น ชั้นเรียนตั้งอยู่บนการใช้งานที่ไม่ขึ้นกับแพลตฟอร์ม ปกป้องโปรแกรม Java ของคุณจากรายละเอียดเฉพาะระบบ
โดยใช้คลาสแทนโค้ดเนทีฟบางโปรแกรม Java ของคุณอาจสื่อสารผ่านเครือข่ายในลักษณะที่ไม่ขึ้นกับแพลตฟอร์ม
นอกจากนี้ java.net ยังมีคลาส ServerSocket ซึ่งใช้ซ็อกเก็ตที่เซิร์ฟเวอร์สามารถใช้เพื่อรับฟังและยอมรับการเชื่อมต่อจากลูกค้า นี่คือตัวอย่างที่แสดงวิธีการใช้คลาส ServerSocket และ Socket
ระหว่างพอร์ตฝั่งไคลเอ็นต์และพอร์ตฝั่งเซิร์ฟเวอร์ การเชื่อมต่อจะถูกสร้างขึ้น
การสร้างการเชื่อมต่อ Java Socket [ฝั่งไคลเอ็นต์]
ก่อนดำเนินการเขียนโปรแกรมฝั่งไคลเอ็นต์ต่อไป ไคลเอ็นต์ควรรอการเริ่มต้นของเซิร์ฟเวอร์ เมื่อเปิดใช้งานแล้ว จะเริ่มส่งแบบสอบถามไปยังเซิร์ฟเวอร์ Java ลูกค้าจะรอการตอบกลับของเซิร์ฟเวอร์ นี่เป็นบทสรุปที่ดีของตรรกะการเชื่อมต่อไคลเอ็นต์-เซิร์ฟเวอร์
มาดูการเขียนโปรแกรมฝั่งไคลเอ็นต์ในรายละเอียดเพิ่มเติมกัน
หากต้องการเชื่อมต่อกับเครื่องอื่น คุณจะต้องเชื่อมต่อซ็อกเก็ต คอมพิวเตอร์สองเครื่องต้องรู้ว่าอยู่ที่ไหนในเครือข่าย (ที่อยู่ IP) และพอร์ต TCP ใดที่ใช้เพื่อสร้างการเชื่อมต่อซ็อกเก็ต กรอบงาน java.net หมายถึงคลาสซ็อกเก็ต
ที่อยู่ IP ของเซิร์ฟเวอร์เป็นอาร์กิวเมนต์อินพุตแรก พอร์ต TCP เป็นพารามิเตอร์ถัดไปที่นี่ (ไม่มีอะไรมากไปกว่าตัวเลขที่บอกว่าโปรแกรมใดควรเริ่มต้นบนเซิร์ฟเวอร์) ตัวอย่างเช่น HTTP ใช้พอร์ต 80 โดยปกติ ช่วงของหมายเลขพอร์ตจะอยู่ระหว่าง 0 ถึง 65535
การสื่อสาร
สตรีมใช้สำหรับอินพุตและเอาต์พุตข้อมูลเมื่อสื่อสารผ่านการเชื่อมต่อซ็อกเก็ต หลังจากที่คุณส่งคำขอและสร้างการเชื่อมต่อที่รัดกุมแล้ว คุณต้องปิดการเชื่อมต่อซ็อกเก็ต
การปิดการเชื่อมต่อซ็อกเก็ตเซิร์ฟเวอร์ Java
การเชื่อมต่อซ็อกเก็ตถูกปิดอย่างชัดเจนหลังจากส่งข้อความไปยังเซิร์ฟเวอร์ การเชื่อมต่อซ็อกเก็ตถูกปิดอย่างชัดเจน
// โปรแกรมสาธิต Java สำหรับลูกค้า
นำเข้า java.net.*;
นำเข้า java.io.*;
คลาสสาธารณะ Client_Side_Program
{
// สำหรับการเริ่มต้นซ็อกเก็ตสตรีม สตรีมอินพุต และเอาต์พุตสตรีม
ซ็อกเก็ตซ็อกเก็ตส่วนตัว = null;
อินพุต DataInputStream ส่วนตัว = null;
Private DataOutputStream out = null;
// ตัวสร้างเพื่อวางพอร์ต TCP และที่อยู่ IP
ไคลเอนต์สาธารณะ (เพิ่มสตริง, พอร์ต int)
{
// สร้างการเชื่อมต่อ
ลอง
{
socket = ซ็อกเก็ตใหม่ (เพิ่ม, พอร์ต);
System.out.println("เชื่อมต่อ");
// รับอินพุตจากเทอร์มินัล
อินพุต = ใหม่ DataInputStream (System.in);
// ส่งเอาต์พุตไปยังซ็อกเก็ต
out = ใหม่ DataOutputStream(socket.getOutputStream());
}
จับ (UnknownHostException u)
{
System.out.println(u);
}
จับ (IOException i)
{
System.out.println(i);
}
// สตริงที่จะอ่านข้อความจากอินพุต
สายอักขระ = “”;
// อ่านต่อไปจนกว่าจะป้อน “Over”
ในขณะที่ (!line.equals("Over"))
{
ลอง
{
บรรทัด = input.readLine();
out.writeUTF(บรรทัด);
}
จับ (IOException i)
{
System.out.println(i);
}
}
// ปิดการเชื่อมต่อ
ลอง
{
อินพุต.ปิด();
out.close();
socket.close();
}
จับ (IOException i)
{
System.out.println(i);
}
}
โมฆะคงที่สาธารณะหลัก (สตริง args[])
{
ลูกค้าไคลเอนต์ = ลูกค้าใหม่ (“127.0.0.1”, 5000);
}
}
หากต้องการเยี่ยมชมแหล่งที่มาของรหัสนี้ คลิกที่ นี่
การสร้างการเชื่อมต่อ Java Socket [ฝั่งเซิร์ฟเวอร์]
เซิร์ฟเวอร์สร้างอ็อบเจ็กต์และรอคำขอของลูกค้าในขณะที่พิจารณาการเชื่อมต่อฝั่งซ็อกเก็ตของเซิร์ฟเวอร์ Java เซิร์ฟเวอร์จะโต้ตอบกับลูกค้าเมื่อส่งคำขอแล้ว คุณจะต้องใช้ซ็อกเก็ตสองตัวเพื่อเข้ารหัสแอปพลิเคชันฝั่งเซิร์ฟเวอร์ ซึ่งจะเป็นดังนี้ - เมื่อไคลเอนต์สร้าง Socket() ใหม่ ServerSocket จะถูกสร้างขึ้นเพื่อรอคำขอของลูกค้า ซ็อกเก็ตธรรมดาสามารถกำหนดเป็นโปรแกรมที่เริ่มต้นการสื่อสารทางฝั่งเซิร์ฟเวอร์กับไคลเอ็นต์ คุณสามารถสื่อสารการตอบสนองกับไคลเอนต์ตามลำดับ เมื่อคุณได้รับรายงานจากการเชื่อมต่อซ็อกเก็ตฝั่งเซิร์ฟเวอร์ java
การสื่อสาร
ในการใช้ซ็อกเก็ตเพื่อส่งเอาต์พุต โดยทั่วไปเราหวังว่าจะใช้เมธอด getOutputStream()
การปิดการเชื่อมต่อซ็อกเก็ตเซิร์ฟเวอร์ Java
จำเป็นอย่างยิ่งที่จะต้องเชื่อมต่อให้เสร็จโดยปิดทั้งซ็อกเก็ตและสตรีมอินพุต-เอาท์พุต
// โปรแกรมจาวาเซิร์ฟเวอร์
นำเข้า java.net.*;
นำเข้า java.io.*;
เซิร์ฟเวอร์คลาสสาธารณะ
{
// เริ่มต้นซ็อกเก็ตและอินพุตสตรีม
ซ็ อกเก็ตซ็อกเก็ตส่วนตัว = null;
เซิร์ฟเวอร์ ServerSocket ส่วนตัว = null;
DataInputStream ส่วนตัวใน = null;
// ตัวสร้างพร้อมพอร์ต
เซิร์ฟเวอร์สาธารณะ (พอร์ต int)
{
// รอการเชื่อมต่อหลังจากเริ่มเซิร์ฟเวอร์
ลอง
{
เซิร์ฟเวอร์ = ใหม่ ServerSocket (พอร์ต);
System.out.println("เซิร์ฟเวอร์: เริ่มต้น");
System.out.println(“รอการมาถึงของลูกค้า…”);
ซ็อกเก็ต = server.accept ();
System.out.println(“ลูกค้าได้รับการยอมรับแล้ว”);
// สำหรับรับอินพุตซ็อกเก็ตไคลเอ็นต์
ใน = ใหม่ DataInputStream (
ใหม่ BufferedInputStream(socket.getInputStream()));
สายอักขระ = “”;
// สำหรับอ่านข้อความจากลูกค้าจน “Over” ถูกส่ง
ในขณะที่ (!line.equals("Over"))
{
ลอง
{
บรรทัด = in.readUTF();
System.out.println(บรรทัด);
}
จับ (IOException i)
{
System.out.println(i);
}
}
System.out.println(“ปิดการเชื่อมต่อ”);
// ปิดการเชื่อมต่อ
socket.close();
in.close();
}
จับ (IOException i)
{
System.out.println(i);
}
}
โมฆะคงที่สาธารณะหลัก (สตริง args[])
{
เซิร์ฟเวอร์เซิร์ฟเวอร์ = เซิร์ฟเวอร์ใหม่ (5000);
}
}
หากต้องการตรวจสอบรายละเอียดของรหัสนี้ คลิกที่ นี่
คุณสามารถเรียกใช้ซอฟต์แวร์ฝั่งเซิร์ฟเวอร์ก่อนได้หลังจากกำหนดค่าทั้งไคลเอนต์และเซิร์ฟเวอร์สิ้นสุด จากนั้น คุณต้องรันซอฟต์แวร์ฝั่งไคลเอ็นต์และส่งคำขอ เซิร์ฟเวอร์จะตอบสนองทันทีเมื่อคำขอมาจากไคลเอนต์สิ้นสุด
สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา
เอสแอล. ไม่ | โปรแกรมพัฒนาซอฟต์แวร์ | |
1 | วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME |
2 | Bootcamp การพัฒนาเต็มกอง | โปรแกรม PG ใน Blockchain |
3 | Executive Post Graduate Program in Software Development - Specialization in DevOps | ดูหลักสูตรวิศวกรรมซอฟต์แวร์ทั้งหมด |
เทอร์มินัลหรือพรอมต์คำสั่งกำลังทำงาน
ในการเริ่มต้น Terminal หรือ Command Prompt เราจะใช้คำสั่งต่อไปนี้ ในการเริ่มต้น เราจะสร้างสองหน้าต่าง หน้าต่างหนึ่งมีไว้สำหรับเซิร์ฟเวอร์และอีกหน้าต่างหนึ่งสำหรับไคลเอนต์
- ให้โปรแกรมเซิร์ฟเวอร์เริ่มทำงาน
$ java Server
- จากนั้นในเทอร์มินัลอื่น ให้เปิดแอปพลิเคชันไคลเอนต์เป็น
ไคลเอนต์จาวา $
ซอฟต์แวร์จะแสดง "เชื่อมต่อแล้ว" และ "ยอมรับไคลเอ็นต์แล้ว" เมื่อเซิร์ฟเวอร์ยอมรับไคลเอ็นต์
- ในกล่อง Client คุณสามารถเริ่มป้อนข้อความได้ นี่คือตัวอย่างการป้อนข้อมูลของไคลเอ็นต์
สวัสดี! นี่เป็นการเชื่อมต่อซ็อกเก็ตมืออาชีพครั้งแรกของฉัน
ที่เซิร์ฟเวอร์รับและแสดงพร้อมกัน
สวัสดี! นี่เป็นการเชื่อมต่อซ็อกเก็ตมืออาชีพครั้งแรกของฉัน
เกิน.
ปิดการเชื่อมต่อ
ตามที่ระบุไว้ก่อนหน้านี้ การส่ง “เกิน” จะสิ้นสุดการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์
อ่านบทความยอดนิยมของเราเกี่ยวกับการพัฒนาซอฟต์แวร์
วิธีการใช้ Data Abstraction ใน Java? | Inner Class ใน Java คืออะไร? | ตัวระบุ Java: คำจำกัดความ ไวยากรณ์ และตัวอย่าง |
ทำความเข้าใจการห่อหุ้มใน OOPS ด้วยตัวอย่าง | อาร์กิวเมนต์บรรทัดคำสั่งใน C อธิบาย | คุณสมบัติและลักษณะเด่น 10 อันดับแรกของคลาวด์คอมพิวติ้งในปี 2022 |
ความหลากหลายใน Java: แนวคิด ประเภท ลักษณะและตัวอย่าง | แพ็คเกจใน Java และวิธีใช้งาน | บทช่วยสอน Git สำหรับผู้เริ่มต้น: เรียนรู้ Git ตั้งแต่เริ่มต้น |
บทสรุป
การเขียนโปรแกรม Java Socket เป็นเครื่องมือสำคัญที่ดำเนินการโดยใช้ API ซ็อกเก็ตเพื่อสร้างการสื่อสารระหว่างแอปพลิเคชันไคลเอนต์เซิร์ฟเวอร์ระยะไกล ความรู้ที่เหมาะสมของการเขียนโปรแกรมซ็อกเก็ตสามารถปรับปรุงการเชื่อมต่อเซิร์ฟเวอร์และไคลเอนต์ไปและกลับ
หากคุณต้องการเรียนรู้ Java และเชี่ยวชาญด้านการพัฒนาฟูลสแตก เรามีหลักสูตรที่มีผลกระทบสูงสำหรับคุณ: โปรแกรม PG สำหรับผู้บริหารระดับสูงของ upGrad ในการพัฒนาซอฟต์แวร์ – ความเชี่ยวชาญพิเศษในการพัฒนาแบบเต็มสแต็ ก
โปรแกรม 13 เดือนจาก IIIT-B ได้รับการออกแบบมาเพื่อช่วยให้นักเรียนได้รับทักษะต่างๆ เช่น พื้นฐานของวิทยาการคอมพิวเตอร์ กระบวนการพัฒนาซอฟต์แวร์ Backend API และ Interactive Web UI คุณสามารถเข้าถึง Software Career Transition Bootcamp ทั้งสำหรับผู้ที่ไม่ใช่เทคโนโลยีและผู้เขียนโค้ดใหม่ เพื่อฝึกฝนทักษะการเขียนโปรแกรมและการสนับสนุนด้านอาชีพแบบ 360° จาก upGrad
เรียนรู้ หลักสูตรการพัฒนาซอฟต์แวร์ ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม Executive PG โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
ประโยชน์ของการเรียนรู้การเขียนโปรแกรมซ็อกเก็ต Java คืออะไร
ซ็อกเก็ตอาจใช้เพื่อสร้างแอปพลิเคชันไคลเอ็นต์-เซิร์ฟเวอร์ เช่น แชท จากจุดยืนของเครือข่าย ซ็อกเก็ตถูกใช้งานในระดับพื้นฐานที่สุดของการรักษาความปลอดภัยเพื่อค้นหาว่าพอร์ตของระบบเปิดอยู่หรือไม่ มีโปรแกรมสแกนพอร์ตมาตรฐานเช่น Nmap หรือไม่ และสามารถใช้ในระดับต่ำได้หรือไม่ สามารถใช้ในลักษณะเดียวกับคำสั่ง SSH - Secure Socket Shell สามารถใช้เชื่อมต่อกับเซิร์ฟเวอร์ภายนอกผ่านเชลล์แบบย้อนกลับ
ฟังก์ชันการยอมรับทำหน้าที่อะไร?
ฟังก์ชัน accept จะรอให้ไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์โดยบล็อกไม่ให้อยู่ที่นั่นจนกว่าอาร์กิวเมนต์จะมาถึง จากนั้นเราใช้ฟังก์ชัน getInputStream เพื่อรับอินพุตจากซ็อกเก็ต เซิร์ฟเวอร์ได้รับการออกแบบให้รับข้อความที่ส่งต่อไปได้จนกว่าจะได้รับคำสั่ง Over
เหตุใดจึงใช้เธรดในการเขียนโปรแกรมเครือข่าย
เราต้องการให้ลูกค้าหลายรายเข้าร่วมพร้อมกัน ดังนั้น เราต้องใช้เธรดที่ฝั่งเซิร์ฟเวอร์ เพื่อให้เธรดอื่นสามารถจัดการคำขอของไคลเอ็นต์แต่ละรายการได้ สมมติว่ามีคำขอสองรายการมาที่เซิร์ฟเวอร์พร้อมกัน เนื่องจากไม่มีวิธีใดในการประมวลผลคำขอหลายรายการพร้อมกันในแอปพลิเคชันไคลเอนต์-ไคลเอ็นต์แบบง่ายของเรา คำขอที่มาถึงแม้จะเร็วกว่าระดับนาโนวินาทีก็สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ ในขณะที่คำขออื่นๆ จะถูกปฏิเสธ