การเขียนโปรแกรมซ็อกเก็ตใน 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 เราจะใช้คำสั่งต่อไปนี้ ในการเริ่มต้น เราจะสร้างสองหน้าต่าง หน้าต่างหนึ่งมีไว้สำหรับเซิร์ฟเวอร์และอีกหน้าต่างหนึ่งสำหรับไคลเอนต์

  1. ให้โปรแกรมเซิร์ฟเวอร์เริ่มทำงาน

$ java Server

  1. จากนั้นในเทอร์มินัลอื่น ให้เปิดแอปพลิเคชันไคลเอนต์เป็น

ไคลเอนต์จาวา $

ซอฟต์แวร์จะแสดง "เชื่อมต่อแล้ว" และ "ยอมรับไคลเอ็นต์แล้ว" เมื่อเซิร์ฟเวอร์ยอมรับไคลเอ็นต์

  1. ในกล่อง 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

เหตุใดจึงใช้เธรดในการเขียนโปรแกรมเครือข่าย

เราต้องการให้ลูกค้าหลายรายเข้าร่วมพร้อมกัน ดังนั้น เราต้องใช้เธรดที่ฝั่งเซิร์ฟเวอร์ เพื่อให้เธรดอื่นสามารถจัดการคำขอของไคลเอ็นต์แต่ละรายการได้ สมมติว่ามีคำขอสองรายการมาที่เซิร์ฟเวอร์พร้อมกัน เนื่องจากไม่มีวิธีใดในการประมวลผลคำขอหลายรายการพร้อมกันในแอปพลิเคชันไคลเอนต์-ไคลเอ็นต์แบบง่ายของเรา คำขอที่มาถึงแม้จะเร็วกว่าระดับนาโนวินาทีก็สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ ในขณะที่คำขออื่นๆ จะถูกปฏิเสธ