1. 程式人生 > >TCP、UDP網路通訊

TCP、UDP網路通訊

    IP地址和埠號

埠號是用兩個位元組(16位的二進位制數)表示的,它的取值範圍是0~65535,其中,0~1023之間的埠號用於一些知名的網路服務和應用,

使用者的普通應用程式需要使用1024以上的埠號,從而避免埠號被另外一個應用或服務所佔用。

     InetAddress

常用方法

程式碼演示:

 
1     public static void main(String[] args) throws UnknownHostException {
2         //InetAddress inet=InetAddress.getLocalHost();
3         //主機名+ip地址
4         InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34");
5         System.out.println(inet);
6         String host=inet.getHostName();
7         String ip=inet.getHostAddress();
8         System.out.println(host+"..."+ip);
9     }
 

    

 UDP通訊

  DatagramPacket

   DatagramSocket

 UDP網路程式

 

 程式碼演示:

 
 1 //傳送端
 2 public class UDPSend {
 3     public static void main(String[] args) throws IOException {
 4         //1.打包
 5         //明確資料
 6         byte[] bytes="你好嗎".getBytes();
 7         //明確目的地的IP地址
 8         InetAddress inet=InetAddress.getByName("127.0.0.1");
 9         //裝包
10         DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888);
11         //2.建立快遞公司
12         DatagramSocket ds=new DatagramSocket();
13         //3.傳送
14         ds.send(dp);
15         //4.釋放資源
16         ds.close();
17     }
18 
19 }
   
 1 //接收端
 2 public class UDPReceive {
 3     public static void main(String[] args) throws IOException {
 4         //明確埠號
 5         DatagramSocket ds=new DatagramSocket(8888);
 6         //建立接收資料的位元組陣列
 7         byte[] bytes=new byte[1024];
 8         //建立接收的資料包
 9         DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
10         //接收
11         ds.receive(dp);
12         //獲取接收包上的資料
13         int length=dp.getLength();
14         String ip=dp.getAddress().getHostAddress();
15         int port=dp.getPort();
16         System.out.println("ip地址為:"+ip+"埠號為:"+port+"傳送的內容為:"+new String(bytes,0,length));
17         //釋放資源
18         ds.close();
19     }
20 
21 }
 

   TCP通訊

一個是ServerSocket類,用於表示伺服器端,一個是Socket類,用於表示客戶端。

ServerSocket

   Socket

方法宣告

功能描述

int getPort()

該方法返回一個int型別物件,該物件是Socket物件與伺服器端連線的埠號

InetAddress getLocalAddress()

該方法用於獲取Socket物件繫結的本地IP地址,並將IP地址封裝成InetAddress型別的物件返回

void close()

該方法用於關閉Socket連線,結束本次通訊。在關閉socket之前,應將與socket相關的所有的輸入/輸出流全部關閉,這是因為一個良好的程式應該在執行完畢時釋放所有的資源

InputStream getInputStream()

該方法返回一個InputStream型別的輸入流物件,如果該物件是由伺服器端的Socket返回,就用於讀取客戶端傳送的資料,反之,用於讀取伺服器端傳送的資料

OutputStream getOutputStream()

該方法返回一個OutputStream型別的輸出流物件,如果該物件是由伺服器端的Socket返回,就用於向客戶端傳送資料,反之,用於向伺服器端傳送資料

圖解:

程式碼演示:

 
 1 //傳送端
 2 public class UDPSend {
 3     public static void main(String[] args) throws IOException {
 4         //1.打包
 5         //明確資料
 6         Scanner sc=new Scanner(System.in);
 7         //明確目的地的IP地址
 8         InetAddress inet=InetAddress.getByName("192.168.1.171");
 9         //2.建立快遞公司
10         DatagramSocket ds=new DatagramSocket();
11         while(true){
12             String mes=sc.next();
13             byte[] bytes=mes.getBytes();
14             //裝包
15             DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666);
16             //3.傳送
17             ds.send(dp);
18         }    
19         //4.釋放資源
20         //ds.close();
21         
22     }
   
 1 //接收端
 2 public class UDPReceive {
 3     public static void main(String[] args) throws IOException {
 4         //明確埠號
 5         DatagramSocket ds=new DatagramSocket(8888);
 6         //建立接收資料的位元組陣列
 7         byte[] bytes=new byte[1024];
 8         //建立接收的資料包
 9         while(true){
10             DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
11             //接收
12             ds.receive(dp);
13             //獲取接收包上的資料
14             int length=dp.getLength();//明確傳送的位元組長度
15             String ip=dp.getAddress().getHostAddress();
16             int port=dp.getPort();
17             System.out.println("ip地址為:"+ip+"埠號為:"+port+"傳送的內容為:"
18                                             +new String(bytes,0,length));
19         }
20 }
 

  

 
 1 //伺服器端
 2 public class TCPServer {
 3     public static void main(String[] args) throws IOException {
 4         //建立伺服器套接字
 5         ServerSocket server=new ServerSocket(7777);
 6         //呼叫accept方法與客戶端建立連結
 7         Socket socket=server.accept();
 8         InputStream in=socket.getInputStream();
 9         byte[] bytes=new byte[1024];
10         int len=in.read(bytes);
11         System.out.println(new String(bytes,0,len));
12         //伺服器給客戶端回覆
13         OutputStream out=socket.getOutputStream();
14         out.write("收到!over!".getBytes());
15         
16         server.close();
17     }
   
 1 //客戶端
 2 public class TCPCLient {
 3     public static void main(String[] args) throws IOException {
 4         //1.建立Socket物件,連線伺服器
 5         Socket socket=new Socket("127.0.0.1",7777);
 6         //2.通過客戶端套接字物件Socket物件中的獲取位元組輸出流的方法
 7         OutputStream out=socket.getOutputStream();
 8         //3.將資料寫向伺服器
 9         out.write("伺服器你好".getBytes());
10         //接收伺服器端的回覆
11         InputStream in=socket.getInputStream();
12         byte[] bytes=new byte[1024];
13         int len=in.read(bytes);
14         System.out.println(new String(bytes, 0, len));
15         //釋放資源
16         socket.close();
17     }