JAvaはsocketネットワークプログラミングを実現する

70930 ワード

1、ネットワークプログラミングの原理:
ネットワークプログラミングの2つの大きなステップ1、どのようにネットワーク上の1台または複数のホストを位置決めします:ネットワーク層は主にネットワークホストの位置決めを担当して、データ伝送のルート、ipアドレスからインターネット上の1台のホストを唯一確定することができます.
二、どのように位置決めした後にデータの伝送を行うか.伝送層には、アプリケーション向けの信頼性(TCP)または非信頼性(UDP)のデータ伝送メカニズムが提供される
クライアント/サーバの場合(C/S)構造.つまり、通信双方はサーバーとして顧客の要求を待って応答する.顧客はサービスが必要な時にサーバーに申請する.サーバーは一般的に守護プロセスとして常に運行し、ネットワークポートを傍受し、顧客の要求があれば、サービスプロセスを起動して顧客に応え、同時に自分でサービスポートを傍受し続け、後のお客様もタイムリーにサービスを受けることができます.
ブラウザ/サーバ(B/S)構造の場合、お客様はサービスが必要なときにサーバに要求します.サーバが応答した後、すぐに戻り、リアルタイムでポートをリスニングする必要はありません.
2、TCPプロトコルとUDPプロトコル
Tcpプロトコルはリンク向けの信頼性の高いデータ伝送を保証するプロトコルであり、得られるのは順序の誤りのないデータストリームであり、送信者と受信者がsocket接続を作成する方式は、サービス側がサービス待ちを開き、クライアントがリンクを送信するのを待つことであり、リンクを作成した後、双方が送信または受信操作を行うことができる.
UDPプロトコルは無接続プロトコルであり、各パケットは独立した情報であり、完全なソースアドレスまたは宛先アドレスを含み、ネットワーク上で任意の可能な経路で宛先に伝達されるため、宛先に到達できるかどうか、宛先に到達する時間およびコンテンツの正確性は保証されない.
3、socketネットワークプログラミングとは何ですか.
ネットワークプログラミングでは、ネットワーク上の2つのプログラムが双方向の通信接続によってデータの交換を実現し、この接続の一端をsocketと呼ぶ.Socketソケットは、TCP/IPプロトコルのネットワーク通信をサポートする通信の対象です.これはネットワーク通信の過程の端点の抽象的な表現で、ネットワーク通信を行うために必要な5種類の情報を含む:接続使用のプロトコル、ローカルホストのIPアドレス、ローカルプロセスのプロトコルポート、遠隔ホストのIPアドレス、遠隔プロセスのプロトコルポート.
Socketの本質はプログラミングインターフェース(API)であり、TCP/IPプロトコルをカプセル化してプログラマーに口実を提供し、これがSocketプログラミングインターフェースである.
4、javaはsocketネットワークプログラミングを実現する
サービス側はサーバSocketを使用してIPとポートをバインドし、Acceptを使用してポートにクライアントが接続要求を送信しているかどうかを傍受し、クライアントが接続要求を送信すると、サービス側は接続情報を返信し、正式に接続を確立する.Send,Writeなどの方法でサーバ側とClient側が通信できる.
機能が整ったSocketには、次の4つの基本的なステップが含まれます.1、Socketの作成、2、Socketに接続された入力/アウトフローを開く.3、一定のプロトコルに従ってSocketに対して読み書き操作を行う;4、Socketを閉じます.
5、コード実装
TCPベースのsocket実装
サービス側
public class TcpSocketServer {

  public static void main(String[] args) {
        try {
            //      socket     
            ServerSocket serverSocket = new ServerSocket();
            //  ip
            serverSocket = new ServerSocket(8088, 10, InetAddress.getByName("192.168.0.110"));
            //      socket          socket  
            Socket socket = new Socket();
            System.out.println("       ...");
            //            
            while(true){
                //                             
                socket = serverSocket.accept();
               //           
                ServerThread thread = new ServerThread(socket);  
                thread.start();
                //      ip
                InetAddress address=socket.getInetAddress();
                System.out.println("         IP:"+address.getHostAddress());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
}
    
}

サービス側実行スレッド
public class ServerThread extends Thread{

    private Socket socket = null;

    public ServerThread(Socket socket) {

        this.socket = socket;
    }
    @Override
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
//                * PW                 :
//                * PrintWriter(File f)    
//                * PrintWriter(String s)   
//                * PrintWriter                  
//                * PW      
//                *    PW      、         。
//                * PW       
//                * bw      
//                * osw     
//                * fos     
//                *   PW                      
        PrintWriter pw=null;
        try {
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String info = null;
            while((info=br.readLine())!=null){
                System.out.println("   :"+info);
            }
            //                
            socket.shutdownInput();
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("      1");
            pw.flush();
        } catch (Exception e) {
            // TODO: handle exception
        } finally{
            //    
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

クライアント
public class TcpSocketClient {
    public static void client() throws InterruptedException {
        try {
            //         
            Socket socket = new Socket("192.168.0.111", 8088);
            //           
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("       ");
            //flush                     。
            //        close    flush  ,  PrintWriter    flush    
            pw.flush();
            socket.shutdownOutput();
            //          
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info = null;
            while ((info = br.readLine()) != null) {
                System.out.println("     ,       :" + info);
            }
            br.close();
            is.close();
            os.close();
            pw.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

実行順序では、クライアントが先に実行された場合に直接要求されますが、サービス側がリスニングポート待機接続を実行していないため、クライアントに接続異常またはタイムアウトが発生するため、サービス側がクライアントを実行していることが望ましいです.
6、UDP実現
サービス:
public class UdpSocketServer {
   DatagramSocket socket = null;

public static void main(String[] args) {
        try {
            //       
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            //   socket      ip
    InetSocketAddress isa = new InetSocketAddress("192.168.0.110", 8088);
    socket = new DatagramSocket(isa);
            //   socket        
            while(true) {
                //           
                socket.receive(packet);
                String receiveMsg = new String(packet.getData(), 0, packet.getLength());
                System.out.println("    " + packet.getLength());
                System.out.println("   :" + receiveMsg);
                msg=receiveMsg;
            }
            //   socket
//            socket.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

}

クライアント
public class UdpSocketClient {
    public static void Client(String ip,String msg) {
        try {
            //       
            String sendMsg = msg;
            System.out.println(sendMsg);
            //                   
            InetAddress addr = InetAddress.getByName(ip);
            //   packet   ,                   
            DatagramPacket packet = new DatagramPacket(sendMsg.getBytes(),
                    sendMsg.getBytes().length, addr, 8088);
            //   Socket  
            DatagramSocket socket = new DatagramSocket();
            //         
            socket.send(packet);
            System.out.println("    ");
            //   socket
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

ソケット転送ファイル
TCPの信頼性のためここではTcpを用いて伝送を行い、伝送原理、接続確立後、クライアントは伝送を要求するファイル名または絶対パス+ファイル名をサービス側に送信し、サービス側はファイル名または絶対パスに基づいてファイルオブジェクトを作成し、ファイルが存在するか否かを判断し、存在する場合はバイトまたは文字の形でクライアントに伝送するクライアントが指定したディレクトリに保存
クライアント:
public class FileTcpSocketClient {
//image   
    public static void Imageclient(String image) throws InterruptedException {

        try {
            //         
            Socket socket = new Socket("192.168.0.106", 8089);
            // ===================         =================
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write(image);
            //flush                     。
            //        close    flush  ,  PrintWriter    flush    
            pw.flush();
            socket.shutdownOutput();

            // ========================        ====================
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            FileOutputStream fos=null;
            //   
            String fileName = dis.readUTF();
            System.out.println("   "+fileName);
            //    
            long fileLength = dis.readLong();
            System.out.println("    "+fileLength);
         //                  
            String staticPath = ClassUtils.getDefaultClassLoader().getResource("static/img").getPath();
            String path1=staticPath.substring(1, staticPath.length());
            System.out.println(path1);
            //                      
            File directory = new File(path1);
            if(!directory.exists()) {
                directory.mkdir();
            }
            //             。               file.separator        。  UNIX    ,       '/';  Microsoft Windows    ,   '\'。
            //directory.getAbsolutePath()           
            File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
            if(!file.exists()) {
                fos = new FileOutputStream(file);
                //       
                byte[] bytes = new byte[1024];
                int length = 0;
                while ((length = dis.read(bytes, 0, bytes.length)) != -1) {
                    fos.write(bytes, 0, length);
                    fos.flush();
                }

                System.out.println("========        [File Name:" + fileName + "]");
            }
            is.close();
            os.close();
            pw.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

サービス:
public class FileTcpSocketServer extends Thread{

    @Override
    public void run() {
        try {
            //      socket
            ServerSocket serverSocket = new ServerSocket(); 
           //  ip   
            serverSocket.bind(new InetSocketAddress("192.168.0.106",8089));
//            serverSocket = new ServerSocket(8089, 3, InetAddress.getByName("127.0.0.1"));
            //      socket
            Socket socket = new Socket();
            System.out.println("       ...");
            //            
            while(true){
                //                     
                socket = serverSocket.accept();
               FileThread thread = new FileThread(socket);
                thread.start();
                //      ip
                InetAddress address=socket.getInetAddress();
                System.out.println("         IP:"+address.getHostAddress());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

ファイル転送スレッド
public class FileThread extends Thread{

    private Socket socket = null;

    public FileThread(Socket socket) {

        this.socket = socket;
    }
    @Override
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
         FileInputStream fis=null;
         DataOutputStream dos=null;
        String fileName=null;
//                * PW                 :
//                * PrintWriter(File f)    
//                * PrintWriter(String s)   
//                * PrintWriter                  
//                * PW      
//                *    PW      、         。
//                * PW       
//                * bw      
//                * osw     
//                * fos     
//                *   PW                      
        PrintWriter pw=null;
        try {
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);

            String info = null;

            while((info=br.readLine())!=null){
                System.out.println("   :"+info);
                fileName=info;
            }
            //                
            socket.shutdownInput();
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            System.out.println(fileName);
//            
            String staticPath = ClassUtils.getDefaultClassLoader().getResource("static/img").getPath();
            String path1=staticPath.substring(1, staticPath.length());
            System.out.println(path1+fileName);

            File file=new File(path1+fileName);
            String responseMsg="        ";
            System.out.println("7");
            if(!file.exists())
            {
                System.out.println("   ");
                pw.write(responseMsg);
                pw.flush();
            }else {
                System.out.println("  ");
                fis = new FileInputStream(file);
                //       
                dos = new DataOutputStream(os);
                dos.writeUTF(file.getName());
                dos.flush();
                dos.writeLong(file.length());
                System.out.println(file.length());
                dos.flush();
                //       
                System.out.println("========        ========");
                byte[] bytes = new byte[1024];
                int length = 0;
                long progress = 0;
                while ((length = fis.read(bytes, 0, bytes.length)) != -1) {
                    dos.write(bytes, 0, length);
                    dos.flush();
                    progress += length;
                    System.out.print("| " + (100 * progress / file.length()) + "% |");
                }
                System.out.println();
                System.out.println("========        ========");
            }

    } catch (Exception e) {
            // TODO: handle exception
        } finally{
            //    
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}