“สวัสดี อามีโก้!”

“สวัสดี ริชิ!”

"หัวข้อของบทเรียนวันนี้คือซ็อกเก็ต"

"คุณรู้อยู่แล้วว่าคอมพิวเตอร์ทุกเครื่องในเครือข่ายมีที่อยู่ IP เฉพาะของตัวเอง"

"ใช่."

"ลองนึกดูว่าคุณมีคอมพิวเตอร์หลายเครื่อง แต่ละเครื่องใช้งานโปรแกรมต่างๆ หลายสิบโปรแกรมที่เข้าถึงอินเทอร์เน็ตได้: Skype, ICQ และอื่นๆ"

"และโปรแกรมเหล่านี้ต้องการสื่อสารระหว่างกัน"

"เราต้องหยุดพวกเขาจากการรบกวนซึ่งกันและกัน เราต้องทำให้ Skype เชื่อมต่อกับ Skype, Slack เชื่อมต่อกับ Slack เป็นต้น"

"จำวิธีแก้ปัญหานี้ด้วย URL และเว็บเซิร์ฟเวอร์ได้อย่างไร"

"ใช่ เราเพิ่มพอร์ต"

"อย่างแน่นอน."

“มันเหมือนกับการสร้างห้องเล็กๆ หลายๆ ห้องในบ้าน แล้วบอกว่าบ้านเป็นตึกอพาร์ทเมนต์แต่ละพอร์ตก็เหมือนอพาร์ทเมนต์แยกกัน

"หากที่อยู่ IP เป็นตัวระบุเฉพาะสำหรับคอมพิวเตอร์ ที่อยู่IP ที่รวมกับพอร์ตจะเป็นตัวระบุเฉพาะสำหรับ 'อพาร์ทเมนต์' ในคอมพิวเตอร์ ซึ่งโปรแกรมสามารถอาศัยอยู่ได้ "

"ตำแหน่งเฉพาะนี้เรียกว่าซ็อกเก็ต "

"ซ็อกเก็ตมีหมายเลขเฉพาะของตัวเองซึ่งประกอบด้วยที่อยู่ IP และหมายเลขพอร์ต "

"อ่า กล่าวอีกนัยหนึ่ง ซ็อกเก็ตเป็นตัวระบุตำแหน่งคอมพิวเตอร์เสมือนบางตำแหน่งที่โปรแกรมสามารถอาศัยอยู่ได้ และอีกโปรแกรมหนึ่งส่งข้อความไปยังตำแหน่งนี้ ซึ่งทำให้ทั้งสองโปรแกรมสื่อสารกันได้"

“ผมไม่รู้ว่าคุณเข้าใจได้อย่างไร แต่นั่นก็ถูกต้องแล้ว”

"ความรู้สึกหุ่นยนต์ของฉันบอกฉัน"

"เยี่ยมมาก ถ้าอย่างนั้นฉันจะให้รายละเอียดบางอย่างแก่คุณ"

"ซ็อกเก็ตเป็นวิธีพื้นฐานและดั้งเดิมที่สุดสำหรับโปรแกรมในการสื่อสาร"

"Java มีสองคลาสสำหรับการทำงานกับซ็อกเก็ต พวกเขาคือSocketและServerSocket "

" ServerSocketเป็นคลาสพิเศษที่มีออบเจกต์เป็นตัวแทนของเซิร์ฟเวอร์ กล่าวคือ อนุญาตให้ฉันให้บริการตามคำขอที่มาถึงซ็อกเก็ตเฉพาะ"

" คลาส Socketเป็นซ็อกเก็ตไคลเอนต์จริง ๆ เราใช้มันเพื่อส่งข้อความไปยังซ็อกเก็ตอื่นและรับการตอบกลับ"

"ต่อไปนี้เป็นวิธีส่งข้อความไปยังซ็อกเก็ต:"

ตัวอย่าง
// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

"ทุกอย่างคล้ายกับการดาวน์โหลดไฟล์จากอินเทอร์เน็ต"

"นั่นสิ ลูกชายของฉัน เป็นเพราะใช้เต้ารับที่นั่นด้วย"

"ซ็อกเก็ตเป็นหัวใจของทุกสิ่งที่เกี่ยวข้องกับเครือข่าย - เกือบทุกอย่าง"

"คุณสามารถอ่านข้อมูลเพิ่มเติมได้ที่นี่ "

"ขอบคุณสำหรับบทเรียน ริชิ"

“ฉันยังไม่เสร็จ นั่นเป็นความคิดเพ้อฝัน”

"ตอนนี้เราจะสำรวจว่าซ็อกเก็ตเซิร์ฟเวอร์ทำงานอย่างไร"

"มันซับซ้อนกว่าเล็กน้อย"

ตัวอย่าง
// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

"ฉันต้องการดึงดูดความสนใจของคุณไปที่จุดสองจุด"

"จุดที่ 1: ในการสร้างซ็อกเก็ต (ไคลเอ็นต์) คุณต้องระบุที่อยู่ IP (หรือชื่อโดเมน) และพอร์ต ในการสร้างซ็อกเก็ตเซิร์ฟเวอร์ คุณต้องระบุพอร์ตเท่านั้น ซ็อกเก็ตเซิร์ฟเวอร์มีอยู่บนคอมพิวเตอร์เท่านั้น มันถูกสร้างขึ้น."

"จุดที่ 2: คลาส ServerSocket มีเมธอด accept() ที่รอการเชื่อมต่อเข้ามา กล่าวคือ เมธอดจะทำงานตลอดไปจนกว่าไคลเอ็นต์ซ็อกเก็ตบางตัวจะพยายามเชื่อมต่อ จากนั้นเมธอดยอมรับ() จะยอมรับการเชื่อมต่อ สร้างซ็อกเก็ต คัดค้านเพื่ออนุญาตการสื่อสาร แล้วส่งกลับวัตถุนี้"

"จากมุมมองของโปรแกรมเมอร์ Java ซ็อกเก็ตคือสองสตรีม: InputStream ที่คุณอ่านข้อความ/ข้อมูล และ OutputStream ที่คุณเขียนข้อความ/ข้อมูล"

"เมื่อคุณสร้างเซิร์ฟเวอร์ซ็อกเก็ต คุณกำลังสร้างพอร์ตที่ซ็อกเก็ตไคลเอนต์บนคอมพิวเตอร์เครื่องอื่นสามารถเชื่อมต่อได้ แต่ในการทำเช่นนี้ พวกเขาต้องระบุหมายเลขพอร์ตของซ็อกเก็ตของเราและที่อยู่ IP ของคอมพิวเตอร์ของเราอย่างถูกต้อง เอาล่ะ หรือชื่อโดเมนของมัน"

"นี่คือตัวอย่างที่น่าสนใจสำหรับคุณ คุณสามารถลองขุดและเรียกใช้มัน:"

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

"จุดรวมคือการใช้ซ็อกเก็ตเซิร์ฟเวอร์เพื่อเขียนเว็บเซิร์ฟเวอร์แบบดั้งเดิมที่คุณสามารถเข้าถึงได้จากเบราว์เซอร์"

"ว้าว! เว็บเซิร์ฟเวอร์เหรอ เยี่ยมไปเลย! ฉันจะศึกษาอย่างละเอียด"

"ขอบใจนะริชชี่"

"แค่นั้นแหละ อามิโกะ ไปพักผ่อนเถอะ!"