JAvaはSocketによるTCPネットワーク通信を実現


  • は,ある実験でSocketを用いてTCPネットワーク通信を実現したため,ブログを書くことで,後日の利用を容易にするためにも参考になる.
  • クライアントClient.javaコード:
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    /* *     */
    public class Client {
        public static void main(String[] args) {
            try {
                //1.     Socket,          
                Socket socket=new Socket("localhost", 8888);
                //2.     ,         
                OutputStream os=socket.getOutputStream();//     
                PrintWriter pw=new PrintWriter(os);//          
                pw.write("   :alice;  :789");
                pw.flush();
                socket.shutdownOutput();//     
                //3.     ,            
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String info=null;
                while((info=br.readLine())!=null){
                    System.out.println("        :"+info);
                }
                //4.    
                br.close();
                is.close();
                pw.close();
                os.close();
                socket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • サービス・エンド・サーバ.javaコード:
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /* *   TCP   Socket  ,       *      */
    public class Server {
        public static void main(String[] args) {
            try {
                //1.        Socket, ServerSocket,       ,      
                ServerSocket serverSocket=new ServerSocket(8888);
                Socket socket=null;
                //        
                int count=0;
                System.out.println("***       ,    :***");
                //            
                while(true){
                    //  accept()      ,        
                    socket=serverSocket.accept();
                    //        
                    ServerThread serverThread=new ServerThread(socket);
                    //    
                    serverThread.start();
    
                    count++;//        
                    System.out.println("      :"+count);
                    InetAddress address=socket.getInetAddress();
                    System.out.println("      IP:"+address.getHostAddress());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  • サーバがクライアントのメッセージを常に循環的に受信できるようにするために、スレッドクラスサーバThread.javaコードを構築する:
  • 
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    /* *          */
    public class ServerThread extends Thread {
        //        Socket
        Socket socket = null;
    
        public ServerThread(Socket socket) {
            this.socket = socket;
        }
    
        //       ,        
        public void run(){
            InputStream is=null;
            InputStreamReader isr=null;
            BufferedReader br=null;
            OutputStream os=null;
            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("   !");
                pw.flush();//  flush()       
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }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();
                }
            }
        }
    }