Java学習ノート(十五)15 Javaネットワークプログラミング、TCP実現チャット、ファイルアップロード、UDP送信メッセージ、チャット、マルチスレッドコンサルティング、URL

78974 ワード

ネットワークプログラミング
  • コンピュータネットワーク:
  • コンピュータネットワークとは、地理的に異なる独立した機能を有する複数のコンピュータおよびその外部機器を、通信回線を介して接続し、ネットワークオペレーティングシステム、ネットワーク管理ソフトウェアおよびネットワーク通信プロトコルの管理と協調の下で、資源共有と情報伝達を実現するコンピュータシステムである.

  • ネットワークプログラミングの目的
  • 無線局、交流情報
  • を伝播する
  • この効果を達成するには何が必要ですか?
  • ネットワーク上のホスト192.168.16.124:ポート、このコンピュータのリソース
  • に位置する方法
  • はこのホストを見つけて、どのようにデータ
  • を伝送します
  • javaweb:WebプログラミングB/S
  • ネットワークプログラミング:TCP/IP S/C

  • ネットワーク通信の要素
  • ネットワークの通信をどのように実現しますか?
  • 通信双方のアドレス:
  • ip
  • ポート番号
  • ip:ポート番号—>192.168.16.124.5900
  • ルール:ネットワーク通信プロトコル
  • TCP/IP参照モデル

  • IP
  • ipアドレス:キーワードInetAddress
  • ネットワーク上の唯一のコンピュータを特定する
  • 127.0.0.1:本機localhost
  • ipアドレスの分類
  • ipv 4 127.0.0.1、4バイト構成、0~255、42億;
  • を使い果たしました
  • ipv 6:128ビット.8個の符号なし証明書
  • 2001:0bb2:aaaa:0015:0000:0000:1aaa:1312
    

  • パブリックネットワーク(インターネット)-プライベートネットワーク(ローカルエリアネットワーク)
  • ABCD類アドレス
  • 192.169.xx.xx、組織北部に専用に使用される

  • ドメイン名:IP(www.vip.com)を記憶するための
  • ポート
  • ポートは、コンピュータ上のプログラムのプロセスです.
  • 異なるプロセスには異なるポート番号があり、異なるソフトウェア
  • を区別するために使用される.
  • に規定するポート番号TCP、UDP数0~65535*2
  • 単一プロトコルでは、ポート番号が
  • と競合することはできません.
  • ポート分類
  • パブリックポート0~1023
  • HTTP:80
  • HTTPS:443
  • FTP:21
  • Telent:23

  • プログラム登録ポート:1024~49151、ユーザーまたはプログラム使用の割り当て
  • Tomcat:8080
  • MySQL:3306
  • Oracle:1521

  • ダイナミック、プライベート:49152~65535
  • TCP Udp比較
  • TCP:電話
  • 接続、安定
  • 3回握手4回手を振る
  • クライアント、サービス側
  • 伝送が完了し、接続が解放され、効率が低い
  • UDP:メッセージ送信
  • 非接続、不安定
  • クライアント、サービス側:明確な境界がない
  • 準備ができているかどうかにかかわらず、
  • に送ることができます.
  • ミサイル
  • DDOS:洪水攻撃!


  • 簡単なサーバクライアントシミュレーション
    //   
    package Net;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpSeriverDemo01 {
           
        public static void main(String[] args) {
           
            ServerSocket serverSocket=null;
            Socket socket=null;
            InputStream is =null;
            ByteArrayOutputStream baos =null;
    
            try {
           
                serverSocket=new ServerSocket(9999);//      
                socket=serverSocket.accept();//       
                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) {
           
                e.printStackTrace();
            }finally {
           //    
                if (baos!=null){
           
                    try {
           
                        baos.close();
                    } catch (IOException e) {
           
                        e.printStackTrace();
                    }
                }
                if (is!=null){
           
                    try {
           
                        is.close();
                    } catch (IOException e) {
           
                        e.printStackTrace();
                    }
                }
                if (socket!=null){
           
                    try {
           
                        socket.close();
                    } catch (IOException e) {
           
                        e.printStackTrace();
                    }
                }
                if (serverSocket!=null){
           
                    try {
           
                        serverSocket.close();
                    } catch (IOException e) {
           
                        e.printStackTrace();
                    }
                }
            }
    
        }
    }
    
    
    //   
    package Net;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    public class TcpClientDemo01 {
           
        //         
        public static void main(String[] args) {
           
            Socket socket = null;
            OutputStream os=null;
            try {
           
                InetAddress serverIP = InetAddress.getByName("127.0.0.1");//            
                int port = 9999;
                socket=new Socket(serverIP,port);//    socket  
                os=socket.getOutputStream();//    IO 
                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();
                    }
                }
            }
    
        }
    }
    
  • TCP
  • クライアント:接続サーバSocket->送信情報
  • サーバ:サービスポートServer Socketの作成->ユーザーの接続待ちaccept->ユーザー情報の受信
  • ファイル転送キー:FileInputStream,FileoutputStream
  • サーバ
    package Net.Demo02;
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketAddress;
    public class TcpServerDemo02 {
           
        public static void main(String[] args) throws Exception {
           
            ServerSocket serverSocket=new ServerSocket(9000);
            Socket socket = serverSocket.accept();
            InputStream is =socket.getInputStream();
            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);
            }
            OutputStream os=socket.getOutputStream();
            os.write("    ".getBytes());
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();
        }
    }
    
  • クライアント
    package Net.Demo02;
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    public class TcpClientDemo02 {
           
        public static void main(String[] args) throws Exception {
           
            InetAddress address= InetAddress.getByName("127.0.0.1");
            Socket socket=new Socket(address,9000);
            OutputStream os= socket.getOutputStream();
            FileInputStream fis=new FileInputStream(new File("yanzi.jpg"));
            byte[] buffer=new byte[1024];
            int len;
            while ((len=fis.read(buffer))!=-1){
           
                os.write(buffer,0,len);
            }
            socket.shutdownOutput();
            InputStream is =socket.getInputStream();
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            byte[] buffer2=new byte[2014];
            int lens;
            while((len=is.read(buffer2))!=-1){
           
                baos.write(buffer2,0,len);
            }
            System.out.println(baos.toString());
            fis.close();
            os.close();
            socket.close();
        }
    }
    
  • Tomcat
  • サービス
  • カスタムs
  • TomcatサーバS:javaバックグラウンド開発!

  • クライアント
  • カスタムC
  • ブラウザB

  • UDP送信メッセージ
  • サーバに接続する必要はありません:キーワード:DatagramSocket
  • サーバ
    package Net.Demo03;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    public class UdpServerDemo01 {
             
        public static void main(String[] args) throws Exception {
             
            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 Net.Demo03;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    public class UdpClientDemo01 {
         
        public static void main(String[] args) throws Exception {
         
            DatagramSocket socket=new DatagramSocket();
            String msg="  ,   !";
            InetAddress localhost=InetAddress.getByName("127.0.0.1");
            int port=9090;
            DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
            socket.send(packet);
            socket.close();
        }
    }
    
  • 初歩的なチャットの実現
  • クライアント
  • package Net.Demo04;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.*;
    public class UdpsenderDemo01 {
           
        public static void main(String[] args) throws Exception {
           
            DatagramSocket socket=new DatagramSocket();
            BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
            while (true){
           
                String data=reader.readLine();
                byte[] datas= data.getBytes();
                DatagramPacket packet =new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
                socket.send(packet);
                if (data.equals("bye")){
           
                    break;
                }
            }
            socket.close();
        }
    }
    
  • 受信端子
  • package Net.Demo04;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    public class UdpReceiveDemo01 {
           
        public static void main(String[] args) throws Exception {
           
            DatagramSocket socket=new DatagramSocket(6666);
            while (true){
           
                byte[] container=new byte[1024];
                DatagramPacket packet=new DatagramPacket(container,0,container.length);
                socket.receive(packet);
                byte[] data=packet.getData();
                String receiveData=new String(data,0,data.length);
                System.out.println(receiveData);
                if (receiveData.equals("bye")){
           
                    break;
                }
            }
            socket.close();
        }
    }
    

    マルチスレッドコンサルティング
  • 送信側
    package Net.Demo05;
    import org.jcp.xml.dsig.internal.dom.ApacheOctetStreamData;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    import java.net.SocketException;
    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) {
           
            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){
           
                try {
           
                    String 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 (IOException e) {
           
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    
  • 受信端子
    package Net.Demo05;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    public class TalkReceive implements Runnable{
           
        DatagramSocket socket=null;
        private int port;
        private String msgFrom;
        public TalkReceive(int port,String msgFrom) {
           
            this.port = port;
            this.msgFrom=msgFrom;
            try {
           
                socket=new DatagramSocket(port);
            } catch (Exception e) {
           
                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);
                    byte[] data=packet.getData();
                    String receiveData=new String(data,0,data.length);
                    System.out.println(msgFrom+":"+receiveData);
                    if (receiveData.equals("bye")){
           
                        break;
                    }
                } catch (IOException e) {
           
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    
  • A
    package Net.Demo05;
    public class TalkStudent {
           
        public static void main(String[] args) {
           
            new Thread(new TalkSend(7777,"localhost",9999)).start();
            new Thread(new TalkReceive(8888,"  ")).start();
        }
    }
    
  • B
    package Net.Demo05;
    public class TalkTeacher {
           
        public static void main(String[] args) {
           
            new Thread(new TalkSend(5555,"localhost",8888)).start();
            new Thread(new TalkReceive(9999,"  ")).start();
        }
    }
    

  • URL
  • 統一リソースロケータ:リソースを位置決めし、インターネット上であるリソースを位置決めする
  • DNSドメイン名解析www.baidu.com: xxx.x…x…x
  • プロトコル://ipアドレス:ポート/プロジェクト名/リソース
  • package Net.PA;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    public class UrlDown {
         
        public static void main(String[] args) throws Exception {
         
            URL url=new URL("https://ws.stream.qqmusic.qq.com/C400002zpsxr1TlBvY.m4a?guid=7983659658&vkey=5EF7C88327DF6EDC07FB84C564CB1884F2D0B9AE7AACE0A72C8B387FB122CF1B1586FA8B6DE434A00A74B55AAE314FB2806E0C4C6B4F7DC9&uin=7739&fromtag=66");
            HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
            InputStream inputStream=urlConnection.getInputStream();
            FileOutputStream fos =new FileOutputStream("f.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();
        }
    }