網絡編程入門

1.1 概述

計算機網絡:地理位置不一樣 多臺計算機 鏈接 通訊 共享java

網絡編程的目的:數據交換,通訊編程

如何實現多臺主機之間的數據通訊:瀏覽器

  1. 準肯定位網絡上的一臺主機以及該主機的某個資源(IP:Port)
  2. 傳輸數據?

JavaWeb:網頁編程 B/Sbash

網絡編程:TCP/IP C/S服務器

1.2 網絡通訊的要素

實現網絡通訊須要知道通訊雙方地址(ip、端口號)網絡

規則:網絡通訊協議多線程

TCP/IP參考模型:socket

img

網絡編程專門針對傳輸層(TCP/IP)tcp

1.3 IP

ip地址:InetAddresside

  • 惟必定位一臺網絡上的計算機
  • 127.0.0.1:本機localhost
  • ip地址的分類:

    • ipv4/ipv6

      • ipv4:10.164.120.176 4個字節組成,0~255,42億中30億在北美,亞洲4億,2011年就用盡
      • ipv6:fe80::a1a2:85b0:e7d9:58f1%7 128位,8個無符號整數
    • 公網(互聯網) 私網(局域網)

      • ABCD類地址
      • 192.168.xx.xx 專門給組織內部使用的
  • 域名→記憶IP問題!

1.4 端口

端口表示計算機上的一個程序的進程:

  • 不一樣進程有不一樣的端口號!(不能衝突)用來區分進程!
  • 範圍:0~65535
  • TCP,UDP:65535*2 單個協議下,端口號不能衝突
  • 端口分類

    • 公有端口 0~1023

      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telnet:23
    • 程序註冊端口:1024~49151 分配給用戶或者程序

      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 動態/私有端口:49152~65535

      netstat -ano #查看全部端口
      netstat -ano|findstr "端口號" #查看指定的端口
      tasklist|findstr "端口號" #查看指定端口的進程

1.5 通訊協議

協議:約定

網絡通訊協議:速率,傳輸碼率,代碼結構,傳輸控制......

TCP/IP協議簇

重要:

  • TCP:傳輸控制協議
  • UDP:用戶數據報協議

TCP vs UDP

打電話~TCP

  • 鏈接,穩定
  • 三次握手,四次揮手

    最少須要三次,保證穩定鏈接!
    A:你瞅啥?
    B:瞅你咋地?
    A:幹一場!
    
    A:我要走了
    B:你真的要走了嗎?
    B:你真的真的要走了嗎?
    A:我真的真的要走了!

    img

    img

  • 客戶端、服務端
  • 傳輸完成,釋放鏈接,效率低

發短信~UDP

  • 不鏈接,不穩定
  • 客戶端、服務器:沒有明確的界限
  • 無論有沒有準備好,均可以發給你
  • 導彈
  • DDoS:洪水攻擊(飽和攻擊)

1.6 TCP

聊天

客戶端

  1. 經過Socket鏈接服務器
  2. 發送消息
package tcp;

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

public class Client {
    public static void main(String[] args) {
        InetAddress serverIP = null;
        int port = 0;
        Socket socket = null;
        OutputStream os = null;
        try {
            //1.得知服務器地址
            serverIP = InetAddress.getByName("127.0.0.1");
            port = 9999;
            //2.建立一個socket鏈接
            socket = new Socket(serverIP,port);
            //3.發送消息
            os = socket.getOutputStream();
            os.write("你好".getBytes());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }        
    }
}

服務器端

  1. 創建服務端口
  2. 經過accept等待用戶鏈接
  3. 接收用戶消息
package tcp;

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

public class Server {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        
        try {
            //1.有地址
            serverSocket = new ServerSocket(9999);
            //2.等待客戶端鏈接
            socket = serverSocket.accept();
            //3.讀取客戶端的消息
            is = socket.getInputStream();
            //管道流
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while((len=is.read(buffer))!=-1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //關閉資源
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

文件上傳

服務器端

package tcp;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.omg.CORBA_2_3.portable.OutputStream;

public class Server {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub    
        try {
            //1.建立服務
            ServerSocket serverSocket = new ServerSocket(9999);
            //2.監聽客戶端鏈接
            Socket socket = serverSocket.accept();
            //3.讀取輸入流
            InputStream is = socket.getInputStream();
            //4.文件輸出
            FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            //5.關閉資源
            is.close();
            fos.close();
            socket.close();
            serverSocket.close();                    
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

客戶端

package tcp;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            //1.建立一個socket鏈接
            Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9999);
            //2.建立一個輸出流
            OutputStream os = socket.getOutputStream();
            //3.讀取文件
            FileInputStream fis = new FileInputStream(new File("dog.jpg"));
            //4.寫出文件
            byte[] buffer = new byte[1024];
            int len;
            while((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }
            //5.關閉資源
            fis.close();
            os.close();
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
}

服務端(Tomcat)

客戶端(瀏覽器)

1.7 UDP

發短信:不用鏈接,須要知道對方地址

發送消息

發送端

package udp;

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

//不須要鏈接服務器
public class Client {
    public static void main(String[] args) throws Exception {
    //1.創建一個Socket
    DatagramSocket socket = new DatagramSocket();
    //2.建個包    
    String msg = "Hello!";
    InetAddress localhost = InetAddress.getByName("localhost");
    int port = 9090;
    //數據,數據的長度起始,發送給誰
    DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
    //3.發送包
    socket.send(packet);
    //4.關閉流
    socket.close();
    }
}

接收端

package udp;

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

//仍是要等待客戶端的鏈接!
public class Server {
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //開放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接收數據包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); //接收
        socket.receive(packet);//阻塞接收
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //關閉鏈接
        socket.close();
    }
}

循環發送消息

發送端

package udp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Sender {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //1.創建一個Socket
        DatagramSocket socket = new DatagramSocket(8888);
        //準備數據:控制檯讀取
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            //2.建個包    
            String data = reader.readLine();
            byte[] datas = data.getBytes();        
            //數據,數據的長度起始,發送給誰
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
            //3.發送包
            socket.send(packet);
            if(data.equals("bye")){
                break;
            }
        }    
        //4.關閉流
        socket.close();
    }
}

接收端

package udp;

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

public class Receiver {

    public static void main(String[] args) throws Exception {
        //1.創建一個Socket
        DatagramSocket socket = new DatagramSocket(6666);
        
        while(true){
            //準備接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container,0,container.length);
            socket.receive(packet);//阻塞式接收包裹
            //斷開鏈接 bye
            byte[] data = packet.getData();
            String receiveData = new String(data,0,data.length).trim();
            System.out.println(receiveData);
            if(receiveData.equals("bye")){
                break;
            }            
        }        
        //關閉流
        socket.close();
    }
}

在線諮詢:兩我的既能夠是發送端也能夠是接收端(多線程)

線程TalkSend

package udp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;
    
    private int fromPort;
    private String toIP;
    private int toPort;
    

    public TalkSend(int fromPort, String toIP, int toPort) {
        super();
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true){
            String data;
            try {
                data = reader.readLine();
                byte[] datas = data.getBytes();        
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
                socket.send(packet);
                if(data.equals("bye")){
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }    
        socket.close();
    }
}

線程TalkReceive

package udp;

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

public class TalkReceive implements Runnable{
    DatagramSocket socket = null;
    private int port;
    private String msgFrom;
    
    public TalkReceive(int port,String msgFrom) {
        super();
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void run() {    
        while(true){
            try {
                //準備接收包裹
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0,container.length);
                socket.receive(packet);//阻塞式接收包裹
                //斷開鏈接 bye
                byte[] data = packet.getData();
                String receiveData = new String(data, 0, data.length).trim();
                System.out.println(msgFrom+":"+receiveData);
                if (receiveData.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }            
        }        
        //關閉流
        socket.close();
    }
}

老師TalkTeacher

package udp;

public class TalkTeacher {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"學生")).start();    }
}

學生TalkStudent

package udp;

public class TalkStudent {
    public static void main(String[] args) {
        //開啓兩個線程
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"老師")).start();
    }
}

1.8 URL

統一資源定位符:定位互聯網資源

協議://ip地址:端口/項目名/資源

url下載網絡資源

package url;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLDown {

    public static void main(String[] args) throws Exception {
        //1.下載地址
        URL url = new URL("http://127.0.0.1:8080/zhg/Confidential.txt");
        //2.鏈接這個資源HTTP
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("cfile.txt");
        byte[] buffer = new byte[1024];
        int len;
        while((len=inputStream.read(buffer))!=-1){
            fos.write(buffer, 0, len); 
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}
相關文章
相關標籤/搜索