ネットワークプログラミングの知識の概要

ネットワークプログラミング

1.概要

コンピュータネットワーク:

コンピュータネットワークは、を指す地理有する複数の位置の異なる独立した機能をコンピュータ、通信回線を介して接続され、周辺機器を、ネットワーク・オペレーティング・システムネットワーク管理ソフトウェア、およびネットワーク通信プロトコルを達成するために、管理と連携の下でリソースの共有と情報をコンピュータシステムの配信。

ネットワークプログラミングの目的:

無制限のラジオ局、情報交換、データ交換、通信の普及......

私は、所望の効果を達成するために欲しいもの:

  1. 正確なネットワークを見つける方法上のホストのIPアドレス:このコンピュータ上のリソースへのポート、ナビゲート
  2. 私は、データを転送する方法、ホストを見つけましたか?

コンセプトB / SとC /。

javaweb:WebプログラミングのB / S

ネットワークプログラミング:TCP / IP C / S

図2に示すように、通信ネットワークの要素

通信ネットワークを実現するには?

双方のアドレス間の通信:

  • IP:ポート

ルール:ネットワーク通信プロトコル

TCP / IP参照モデル:

要約:

  1. 二つの主要な問題でネットワークプログラミング:
    • どのように正確な位置決め一つまたは複数のホストへのネットワーク上の
    • ホストとの通信方法を見つけた後
  2. ネットワークプログラミング要素:
    • IPポート番号とIP
    • ネットワーク通信プロトコルUDP、TCP
  3. すべてがオブジェクトです:
    • Javaでネットワーク関連のクラスであり通信する必要があります
    • いいえクラスは、独自に定義するために関連する必要はありません

3、IP

IPアドレス:InetAdress

  • のみ、ネットワーク上のコンピュータを検索します

  • 127.0.0.1:ローカルアドレス、すなわちローカルホスト

  • 分類のIPアドレス

    • IPv4の/ IPv6の

      • IPV4:4バイト。北米で百万42については、2011年にアジアで300億400万ドルを占め、最大使用されています

      • IPV6:12ビット。8符号なし整数、例えば

        1111:2222:3333:4444:5555:6666:aaaa:cccc
    • 公衆ネットワーク(インターネット)とプライベート(ローカル・エリア・ネットワーク)

      • ABCDクラスアドレス
      • 特に、組織内で使用するための192.1688.xx.xx、
  • ドメイン名:メモリIP

    • IP:www.jd.com(自己購入)

テストコード:

package pers.mobian.tcpip;

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

public class TestMyip {
    public static void main(String[] args) throws UnknownHostException {
        //查询本机地址
        InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
        InetAddress inetAddress2 = InetAddress.getByName("localhost");
        InetAddress inetAddress3 = InetAddress.getLocalHost();
        System.out.println(inetAddress1);
        System.out.println(inetAddress2);
        System.out.println(inetAddress3);

        //查询网络ip地址
        InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
        System.out.println(inetAddress4);

        //常用的方法
        System.out.println(inetAddress4.getCanonicalHostName());//规范的名字
        System.out.println(inetAddress4.getHostAddress());//ip
        System.out.println(inetAddress4.getHostName());//域名或者自己电脑的名字

    }
}

結果:

/127.0.0.1
localhost/127.0.0.1
DESKTOP-EGA979M/192.168.253.1
www.baidu.com/183.232.231.174
183.232.231.174
183.232.231.174
www.baidu.com

4、ポート

ポートプロセスは、コンピュータ上のプログラムを表し

  • ポートは区別するために別のソフトウェアを使用していました

  • 港所定の範囲:0から65535

  • TCPとUDPは、それぞれ65,535占め、それはコンピュータのポートの合計数は65535 * 2

  • ポートの分類

    • 公共のポート0〜1023

      • HTTP:80
      • HTTPS:443
      • FTP:21
      • telnet:23
    • プログラムポートレジスタ:49151から1024、またはユーザプログラムを割り当てます

      • Tomcatの:8080
      • MySQLの:3306
      • オラクル:1521
    • ダイナミックプライベート:49152から65535

      netstat -ano //查看所有的端口
      netstat -ano |findstr “端口号” //查看指定的端口号
      tasklist|findstr "端口号"  //查看指定端口号的进程 

テストコード:

package pers.mobian.socket;

import java.net.InetSocketAddress;

public class TestSocket02 {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost",8080);

        System.out.println(inetSocketAddress);
        System.out.println(inetSocketAddress2);

        System.out.println(inetSocketAddress.getAddress());//获取地址
        System.out.println(inetSocketAddress.getHostName());//获取主机名字
        System.out.println(inetSocketAddress.getPort());//获取端口

    }
}

結果:

/127.0.0.1:8080
localhost/127.0.0.1:8080
/127.0.0.1
127.0.0.1
8080

図5に示すように、通信プロトコル

ネットワーク通信プロトコル:レート、伝送レート、符号構造、伝送制御......

TCP / IPプロトコルスイートは:プロトコルのセットです

  • TCP:ユーザー転送プロトコル
  • UDP:ユーザデータグラムプロトコル
  • IP:インターネットプロトコル

TCPとUDPの比較:

TCP:コール

  • 安定した接続

  • スリーウェイハンドシェイク、4を振っ

    //最少需要三次,保证稳定连接!<连接>
    A:你瞅啥?
    B:瞅你咋地?
    A:干一场
    
    
    //四次挥手 <断开>
    A:我要走了
    B:你真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了
  • クライアント、サーバー

  • 転送が完了すると、接続を解除し、非効率性

UDP:テキストメッセージ

  • 接続されていません、不安定
  • クライアント、サーバー:明確な境界線
  • または準備なしで、あなたはあなたにそれを送ることができます
  • DDOS:フラッド攻撃(情報、ポートの輻輳、飽和攻撃を大量に送信します)

6、TCP

1.テキスト転送

クライアントのテストコード:

package pers.mobian.socket;

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

//客户端
public class TestClientSocket {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        try {
            //1、要知道服务器得地址、端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2、创建一个socket连接
            socket = new Socket(serverIP, port);
            //3、发送IO流信息
            os = socket.getOutputStream();
            os.write("你好,默辨".getBytes());


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            
            //关闭资源,对关闭得资源进行一个判定,如果没有开启则不需要关闭
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

サーバーのテストコード:

package pers.mobian.socket;

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

//服务器端
public class TestServersSocket {
    public static void main(String[] args) throws Exception {
        //1、给自己新建一个端口号
        ServerSocket serverSocket = new ServerSocket(9999);
        //2、等待客户端进行连接
        Socket socket = serverSocket.accept();
        //3、读取客户端的消息
        InputStream inputStream = socket.getInputStream();

        //4、管道流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer))!= -1){
            baos.write(buffer,0,len);
        }
        System.out.println(baos.toString());

        //5、关闭资源(后开先关)
        baos.close();
        inputStream.close();
        socket.close();
        serverSocket.close();

    }
}

結果:

//服务器端显示
你好,默辨

2.ファイルのアップロード

テストコード:

//服务器
package pers.mobian.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServersSocket2 {
    public static void main(String[] args) throws Exception {
        //1、创建服务
        ServerSocket serverSocket = new ServerSocket(9999);
        //2、监听客户端得连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待
        //3、获取输入流
        InputStream is = socket.getInputStream();
        //4、文件输出
        FileOutputStream fos = new FileOutputStream(new File("E:\\ideaWorkSpace\\pan\\day14_socket_01\\33.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer,0,len);
        }

        //5、通知客户端,我接受完毕了
        OutputStream os = socket.getOutputStream();
        os.write("我接受完了".getBytes());
        //6、关闭资源
        fos.close();
        is.close();
        socket.close();

    }
}
//客户端
package pers.mobian.socket;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TestClientSocket2 {
    public static void main(String[] args) throws Exception {
        //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("E:\\ideaWorkSpace\\pan\\day14_socket_01\\3.jpg"));
        //4、写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1){
            os.write(buffer,0,len);
        }

        //5、确定服务器接受完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2=inputStream.read(buffer2))!=-1){
            baos.write(buffer2,0,len2);
        }
        System.out.println(baos.toString());

        //6、关闭资源
        fis.close();
        os.close();
        os.close();
        socket.close();
    }
}

7、Tomcatの

サーバー;

  • カスタムS
  • TomcatサーバーS

クライアント:

  • カスタムC
  • ブラウザB

8、UDP

UDPは、サーバ側とクライアントの概念を持っていない、唯一の送信者と受信者は、コンセプトを持っています

1.ケースI:簡単なメッセージ

最後のテストコードを送信します:

package pers.mobian.socket;

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

//发送端
public class TestClientSocket3 {
    public static void main(String[] args) throws Exception {
        //1、建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        //2、建包
        String msg = "你好";
        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 pers.mobian.socket;

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

//接收端
public class TestServersSocket3 {
    public static void main(String[] args) throws Exception {
        //1、设置开放端口
        DatagramSocket socket = new DatagramSocket(9090);

        //2、准备接受数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        socket.receive(packet);

        System.out.println(packet.getAddress().getHostAddress());
        //3、将需要打印得数据进行格式转换
        System.out.println(new String(packet.getData(),0,packet.getLength()));

        socket.close();

    }
}

2.ケースI:簡単なチャットを実現

最後のテストコードを送信します:

package pers.mobian.udp;

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

public class TestUDPSender {
    public static void main(String[] args) throws Exception {
        //设置开放端口
        DatagramSocket socket = new DatagramSocket(8888);

        while (true) {
            //1、读取控制台的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            //2、将控制台的一行语句赋值给data
            String data = reader.readLine();
            //3、将data包装成数据
            byte[] datas = data.getBytes();
            //4、将数据打包成package
            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
            //5、发送信息
            socket.send(packet);

            //判定的数据输入应为最初的输入数据,而非包装后的数据
            if(data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

テストコード受信側:

package pers.mobian.udp;

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

public class TestUDPReceiver {
    public static void main(String[] args) throws Exception {
        //设置开放端口
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {

            //1、准备接受包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);
            //2、打印接受到的数据
            System.out.println(new String(packet.getData(),0,packet.getLength()));
            //设置断开连接
            byte[] data = packet.getData();
            String receiverData = new String(data, 0, data.length);

            if (receiverData.equals("bye")) {
                break;
            }
        }
        socket.close();
    }
}

マルチスレッドチャットを使用して3

送信者のテストコード:

package pers.mobian.udp;

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

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

    public TestUDPSender2(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            //设置开放端口
            socket = new DatagramSocket(fromPort);
            //1、读取控制台的数据
            reader = new BufferedReader(new InputStreamReader(System.in));


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                //2、将控制台的一行语句赋值给data
                String data = reader.readLine();
                //3、将data包装成数据
                byte[] datas = data.getBytes();
                //4、将数据打包成package
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));
                //5、发送信息
                socket.send(packet);

                //判定的数据输入应为最初的输入数据,而非包装后的数据
                if (data.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

レシーバ・テスト・コード:

package pers.mobian.udp;

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

public class TestUDPReceiver2 implements Runnable {

    DatagramSocket socket = null;
    private int port;
    private String msgFrom;

    public TestUDPReceiver2(int port, String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;

        try {
            //设置开放端口
            socket = new DatagramSocket(port);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(88888);
        }
    }

    @Override
    public void run() {

        while (true) {

                //1、准备接受包裹
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            try {
                socket.receive(packet);//阻塞式接受
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("111");
            }
            //2、打印接受到的数据

                //设置断开连接
                byte[] data = packet.getData();
                String receiverData = new String(data, 0, data.length);

                System.out.println(msgFrom + " : " + receiverData);
                if (receiverData.equals("bye")) {
                    break;
                }
        }
        socket.close();
    }
}

テストコード:

package pers.mobian.udp;

public class TestUDPReceiver2Main1 {
    public static void main(String[] args) {
        new Thread(new TestUDPSender2(7777,"localhost",9999)).start();
        new Thread(new TestUDPReceiver2(8888,"老师")).start();
    }
}

テストコード:

package pers.mobian.udp;

public class TestUDPReceiver2Main2 {
    public static void main(String[] args) {
        new Thread(new TestUDPSender2(5555,"localhost",8888)).start();
        new Thread(new TestUDPReceiver2(9999,"学生")).start();
    }
}

結果:

//Main1
ni
学生 : jj
 
//Main2
老师 : ni                                                                                 
jj

クラス4のURL

使用のURLカテゴリ:

テストコード:

package pers.mobian.udp;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/mobian/index.jsp?username=mobian&password=123");
        System.out.println(url.getProtocol());//使用的协议
        System.out.println(url.getHost());//主机IP
        System.out.println(url.getPort());//使用的端口号
        System.out.println(url.getPath());//文件路径
        System.out.println(url.getFile());//文件的全路径
        System.out.println(url.getQuery());//参数列表
    }
}

結果:

http
localhost
8080
/mobian/index.jsp
/mobian/index.jsp?username=mobian&password=123
username=mobian&password=123

テストコードをダウンロードするには、パスのURLのネットワーク・リソースの使用:

package pers.mobian.udp;


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

public class TestDownURL {
    public static void main(String[] args) throws IOException {
        //1、请求下载的地址
        URL url = new URL("https://m701.music.126.net/20200121172558/e95dfac9e276e6d145b5f2638a036c2b/jdyyaac/035e/565f/055f/447bb91679a53ba93bc2258f72f57669.m4a");

        //2、连接到这个资源HTTP
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("77.m4a");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}

おすすめ

転載: www.cnblogs.com/mobian/p/12222703.html
おすすめ