รูปแบบการใช้งานเครือข่ายส่วนใหญ่ประกอบด้วย:
www (เวิลด์ ไวด์ เว็บ) เป็นระบบเรียกดูข้อมูลตามโมเดลไคลเอ็นต์/เซิร์ฟเวอร์ อิงตามภาษา HTML และโปรโตคอล HTTP และสามารถให้บริการอินเทอร์เน็ตต่างๆ ได้ ข้อมูลเครือข่ายถูกวางไว้ในตำแหน่งต่างๆ บนโฮสต์ และเซิร์ฟเวอร์ www ใช้ลิงก์ไฮเปอร์เท็กซ์เพื่อลิงก์ข้อมูลต่างๆ ไคลเอ็นต์ www (เบราว์เซอร์) มีหน้าที่รับผิดชอบในการสร้างการติดต่อกับเซิร์ฟเวอร์ การส่งคำขอไปยังเซิร์ฟเวอร์ การประมวลผลไฮเปอร์มีเดีย HTML การจัดหาอินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) การแสดงข้อมูล ฯลฯ
ในโหมดการทำงานของไคลเอนต์/เซิร์ฟเวอร์ ทางฝั่งเซิร์ฟเวอร์ ให้เตรียมพร้อมที่จะยอมรับการสื่อสารจากคอมพิวเตอร์ไคลเอนต์หลายเครื่อง ด้วยเหตุนี้ นอกเหนือจากการใช้ที่อยู่ IP เพื่อระบุคอมพิวเตอร์บนอินเทอร์เน็ตแล้ว ยังมีการแนะนำหมายเลขพอร์ตเพื่อระบุเธรดที่ให้บริการพื้นหลังบนฝั่งเซิร์ฟเวอร์อีกด้วย การรวมกันของหมายเลขพอร์ตและที่อยู่ IP เรียกว่าซ็อกเก็ตเครือข่าย
ในการใช้งานโหมด C/S ในภาษา Java ซ็อกเก็ตจะถูกแบ่งออกเป็นสองประเภท:
เครื่องเซิร์ฟเวอร์ให้บริการสำหรับเครื่องไคลเอนต์ผ่านพอร์ต (ที่อยู่ I/O บัส) เครื่องเซิร์ฟเวอร์ให้บริการที่แตกต่างกันหลายอย่างในเวลาเดียวกันบนพอร์ตที่แตกต่างกัน ลูกค้าเข้าถึงพอร์ตบางพอร์ตของเซิร์ฟเวอร์และขอให้เซิร์ฟเวอร์ให้บริการผ่านพอร์ตนี้ ข้อบังคับ: หมายเลขพอร์ต 0~1023 มีไว้สำหรับการใช้งานเฉพาะระบบ ตัวอย่างเช่น โปรโตคอล HTTP อยู่ที่พอร์ต 80 และโปรโตคอล telnet อยู่ที่พอร์ต 23 แอปพลิเคชันใช้พอร์ต 1024~65535
เมื่อโปรแกรมไคลเอนต์และโปรแกรมเซิร์ฟเวอร์จำเป็นต้องสื่อสาร คลาส Socket สามารถใช้เพื่อสร้างการเชื่อมต่อซ็อกเก็ต คิดว่าการเชื่อมต่อซ็อกเก็ตเป็นการโทรศัพท์: เริ่มแรกโปรแกรมไคลเอนต์จะทำการโทรและโปรแกรมเซิร์ฟเวอร์จะฟัง หลังจากการโทรเสร็จสิ้น ฝ่ายใดฝ่ายหนึ่งสามารถพูดได้ตลอดเวลา
มีสองวิธีที่เป็นทางเลือกเพื่อให้บรรลุการสื่อสารระหว่างทั้งสองฝ่าย: ซ็อกเก็ตสตรีมมิ่งและซ็อกเก็ตดาตาแกรม:
ซ็อกเก็ตสตรีมมิ่งสร้างช่องทางการสื่อสารระหว่างโปรแกรมไคลเอนต์และโปรแกรมเซิร์ฟเวอร์ แต่ละซ็อกเก็ตสามารถดำเนินการทั้งการอ่านและเขียน สำหรับปลายด้านใดด้านหนึ่ง กระบวนการเซสชันการสื่อสารกับอีกฝ่ายคือ:
สร้างการเชื่อมต่อซ็อกเก็ต รับสตรีมอินพุต/เอาต์พุต อ่าน/เขียนข้อมูล และปิดซ็อกเก็ต (รื้อการเชื่อมต่อ) หลังจากการสื่อสารเสร็จสิ้น
การใช้ตัวสร้างซ็อกเก็ต สามารถสร้างออบเจ็กต์ซ็อกเก็ตบนฝั่งไคลเอ็นต์ไปยังเซิร์ฟเวอร์ได้:
ซ็อกเก็ต (โฮสต์สตริง, พอร์ต int): โฮสต์คือที่อยู่ IP ของเซิร์ฟเวอร์ พอร์ตคือหมายเลขพอร์ต ซึ่งจะมีการตกลงไว้ล่วงหน้า
ตัวอย่างเช่น รหัส:
ลอง { Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860); catch(IOException e){}
จากนั้นใช้เมธอด getInputStream() เพื่อรับสตรีมอินพุต ใช้สตรีมอินพุตนี้เพื่ออ่านข้อมูลที่เซิร์ฟเวอร์ใส่ลงใน "บรรทัด" ใช้เมธอด getOutputStream() เพื่อรับสตรีมเอาต์พุต และใช้สตรีมเอาต์พุตนี้เพื่อ เขียนข้อมูลไปที่ "บรรทัด"
การใช้ตัวสร้าง ServerSocket คุณสามารถสร้างอ็อบเจ็กต์ซ็อกเก็ตเซิร์ฟเวอร์บนเซิร์ฟเวอร์ที่ยอมรับซ็อกเก็ตไคลเอ็นต์:
ServerSocket(int port): ระบุหมายเลขพอร์ตและสร้างวัตถุ ServerSocket หมายเลขพอร์ตพอร์ตจะต้องเหมือนกับหมายเลขพอร์ตที่ลูกค้าเรียก เมื่อต้องการทำเช่นนี้ ใช้รูปแบบของรหัสต่อไปนี้:
ลอง { ServerSocket serverSocket = new ServerSocket(1860); }catch(IOException e){}
โปรแกรมฝั่งเซิร์ฟเวอร์จะรับฟังพอร์ตที่ระบุ เมื่อได้รับคำขอบริการจากโปรแกรมไคลเอ็นต์ โปรแกรมจะสร้างซ็อกเก็ตออบเจ็กต์เพื่อสื่อสารกับโปรแกรมไคลเอ็นต์ที่สอดคล้องกับพอร์ต ตัวอย่างเช่น หลังจากรันโค้ดด้านบนเพื่อสร้างอ็อบเจ็กต์ซ็อกเก็ตเซิร์ฟเวอร์และสร้างอ็อบเจ็กต์ serverSocket แล้ว อาจใช้เมธอด Accept() เพื่อรับอ็อบเจ็กต์ Socket และรับข้อมูลจากโปรแกรมไคลเอนต์จากซ็อกเก็ต mySocket ดังแสดงในรหัสต่อไปนี้:
ลอง { Socket sc = serverSocket.accept();//ac is a Socket object}catch(IOException e){}
หากต้องการเพิกถอนบริการ คุณสามารถปิดวัตถุ Socket sc:
sc.ปิด();
[ตัวอย่าง] แอปพลิเคชันไคลเอ็นต์ในโหมด C/S นี่เป็นตัวอย่างง่ายๆ ของการสื่อสารซ็อกเก็ตการสตรีมฝั่งไคลเอ็นต์ โค้ดนี้แสดงให้เห็นถึงวิธีการเขียนโปรแกรมฝั่งไคลเอ็นต์ ในตัวอย่าง โปรแกรมไคลเอนต์ทำการร้องขอไปยังพอร์ต 4441 ของโฮสต์เซิร์ฟเวอร์ หลังจากสร้างการเชื่อมต่อแล้ว โปรแกรมจะอ่านและเขียนไปยังเซิร์ฟเวอร์เสร็จสมบูรณ์
นำเข้า java.io.*; นำเข้า java.net. *; ไคลเอนต์คลาสสาธารณะ { public static void main (String args []) { String s = null;Socket mySocket; DataInputStream in = null; DataOutputStream out = null; = new Socket("localhost",4441); in = new DataInputStream(mySocket.getInputStream()); ออก = ใหม่ DataOutputStream(mySocket.getOutputStream()); out.writeUTF("เซิร์ฟเวอร์ที่ดี!"); ในขณะที่ (true){ s = in.readUTF(); if(s==null) พัง; } mySocket.close(); }catch(IOException e){ System.out.println(“ไม่สามารถเชื่อมต่อ”);
[ตัวอย่าง] แอปพลิเคชันฝั่งเซิร์ฟเวอร์ที่สอดคล้องกับแอปพลิเคชันฝั่งไคลเอ็นต์ โปรแกรมรับฟังบนพอร์ต 4441 เมื่อตรวจพบคำขอของไคลเอนต์ สตริงที่มี "ลูกค้า สวัสดี ฉันเป็นเซิร์ฟเวอร์" จะถูกสร้างขึ้นและส่งออกไปยังไคลเอนต์
นำเข้า java.io.*; นำเข้า java.net. *; เซิร์ฟเวอร์คลาสสาธารณะ { public static void main (String args []) { ServerSocket server = null; Socket you = null; String s = null; ใน = null; ลอง { เซิร์ฟเวอร์ = ใหม่ ServerSocket (4441); } จับ (IOException e1) { system.out.println ("ข้อผิดพลาด:" +e1); } ลอง{ you = server.accept(); in = new DataInputStream(you.getInputStream()); out = new DataOutputStream(you.getOutputStream()); ); if(s!=null) พัง; } out.writeUTF("สวัสดีลูกค้า ฉันคือเซิร์ฟเวอร์"); out.close(); } จ){System.out.println(“ข้อผิดพลาด:”+e);} }}
เพื่อให้คอมพิวเตอร์สามารถทำงานแบบขนานได้อย่างเต็มที่ งานเชื่อมต่อซ็อกเก็ตจึงสามารถทำได้โดยใช้เธรดเดียว เมื่อไคลเอนต์ร้องขอเซิร์ฟเวอร์เพื่อให้บริการ หรือเมื่อเซิร์ฟเวอร์ได้รับการร้องขอการบริการของลูกค้า เซิร์ฟเวอร์จะเริ่มต้นเธรดที่ทุ่มเทให้กับการสื่อสารข้อมูลให้เสร็จสิ้น สร้างสตรีมอินพุตและเอาท์พุตในเธรดนี้ และเสร็จสิ้นการแลกเปลี่ยนข้อมูลระหว่างไคลเอนต์และ เซิร์ฟเวอร์
[ตัวอย่าง] แอปเพล็ตไคลเอ็นต์ที่วางการเชื่อมต่อซ็อกเก็ตบนเธรด อินเทอร์เฟซมีปุ่มส่งข้อความ กล่องข้อความ และพื้นที่ข้อความ แอปพลิเคชันไคลเอ็นต์จะสร้างการเชื่อมต่อซ็อกเก็ตกับเซิร์ฟเวอร์ก่อน ใช้สตรีมอินพุตข้อมูลเพื่ออ่านข้อมูลที่เซิร์ฟเวอร์ใส่ไว้ในบรรทัดซ้ำๆ และแสดงข้อมูลที่ได้รับในพื้นที่ข้อความ หากข้อมูลที่ดึงมาคือ "สิ้นสุด" การเชื่อมต่อซ็อกเก็ตจะถูกปิดและโปรแกรมจะสิ้นสุด ผู้ใช้ยังสามารถป้อนข้อมูลในกล่องข้อความและกดปุ่มส่งข้อมูล และโปรแกรมไคลเอนต์ใช้สตรีมข้อมูลออกเพื่อส่งเนื้อหาในกล่องข้อความไปยังเซิร์ฟเวอร์
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public class Aclient ขยาย Applet นำไปใช้ Runnable, ActionListener { ปุ่ม JTextField; JTextArea textA; DataOutputStream out; public void init(){ setBackground(สีใหม่(120,153,137)); setLayout(new BorderLayout()); 20,30); setSize(450,350); JPanel p = ใหม่ JPanel(); p.add (textF); p.add (ปุ่ม); เพิ่ม (textA, "Center"); เพิ่ม (p, "South"); button.addActionListener (นี้); } สาธารณะเริ่มต้นเป็นโมฆะ () ซ็อกเก็ตใหม่ (this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); }จับ(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); โมฆะสาธารณะทำงาน () { String s = null; while (true) { try { s = in.readUTF (); } catch (IOException e) {} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } การกระทำที่เป็นโมฆะสาธารณะ ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ ลอง{ out.writeUTF(s); }catch(IOException e1){} } else{ ลอง{ out.writeUTF("กรุณาพูด"); } catch(IOException e1){} } } }}
[ตัวอย่าง] โปรแกรมใช้เทอร์มินัล 4441 เพื่อสร้างการเชื่อมต่อซ็อกเก็ตกับไคลเอนต์ หลังจากที่เซิร์ฟเวอร์ได้รับคำขอของไคลเอนต์ มันจะสร้างเธรดด้วยซ็อกเก็ตของไคลเอนต์และเริ่มต้นมัน หากไม่มีแอปพลิเคชันของลูกค้า ให้ตรวจสอบแอปพลิเคชันของลูกค้าต่อไป เธรดจะสร้างสตรีมข้อมูลอินพุตเข้าและข้อมูลเอาต์พุตจะสตรีมออกตามซ็อกเก็ตของไคลเอ็นต์ เธรดใช้ในการอ่านข้อมูลที่ลูกค้าใส่ลงในบรรทัด หากข้อมูลที่ได้รับคือ "สิ้นสุด" เซิร์ฟเวอร์จะตอบกลับ "สิ้นสุด" จากนั้นจะปิดการเชื่อมต่อซ็อกเก็ต มิฉะนั้นจะตอบกลับว่า "ฉันเป็นเซิร์ฟเวอร์ที่คุณพูดกับฉัน" และข้อมูลที่ได้รับจากเซิร์ฟเวอร์
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public class Aclient ขยาย Applet นำไปใช้ Runnable, ActionListener { ปุ่ม JTextField; JTextArea textA; ซ็อกเก็ตเธรด; DataOutputStream out; public void init(){ setBackground(สีใหม่(120,153,137)); setLayout(new BorderLayout()); 20,30); setSize(450,350); JPanel p = ใหม่ JPanel(); p.add (textF); p.add (ปุ่ม); เพิ่ม (textA, "Center"); เพิ่ม (p, "South"); button.addActionListener (นี้); } สาธารณะเริ่มต้นเป็นโมฆะ () ซ็อกเก็ตใหม่ (this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); }จับ(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); โมฆะสาธารณะทำงาน () { String s = null; while (true) { try { s = in.readUTF (); } catch (IOException e) {} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } การกระทำที่เป็นโมฆะสาธารณะ ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ ลอง{ out.writeUTF(s); }catch(IOException e1){} } else{ ลอง{ out.writeUTF("กรุณาพูด"); }catch(IOException e1){} } } }}