java學習筆記(十五)java網路編程

來源:互聯網
上載者:User

標籤:

OSI模型分為七層(從下到上):物理層、資料連結層、網路層、傳輸層、會話層、展示層、應用程式層。

不同主機之間的相同層次稱為對等層。對等層之間互相通訊需要遵守一定的規則,稱之為協議,我們將某個主機上啟動並執行某種協議的集合稱為協議棧。主機正是利用這個協議棧來接收和發送資料的。

TCP/IP模型:網路介面層、網路互連層、傳輸層、應用程式層。

在網路編程中需要注意的問題包括:

1.是如何找到網路上的主機上的要進行通訊的程式;

2.是找到了主機上的程式後如何傳輸資料。

連接埠號碼:是一組16位的無符號位元,每個連接埠號碼的範圍是1到65535(0被保留)。

TCP協議代表傳輸控制通訊協定,允許兩個應用程式之間的進行可靠的通訊;

UDP協議代表使用者報文協議,是一種非連線協定,允許兩個應用程式之間進行不可靠的通訊。提供了在應用程式之間發送稱為資料報的協議。

Socket通訊端:Unix系統推出了一種應用程式訪問通訊協定的作業系統調用,是一種抽象層,應用程式通過它來發送和接收資料。

不同類型的Socket與不同類型的底層協議族以及同一協議族中的不同協議棧相關聯。

InetAddress類代表IP地址,例:

import java.net.InetAddress;public class InetAddressTest {        public static void main(String[] args) throws Exception {       InetAddress ip = InetAddress.getLocalHost();       System.out.println(ip);       InetAddress ip = InetAddress.getByName("80YMEKCC96RXAOB");       System.out.println(ip);       InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");      for (InetAddress inetAddress : allByName) {            System.out.println(inetAddress);       }             byte[] ip = {(byte)192, (byte)168, 1, 52};             InetAddress address = InetAddress.getByAddress("www.baidu.com", ip);             System.out.println(address);      }}

  

使用通訊端建立TCP串連:

1.伺服器初始化一個ServerSocket對象,指示通訊將要發生在哪個連接埠號碼上。

2.伺服器調用ServerSocket類的accept()方法。該方法會一直等待,直到一個用戶端串連到伺服器上的指定連接埠。

3.在伺服器等待的同時,用戶端執行個體化一個Socket對象,指定要已連線的服務器名和連接埠號碼。

4.Socket類的構造器試圖將用戶端串連到指定的伺服器和連接埠號碼。

5.在伺服器端,accept()方法返回一個將要串連到用戶端通訊端的伺服器新通訊端的引用。

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;/*** 伺服器端* * @author Administrator**/public class Server {     public static void main(String[] args) throws IOException {           // 建立ServerSocket對象,指定監聽連接埠           ServerSocket server = new ServerSocket(30001);           // 設定逾時時間           server.setSoTimeout(10000);           // 等待用戶端串連           Socket socket = server.accept();            /* 處理用戶端資料 */           // 從用戶端讀資料           BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));           char[] ch = new char[100];            int len = reader.read(ch);            System.out.println("從用戶端接收到的資訊:");            // while (-1 != (len = reader.read(ch))) {            System.out.print(new String(ch, 0, len));            // }           // 向用戶端寫資料            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));            writer.write("你好用戶端,我已經接收到你的資訊了");            writer.flush();              // 釋放資源            writer.close();             reader.close();             socket.close();             server.close();        }}

  

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;/*** 用戶端 請求--響應* * @author Administrator**/public class Client {        public static void main(String[] args) throws IOException {              // 建立用戶端Socket向伺服器發起串連請求             Socket socket = new Socket("192.168.1.200", 30001);             /* 利用已建立的socket建立輸入輸出資料流,處理與伺服器端的串連 */             // 向伺服器寫入資料          BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(           socket.getOutputStream()));           writer.write("你好伺服器!!!");            writer.flush();          // 從伺服器讀資料          BufferedReader reader = new BufferedReader(new  InputStreamReader(socket.getInputStream()));           char[] ch = new char[100];           int len = reader.read(ch);           System.out.println("從伺服器端接收到的資訊:");            // while (-1 != (len = reader.read(ch))) {            System.out.print(new String(ch, 0, len));           // }         // 釋放資源          reader.close();          writer.close();           socket.close();        }}

  

 

UDP通訊端編程

資料報包的寄件者和接受者都使用java.net.DatagramSocket類分別發送和接收包。

接收報文包:

1.建立一個足夠大的位元組數組,用於儲存要接收的包的資料;

2.使用該位元組數組執行個體化一個DatagramPacket對象;

3.DatagramSocket被執行個體化,它被指定該通訊端要綁定到的本地主機上的一個連接埠;

4.調用DatagramSocket類的receive()方法,將DatagramPacket對象傳入該方法。這將導致執行線程阻塞,直到接收到一個資料報包或者發生了逾時。

import java.net.*;
import java.io.*; 

public class PacketReceiver{

     public static void main(String[] args) {            try{                   byte[] buffer = new byte [1024];                   DatagramOacket packet = new DatagramPacket(buffer,buffer.length);                   DatagramSocket socket = new DatagramSocket(5002);                   Syatem.out.println("正在等待一個包...");                   socket.receive(packet);                   System.out.println("剛從" + packet.getSocketAddress() + "接收到包");                   buffer = packet.getData();                   System.out.println("new String(buffer)");            } catch(IOException e){                    e.printStackTrace();            }     } }

發送報文包

1.建立一個足夠大的位元組數組,用於儲存要發送的包資料,用該資料填充數組;

2.建立一個新的DatagramPacket對象,用於儲存上面的位元組數組,以及伺服器名和接受者的連接埠號碼;

3.DatagramSocket被執行個體化,它被指定通訊端要綁定到本地主機的哪個連接埠;

4.DatagramSocket類的send()方法被調用,傳入DatagramPacket對象。

import java.net.*;import java.io.*;public class PacketSender{       public static void main(String [] args){                 try{                       String data = "剛收到資料包";                       byte[] buffer = data.getBytes();                       DatagramPacket packet = new DatagramPacket(buffer,buffer.length,new InetSocketAddress("localhost",5002));                       DatagramSocket socket = new DatagramSocket(5003);                       System.out.println("正在發送一個包...");                       Socket.send(packet);                 } catch(IOException e){                       e.printStackTrace();                 }        }}

  

 

 

java學習筆記(十五)java網路編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.