java第二十一天(網絡編程)

91.網絡編程java

(1)網絡模型編程

OSI模型:七層協議安全

TCP/IP模型:經常使用服務器

(2)網絡通訊三要素網絡

第一:ip地址socket

使用dos命令查看ip地址,ipconfig.net

ip最大值是233.255.255.255,可設置區間1.0.0.0-233.255.255.2553d

用dos命令查看主機是否互通的,ping 域名\ip地址server

迴環地址:127.0.0.1對象

 第二 端口號,用於標識進程的邏輯地址,不一樣的進程端口不一樣

dos命令查看端口號,netstat-ano

第三,協議

常見的有兩種協議:

TCP和UDP協議

UDP:

將數據源和目的地封裝到數據包中,不須要創建鏈接。

每一個數據包的大小限制在64k。

由於不創建鏈接,因此安全性差,速度快。

TCP:

創建鏈接造成傳輸數據的通道,而後再傳輸數據,經過三次的握手。

安全性高,效率低。 

(3)InetAdress類

單例模式(沒有構造器),不能直接new,根據靜態方法來返回該對象

getByName(String name)根據已知的給定的主機名肯定主機的IP地址

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

public class InetAdressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //經過靜態方法返回InetAddress的對象
        InetAddress localHost = InetAddress.getLocalHost();
        //得到IP地址的字符串
        String hostAddress = localHost.getHostAddress();
        System.out.println("IP地址是"+hostAddress);
        //得到IP地址中的主機的名字
        String hostName = localHost.getHostName();
        System.out.println("主機名是"+hostName);
        //根據給定的主機名返回該對象
        InetAddress byName = InetAddress.getByName("C64-20190318DQZ");
        String hostAddress1 = byName.getHostAddress();
        String hostName1 = byName.getHostName();
        System.out.println("IP地址是"+hostAddress1);
        System.out.println("IP地址是"+hostName1);
    }
}

(4)UDP通訊

分兩個部分

服務端步驟

第一步:建立socket服務對象(須要作關閉)

DatagramSocket(int port)

第二步:接收數據,用DataGrampacket表示數據包

DataGramPacket(byte[] buf,int length)

第三步:解析數據包

接收數據 receive(),程序到此阻塞有數據接收則繼續

得到客戶端的ip,getAdress();

得到數據 getData();

得到長度 getLength();

import java.net.*;

public class UdpServer {
    public static void main(String[] args){
        //服務器端步驟一,建立Socket服務對象(須要作關閉)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket(10000);
            //步驟二,建立接收數據包
            byte[] buf=new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            System.out.println("服務端開始啓動,等待客戶端發送內容");
            //步驟三,解析數據
            socket.receive(datagramPacket);//程序到此阻塞,有數據傳入繼續
            //得到客戶端的ip
            InetAddress inetAddress = datagramPacket.getAddress();
            //得到數據
            byte[] data = datagramPacket.getData();
            int length=datagramPacket.getLength();
            String s=new String(data,0,length);
            System.out.println(inetAddress.getHostAddress()+"發送的內容是"+s+"      長度是"+length);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}

客戶端步驟:

第一步:建立DatagramSocket不用給端口(需關閉)

第二步:建立數據包

DatagramPacket(byte[] buf,int length,InetAddress address,int port)

第三步:發送數據包

send();

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

public class UdpClient {
    public static void main(String[] args){
        //服務器端步驟一,建立Socket服務對象(須要作關閉,不用給端口)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket();
            //步驟二,建立數據包
            String s="愛我中華!";
            byte[] buf=s.getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
            //步驟三,發送數據包
            socket.send(datagramPacket);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}

先運行服務端再運行客戶端,服務端就顯示出來了

拓展:

注意字符字節的轉換,從控制檯輸入的東西是以字節流方式存在的,讓程序實現從控制檯輸入數據接收

用BufferReader,不斷接收使用While(true)

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

public class UdpServer {
    public static void main(String[] args){
        //服務器端步驟一,建立Socket服務對象(須要作關閉)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket(10000);
            //步驟二,建立接收數據包
            byte[] buf=new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            System.out.println("服務端開始啓動,等待客戶端發送內容");
            //步驟三,解析數據
            while(true){
                socket.receive(datagramPacket);//程序到此阻塞,有數據傳入繼續
                //得到客戶端的ip
                InetAddress inetAddress = datagramPacket.getAddress();
                //得到數據
                byte[] data = datagramPacket.getData();
                int length=datagramPacket.getLength();
                String s=new String(data,0,length);
                System.out.println(inetAddress.getHostAddress()+"發送的內容是:     "+s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
    public static void main(String[] args){
        //服務器端步驟一,建立Socket服務對象(須要作關閉,不用給端口)
        DatagramSocket socket = null;
        BufferedReader reader=null;
        try {
            socket=new DatagramSocket();
//注意從控制檯輸入的內容是以字節流的方式存儲的,因此讀取的是字節流,爲了更方便顯示把字節流轉換成字符流
            reader=new BufferedReader(new InputStreamReader(System.in));
            //步驟二,建立數據包
            String s=null;
            //使其不斷接收使用While(true)
            while((s=reader.readLine())!=null){
                //設置退出循環的標識
                if("exit".equals(s)){
                    break;
                }else{
                    byte[] buf=s.getBytes();
                    DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
                    //步驟三,發送數據包
                    socket.send(datagramPacket);
                }
            }
            System.out.println("退出客戶端");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }
            try {
                if(reader!=null){
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

TCP通訊

服務端

第一步:建立Socket對象指定端口(需關閉)

ServerSocket(int port);

第二步:監聽接收客戶端對象Socket(也須要關閉)

Socket accept();

第三步:得到流對象

getInputStream();                BfferedReader

第四步:讀取數據

第五步:得到客戶端的IP地址

getHostAdress();

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        //步驟一,建立服務端ServerSocket對象,指定端口(須要關閉)
        ServerSocket serverSocket = null;
        BufferedReader reader=null;
        //步驟二,建立監聽接收客戶端對象Socket
        Socket socket=null;
        try {
            serverSocket= new ServerSocket(9999);
            socket=serverSocket.accept();
            //步驟三,得到流對象,注意字節流字符流的轉換
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //步驟四,讀取數據
            String s = reader.readLine();
            //步驟五,得到客戶端的ip地址
            InetAddress inetAddress = socket.getInetAddress();
            System.out.println(inetAddress.getHostAddress()+"發送的內容是:  "+s);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(serverSocket!=null){
                    serverSocket.close();
                }
                if(socket!=null){
                    socket.close();
                }
                if(reader!=null){
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

客戶端

第一步:建立請求的Socket(需關閉)

Socket(String host,int port)

第二步:得到輸出流

getOutputStream();                BufferedWriter

第三步:寫數據

第四步:釋放資源

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        //步驟一,建立Socket對象,指定ip和端口(須要關閉)
        Socket socket=null;
        BufferedWriter writer=null;
        try {
            socket=new Socket("192.168.1.11",9999);
            //步驟三,得到輸出流對象,注意字節流字符流的轉換
            writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //步驟四,寫數據
            writer.write("愛我中華");
            writer.newLine();//換行
            writer.flush();//刷新
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(socket!=null){
                    socket.close();
                }
                if(writer!=null){
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

拓展:實現TCP從控制檯輸入數據

加一個BufferReader,用While(true)搭配if...breakv          

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer1 {
    public static void main(String[] args) {
        //步驟一,建立服務端ServerSocket對象,指定端口(須要關閉)
        ServerSocket serverSocket = null;
        BufferedReader reader=null;
        //步驟二,建立監聽接收客戶端對象Socket
        Socket socket=null;
        try {
            serverSocket= new ServerSocket(9999);

            socket=serverSocket.accept();
            //步驟三,得到流對象,注意字節流字符流的轉換
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s=null;
            //步驟四,讀取數據
            while (true){
                if((s=reader.readLine())==null){
                    break;
                }else{
                    //步驟五,得到客戶端的ip地址
                    InetAddress inetAddress = socket.getInetAddress();
                    System.out.println(inetAddress.getHostAddress()+"發送的內容是:  "+s);

                }
            }
            System.out.println("退出服務端");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(serverSocket!=null){
                    serverSocket.close();
                }
                if(socket!=null){
                    socket.close();
                }
                if(reader!=null){
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient1 {
    public static void main(String[] args) {
        //步驟一,建立Socket對象,指定ip和端口(須要關閉)
        Socket socket=null;
        BufferedWriter writer=null;
        BufferedReader reader=null;
        try {
            socket=new Socket("192.168.1.11",9999);
            String s =null;
            reader=new BufferedReader(new InputStreamReader(System.in));
            //步驟三,得到輸出流對象,注意字節流字符流的轉換
            writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            while ((s=reader.readLine())!=null){
                if("exit".equals(s)){
                    break;
                }else{
                    //步驟四,寫數據
                    writer.write(s);
                    writer.newLine();//換行
                    writer.flush();//刷新
                }
            }
            System.out.println("退出客戶端程序");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(socket!=null){
                    socket.close();
                }
                if(writer!=null){
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

相關文章
相關標籤/搜索