1. 程式人生 > >【網絡編程】InetAddress、TCP、UDP

【網絡編程】InetAddress、TCP、UDP

數據包 rgs 類方法 AC 連接失敗 length 端端 pan udp

InetAddress

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 *  表示互聯網中的IP地址
 *    java.net.InetAddress
 *  靜態方法
 *    static InetAddress  getLocalHost()   LocalHost本地主機
 *    返回本地主機,返回值InetAddress對象
 *    
 *    static InetAddress getByName(String hostName)傳遞主機名,獲取IP地址對象
 *    
 *  非靜態方法
 *     String getHoustAddress()獲取主機IP地址
 *     String getHoustName()獲取主機名
 *    
 
*/ public class InetAddressDemo { public static void main(String[] args)throws UnknownHostException { function_1(); } /* * static InetAddress getByName(String hostName)傳遞主機名,獲取IP地址對象 */ public static void function_1()throws UnknownHostException { InetAddress inet
= InetAddress.getByName("www.baidu.com"); System.out.println(inet); } /* * static InetAddress getLocalHost() LocalHost本地主機 */ public static void function() throws UnknownHostException{ InetAddress inet = InetAddress.getLocalHost(); //輸出結果就是主機名,和 IP地址
System.out.println(inet.toString()); String ip = inet.getHostAddress(); String name = inet.getHostName(); System.out.println(ip+" "+name); /*String host = inet.toString(); String[] str = host.split("/"); for(String s : str){ System.out.println(s); }*/ } }


UDP發送端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 *  實現UDP協議的發送端:
 *    實現封裝數據的類 java.net.DatagramPacket  將你的數據包裝
 *    實現數據傳輸的類 java.net.DatagramSocket  將數據包發出去
 *    
 *  實現步驟:
 *    1. 創建DatagramPacket對象,封裝數據, 接收的地址和端口
 *    2. 創建DatagramSocket
 *    3. 調用DatagramSocket類方法send,發送數據包
 *    4. 關閉資源
 *    
 *    DatagramPacket構造方法:
 *      DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
 *      
 *    DatagramSocket構造方法:
 *      DatagramSocket()空參數
 *      方法: send(DatagramPacket d)
 *      
 */
public class UDPSend {
    public static void main(String[] args) throws IOException{
        //創建數據包對象,封裝要發送的數據,接收端IP,端口
        byte[] date = "你好UDP".getBytes();
        //創建InetAddress對象,封裝自己的IP地址
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000);
        //創建DatagramSocket對象,數據包的發送和接收對象
        DatagramSocket ds = new DatagramSocket();
        //調用ds對象的方法send,發送數據包
        ds.send(dp);
        //關閉資源
        ds.close();
    }
}

UDP接收端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 *  實現UDP接收端
 *    實現封裝數據包 java.net.DatagramPacket 將數據接包
 *    實現輸出傳輸     java.net.DatagramSocket 接收數據包
 *    
 *  實現步驟:
 *     1. 創建DatagramSocket對象,綁定端口號
 *         要和發送端端口號一致
 *     2. 創建字節數組,接收發來的數據
 *     3. 創建數據包對象DatagramPacket
 *     4. 調用DatagramSocket對象方法
 *        receive(DatagramPacket dp)接收數據,數據放在數據包中
 *     5. 拆包
 *          發送的IP地址
 *            數據包對象DatagramPacket方法getAddress()獲取的是發送端的IP地址對象
 *            返回值是InetAddress對象
 *          接收到的字節個數
 *            數據包對象DatagramPacket方法 getLength()
 *          發送方的端口號
 *            數據包對象DatagramPacket方法 getPort()發送端口
 *     6. 關閉資源
 */
public class UDPReceive {
    public static void main(String[] args)throws IOException {
        //創建數據包傳輸對象DatagramSocket 綁定端口號
        DatagramSocket ds = new DatagramSocket(6000);
        //創建字節數組
        byte[] data = new byte[1024];
        //創建數據包對象,傳遞字節數組
        DatagramPacket dp = new DatagramPacket(data, data.length);
        //調用ds對象的方法receive傳遞數據包
        ds.receive(dp);
        
        //獲取發送端的IP地址對象
        String ip=dp.getAddress().getHostAddress();
        
        //獲取發送的端口號
        int port = dp.getPort();
        
        //獲取接收到的字節個數
        int length = dp.getLength();
        System.out.println(new String(data,0,length)+"..."+ip+":"+port);
        ds.close();
    }
}

拓展:用UDP實現鍵盤輸入的聊天

UDP發送端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/*
 * 實現UDP發送,鍵盤輸入的形式
 * 輸入完畢,發送給接收端      
 */
public class UDPSend {
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        DatagramSocket ds = new DatagramSocket();
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        while(true){
        String message = sc.nextLine();
        /*if("886".equals(message)){
            break;
        }*/
        byte[] date = message.getBytes();
        DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000);
        ds.send(dp);
        }
    //    ds.close();
    }
}

UDP接收端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 *  實現UDP接收端
 *  永不停歇的接收端
 */
public class UDPReceive {
    public static void main(String[] args)throws IOException {
        //創建數據包傳輸對象DatagramSocket 綁定端口號
        DatagramSocket ds = new DatagramSocket(6000);
        //創建字節數組
        byte[] data = new byte[1024];
        //創建數據包對象,傳遞字節數組
        while(true){
        DatagramPacket dp = new DatagramPacket(data, data.length);
        //調用ds對象的方法receive傳遞數據包
        ds.receive(dp);
        
        //獲取發送端的IP地址對象
        String ip=dp.getAddress().getHostAddress();
        
        //獲取發送的端口號
        int port = dp.getPort();
        
        //獲取接收到的字節個數
        int length = dp.getLength();
        System.out.println(new String(data,0,length)+"..."+ip+":"+port);
        }
        //ds.close();
    }
}


TCP客戶端(發送端)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
 *  實現TCP客戶端,連接到服務器
 *  和服務器實現數據交換
 *  實現TCP客戶端程序的類 java.net.Socket
 *  
 *  構造方法:
 *      Socket(String host, int port)  傳遞服務器IP和端口號
 *      註意:構造方法只要運行,就會和服務器進行連接,連接失敗,拋出異常
 *      
 *    OutputStream  getOutputStream() 返回套接字的輸出流
 *      作用: 將數據輸出,輸出到服務器
 *      
 *    InputStream getInputStream() 返回套接字的輸入流
 *      作用: 從服務器端讀取數據
 *      
 *    客戶端服務器數據交換,必須使用套接字對象Socket中的獲取的IO流,自己new流,不行
 */
public class TCPClient {
    public static void main(String[] args)throws IOException {
        //創建Socket對象,連接服務器
        Socket socket = new Socket("127.0.0.1", 8888);
        //通過客戶端的套接字對象Socket方法,獲取字節輸出流,將數據寫向服務器
        OutputStream out = socket.getOutputStream();
        out.write("服務器OK".getBytes());
        
        //讀取服務器發回的數據,使用socket套接字對象中的字節輸入流
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));
        
        socket.close();
    }
}

TCP服務器(接收端)

package cn.itcast.demo3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
 *  實現TCP服務器程序
 *  表示服務器程序的類 java.net.ServerSocket
 *  構造方法:
 *    ServerSocket(int port) 傳遞端口號
 *  
 *  很重要的事情: 必須要獲得客戶端的套接字對象Socket
 *    Socket  accept()
 */
public class TCPServer {
    public static void main(String[] args) throws IOException{
        ServerSocket server = new ServerSocket(8888);
        //調用服務器套接字對象中的方法accept() 獲取客戶端套接字對象
        Socket socket = server.accept();
        //通過客戶端套接字對象,socket獲取字節輸入流,讀取的是客戶端發送來的數據
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));
        
        //服務器向客戶端回數據,字節輸出流,通過客戶端套接字對象獲取字節輸出流
        OutputStream out = socket.getOutputStream();
        out.write("收到,謝謝".getBytes());
        
        socket.close();
        server.close();
    }
}

【網絡編程】InetAddress、TCP、UDP