บทช่วยสอน การเขียนโปรแกรม Java เครือข่าย ที่ดีที่สุดในปี 2024 ในบทช่วยสอนนี้ คุณสามารถเรียนรู้ การเขียนโปรแกรมซ็อกเก็ต,วิธีการเรียน ServerSocket,วิธีการเรียนซ็อกเก็ต,วิธีการเรียน InetAddress,ตัวอย่างเช่นลูกค้าซ็อกเก็ต,เช่นเซิร์ฟเวอร์ซ็อกเก็ต,
เขียนโปรแกรมเครือข่ายหมายถึงการเขียนทำงานบนอุปกรณ์หลาย ๆ (คอมพิวเตอร์) โปรแกรมอุปกรณ์เหล่านี้จะเชื่อมต่อผ่านเครือข่าย
แพคเกจ java.net ใน J2SE API มีการเรียนและอินเตอร์เฟซที่ให้รายละเอียดการติดต่อสื่อสารในระดับต่ำ คุณสามารถใช้ชั้นเรียนเหล่านี้และอินเตอร์เฟซที่จะมุ่งเน้นการแก้ปัญหาที่เกิดขึ้นมากกว่ามุ่งเน้นไปที่รายละเอียดการติดต่อสื่อสาร
แพคเกจ java.net ให้การสนับสนุนสำหรับสองโปรโตคอลเครือข่ายร่วมกัน:
กวดวิชานี้จะอธิบายต่อไปนี้สองหัวข้อ
ซ็อกเก็ตใช้ TCP ให้เป็นกลไกการสื่อสารระหว่างคอมพิวเตอร์สองเครื่อง โปรแกรมไคลเอนต์สร้างซ็อกเก็ตและพยายามที่จะเชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์
เมื่อการเชื่อมต่อจะจัดตั้งขึ้นเซิร์ฟเวอร์จะสร้างวัตถุซ็อกเก็ต ไคลเอ็นต์และเซิร์ฟเวอร์ในขณะนี้สามารถเขียนและอ่านวัตถุซ็อกเก็ตในการสื่อสาร
ระดับ java.net.Socket หมายถึงซ็อกเก็ตและให้ระดับ java.net.ServerSocket ฟังสำหรับโปรแกรมเซิร์ฟเวอร์ของลูกค้าและสร้างกลไกในการเชื่อมต่อกับพวกเขา
มันเกิดขึ้นเมื่อการเชื่อมต่อ TCP โดยใช้ขั้นตอนต่อไปนี้เพื่อสร้างซ็อกเก็ตระหว่างคอมพิวเตอร์สองเครื่อง:
TCP เป็นโปรโตคอลการสื่อสารแบบสองทิศทางเพื่อให้สามารถส่งข้อมูลผ่านสองกระแสข้อมูลในเวลาเดียวกัน. ต่อไปนี้เป็นระดับที่สมบูรณ์มีวิธีการที่มีประโยชน์หลายเพื่อให้บรรลุซ็อกเก็ต
การใช้งานเซิร์ฟเวอร์โดยใช้คลาส java.net.ServerSocket สำหรับพอร์ตและฟังสำหรับการร้องขอของลูกค้า
ระดับ ServerSocket มีสี่ก่อสร้าง:
เลขที่ | วิธีการรายละเอียด |
1 | ServerSocket สาธารณะ (พอร์ต int) พ่น IOException สร้างผลผูกพันกับพอร์ตที่เฉพาะเจาะจงของซ็อกเก็ตเซิร์ฟเวอร์ |
2 | ServerSocket สาธารณะ (พอร์ต int, int ค้าง ) พ่น IOException ที่มีงานในมือที่ระบุสร้างซ็อกเก็ตเซิร์ฟเวอร์และผูกไปยังหมายเลขพอร์ตท้องถิ่นระบุ |
3 | ServerSocket สาธารณะ (พอร์ต int, int ค้าง อยู่ InetAddress) พ่น IOException โดยใช้พอร์ตที่ระบุฟังค้างและเชื่อมโยงกับที่อยู่ในท้องถิ่นของเซิร์ฟเวอร์ที่ถูกสร้างขึ้น |
4 | ServerSocket สาธารณะ () พ่น IOException สร้างซ็อกเก็ตเซิร์ฟเวอร์ไม่ได้ผูกไว้ |
สร้างซ็อกเก็ตเซิร์ฟเวอร์ไม่ได้ผูกไว้ หากวิธี ServerSocket สร้างไม่ได้โยนข้อยกเว้นก็หมายความว่าใบสมัครของคุณได้รับการผูกพันที่จะประสบความสำเร็จในพอร์ตที่ระบุและฟังสำหรับการร้องขอของลูกค้า
นี่คือบางส่วนร่วมกันในชั้นเรียนวิธีการ ServerSocket:
เลขที่ | วิธีการรายละเอียด |
1 | int สาธารณะ getLocalPort () ผลตอบแทนพอร์ตที่ซ็อกเก็ตนี้จะฟัง |
2 | ซ็อกเก็ตของประชาชนยอมรับ () พ่น IOException เขาฟังและยอมรับซ็อกเก็ตนี้ |
3 | โมฆะสาธารณะ setSoTimeout (int หมดเวลา) โดยการระบุค่าการหมดเวลาเพื่อเปิด / ปิด SO_TIMEOUT ในมิลลิวินาที |
4 | โมฆะสาธารณะผูก (โฮสต์ SocketAddress, int ค้าง) ผูก ServerSocket ไปยังที่อยู่ที่เฉพาะเจาะจง (ที่อยู่ IP และหมายเลขพอร์ต) |
นามระดับ java.net.Socket ของไคลเอ็นต์และเซิร์ฟเวอร์ในการสื่อสารกับแต่ละอื่น ๆ ในซ็อกเก็ต ที่จะได้รับวัตถุลูกค้าซ็อกเก็ตโดยอินสแตนซ์และเซิร์ฟเวอร์ที่จะได้รับวัตถุซ็อกเก็ตจะถูกส่งกลับโดยค่ายอมรับ () วิธีการ
ซ็อกเก็ตระดับห้าก่อสร้าง
เลขที่ | วิธีการรายละเอียด |
1 | ซ็อกเก็ตสาธารณะ (โฮสต์ String, int พอร์ต ) พ่น UnknownHostException, IOException สร้างซ็อกเก็ตสตรีมและเชื่อมต่อไปยังหมายเลขพอร์ตที่ระบุบนโฮสต์ที่ระบุ |
2 | ซ็อกเก็ตสาธารณะ (โฮสต์ InetAddress พอร์ต int ) พ่น IOException สร้างซ็อกเก็ตสตรีมและเชื่อมต่อไปยังที่อยู่ IP ที่ระบุจำนวนพอร์ตที่ระบุ |
3 | ซ็อกเก็ตสาธารณะ (โฮสต์ String, int พอร์ต , InetAddress localAddress, int localport) พ่น IOException สร้างซ็อกเก็ตและเชื่อมต่อกับพอร์ตระยะไกลที่ระบุในพื้นที่ห่างไกลที่ระบุ |
4 | ซ็อกเก็ตสาธารณะ (โฮสต์ InetAddress พอร์ต int , InetAddress localAddress, int localport) พ่น IOException สร้างซ็อกเก็ตและเชื่อมต่อกับพอร์ตระยะไกลที่ระบุในที่อยู่ห่างไกลที่ระบุ |
5 | ซ็อกเก็ต (มหาชน) สร้างซ็อกเก็ตไม่เกี่ยวเนื่องกันชนิดเริ่มต้นระบบ SocketImpl |
เมื่อผลตอบแทนซ็อกเก็ตคอนสตรัคและไม่เพียงแค่ยกตัวอย่างวัตถุซ็อกเก็ตมันจริงจะพยายามที่จะเชื่อมต่อกับเซิร์ฟเวอร์ที่ระบุและพอร์ต
นี่คือวิธีการที่น่าสนใจบางคนจะให้ความสนใจกับลูกค้าและเซิร์ฟเวอร์ที่มีวัตถุซ็อกเก็ตโดยไม่คำนึงถึงลูกค้าหรือเซิร์ฟเวอร์สามารถเรียกวิธีการเหล่านี้
เลขที่ | วิธีการรายละเอียด |
1 | โมฆะสาธารณะเชื่อมต่อ (โฮสต์ SocketAddress, int หมดเวลา) พ่น IOException การเชื่อมต่อซ็อกเก็ตนี้ไปยังเซิร์ฟเวอร์และระบุค่าหมดเวลา |
2 | ประชาชน InetAddress getInetAddress () ที่อยู่กลับมาของการเชื่อมต่อซ็อกเก็ต |
3 | int สาธารณะ getPort () ส่งกลับซ็อกเก็ตนี้จะเชื่อมต่อกับพอร์ตระยะไกล |
4 | int สาธารณะ getLocalPort () ส่งกลับซ็อกเก็ตนี้ถูกผูกไว้กับพอร์ตท้องถิ่น |
5 | ประชาชน SocketAddress getRemoteSocketAddress () ที่อยู่กลับมาของปลายทางซ็อกเก็ตนี้จะเชื่อมต่อถ้ามันเป็นผลตอบแทนที่ไม่เกี่ยวเนื่องกันเป็นโมฆะ |
6 | ประชาชน InputStream getInputStream () พ่น IOException ผลตอบแทนที่ได้สตรีมใส่สำหรับซ็อกเก็ตนี้ |
7 | ประชาชน OutputStream getOutputStream () พ่น IOException ผลตอบแทนที่ได้กระแส output สำหรับซ็อกเก็ตนี้ |
8 | โมฆะสาธารณะใกล้ () พ่น IOException ปิดซ็อกเก็ตนี้ |
ชั้นนี้แสดงให้เห็นถึง Internet Protocol (IP) ข้างล่างนี้เป็นประโยชน์เมื่อวิธีการเขียนโปรแกรมซ็อกเก็ต:
เลขที่ | วิธีการรายละเอียด |
1 | คง InetAddress getByAddress (byte [] addr ) ในกรณีที่ได้รับที่อยู่ IP ดิบกลับวัตถุ InetAddress |
2 | คง InetAddress getByAddress (โฮสต์ String ไบต์ [] addr) ตามที่สร้างชื่อโฮสต์ InetAddress และที่อยู่ IP ที่ให้มา |
3 | คง InetAddress getByName (โฮสต์ String) ตรวจสอบที่อยู่ IP ของโฮสต์ในกรณีของชื่อโฮสต์ที่กำหนด |
4 | สตริง getHostAddress () กลับสตริงที่อยู่ IP (นำเสนอต้นฉบับเดิม) |
5 | สตริง getHostName () ได้รับชื่อโฮสต์สำหรับที่อยู่ IP นี้ |
6 | คง InetAddress getLocalHost () ผลตอบแทนที่ได้โฮสต์ท้องถิ่น |
7 | String toString () แปลงที่อยู่ IP นี้เป็นสตริง |
GreetingClient ต่อไปนี้เป็นโปรแกรมไคลเอนต์ที่เชื่อมต่อผ่านซ็อกเก็ตไปยังเซิร์ฟเวอร์และส่งคำขอแล้วรอการตอบสนอง
// 文件名 GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }
โปรแกรม GreetingServer ต่อไปนี้เป็นโปรแกรมด้านเซิร์ฟเวอร์ที่ใช้ซ็อกเก็ตที่จะฟังในพอร์ตที่ระบุ
// 文件名 GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "th."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); }catch(IOException e) { e.printStackTrace(); } } }
รวบรวมรหัส Java ข้างต้นและดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มบริการใช้หมายเลขพอร์ตที่ 6066:
$ java GreetingServer 6066 Waiting for client on port 6066th.เปิดสิ่งที่ต้องการของลูกค้าต่อไปนี้:
$ java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye!