การเขียนโปรแกรม Java เครือข่าย

เขียนโปรแกรมเครือข่ายหมายถึงการเขียนทำงานบนอุปกรณ์หลาย ๆ (คอมพิวเตอร์) โปรแกรมอุปกรณ์เหล่านี้จะเชื่อมต่อผ่านเครือข่าย

แพคเกจ java.net ใน J2SE API มีการเรียนและอินเตอร์เฟซที่ให้รายละเอียดการติดต่อสื่อสารในระดับต่ำ คุณสามารถใช้ชั้นเรียนเหล่านี้และอินเตอร์เฟซที่จะมุ่งเน้นการแก้ปัญหาที่เกิดขึ้นมากกว่ามุ่งเน้นไปที่รายละเอียดการติดต่อสื่อสาร

แพคเกจ java.net ให้การสนับสนุนสำหรับสองโปรโตคอลเครือข่ายร่วมกัน:

  • TCP: TCP เป็นตัวย่อสำหรับการส่ง Control Protocol ซึ่งรับประกันการสื่อสารที่เชื่อถือระหว่างสองการใช้งาน ใช้กันทั่วไปสำหรับโปรโตคอลอินเทอร์เน็ตที่เรียกว่า TCP / IP
  • UDP: UDP เป็นตัวย่อของยูดีพีโปรโตคอล connectionless ให้ส่งข้อมูลที่จะส่งข้อมูลระหว่างแอพลิเคชัน

กวดวิชานี้จะอธิบายต่อไปนี้สองหัวข้อ

  • การเขียนโปรแกรมซ็อกเก็ต: นี่คือแนวคิดเครือข่ายใช้กันอย่างแพร่หลายจะได้รับการอธิบายในรายละเอียดที่ดีในการ
  • การประมวลผล URL: บทนี้พูดคุยกันในพื้นที่อื่นให้คลิกที่นี่เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ URL จัดการภาษา Java

การเขียนโปรแกรมซ็อกเก็ต

ซ็อกเก็ตใช้ TCP ให้เป็นกลไกการสื่อสารระหว่างคอมพิวเตอร์สองเครื่อง โปรแกรมไคลเอนต์สร้างซ็อกเก็ตและพยายามที่จะเชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์

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

ระดับ java.net.Socket หมายถึงซ็อกเก็ตและให้ระดับ java.net.ServerSocket ฟังสำหรับโปรแกรมเซิร์ฟเวอร์ของลูกค้าและสร้างกลไกในการเชื่อมต่อกับพวกเขา

มันเกิดขึ้นเมื่อการเชื่อมต่อ TCP โดยใช้ขั้นตอนต่อไปนี้เพื่อสร้างซ็อกเก็ตระหว่างคอมพิวเตอร์สองเครื่อง:

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

หลังจากที่การเชื่อมต่อจะจัดตั้งขึ้นโดยใช้การ / O กระแสผมในระหว่างการสื่อสาร แต่ละซ็อกเก็ตที่มีการป้อนข้อมูลและกระแสกระแสออก การป้อนข้อมูลไคลเอ็นต์กระแสออกสตรีมไปยังเซิร์ฟเวอร์, สตรีมใส่ของลูกค้าเพื่อกระแสออกเซิร์ฟเวอร์

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


วิธีการเรียน ServerSocket

การใช้งานเซิร์ฟเวอร์โดยใช้คลาส 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
ปิดซ็อกเก็ตนี้

วิธีการเรียน InetAddress

ชั้นนี้แสดงให้เห็นถึง 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!