zoukankan      html  css  js  c++  java
  • socket编程1-EchoServer

    代码解析:
     
    service()方法 不断等待客户端程序的连接请求,serversocket.accept()得到socket对象后,表示建立连接,从Socket对象中得到输入流、输出流,分别用PrintWriter 和 BufferedReader来装饰。不断的用BufferedReader对象的readLine()方法读取客户端程序发来的字符串,再调用BufferWriter对象的println()方法向客户返回字符串“返回响应”。当读取到客户端发来“bye”字符串后,结束通信,关闭连接。

    package Chapter1;

    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.ServerSocket;
    import java.net.Socket;

    public class EchoServer {
        private ServerSocket server;
        private int port = 8000;
        Socket socket;

        public static void main(String[] args) throws IOException {
            /*
             * //返回本地主机ip地址 InetAddress addr=InetAddress.getLocalHost();
             * //返回代表"222.34.5.7"的IP地址 InetAddress
             * addr2=InetAddress.getByName("222.34.5.7");
             * //返回域名为"www.baidu.com"的ip地址 InetAddress
             * addr3=InetAddress.getByName("www.baidu.com");
             */
            new EchoServer().service();
        }

        /**
         * 服务器端程序一直监听端口,来接收客户端程序的连接请求。
         * 如接收到连接请求,accept()方法就返回一个Socket对象,此对象与客户端的Socket对象形成一条通信线路,建立连接
         */
        public EchoServer() throws IOException {
            server = new ServerSocket(port); // 1.创建ServerSocket对象,在构造方法中指定监听的端口
            System.out.println("服务器端程序启动,等待客户端程序访问");
            socket = server.accept(); // 2.调用ServerSocket对象的accept()方法,来监听端口,等待客户端程序的连接请求。
            System.out.println("service开始连接客户端 " + socket.getInetAddress() + ":"
                    + socket.getPort());
        }

        public void service() {

            try {
                BufferedReader br;
                br = getReader(socket);
                PrintWriter pw = getWriter(socket);
                String msg = null;
                msg = br.readLine();
                System.out.println("service接收到客户端数据:" + msg);
                if (msg != null) {
                    if (msg.equals("bye")) {
                        pw.println("over");
                        System.out.println("客户端已发送"bye",服务端返回"over",将关闭服务端socket");
                        socket.close();
                    } else {
                        pw.println("service返回响应"" + msg + """);
                    }
                } else{
                    System.out.println("service 未得到客户端数据");
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // finally {
            // if (socket != null)
            // try {
            // socket.close();
            // System.out.println("服务端socket已关闭");
            // } catch (IOException e) {
            // // TODO Auto-generated catch block
            // e.printStackTrace();
            // }
            // }
        }

        /*
         * Socket类提供了getInputStream()、getOutputStream()方法,分别返回输入流InputStream对象
         * 、输出流OutputStream对象, 向输出流写数据---向对方发送数据 从输入流读数据---接收来自对方的数据
         *
         * InputStream socketIn=socket.getInputStream(); BufferedReader br=new
         * BufferedReader(new InputStreamReader(socketIn));
         *
         * OutputStream socketOut=socket.getOutputStream();
         * //参数true表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地 PrintWriter pw=new
         * PrintWriter(socketOut,true);
         */

        private BufferedReader getReader(Socket socket) throws IOException {

            InputStream socketIn = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(socketIn));
            return br;
        }

        private PrintWriter getWriter(Socket socket) throws IOException {
            OutputStream socketOut = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(socketOut, true);
            return pw;
        }

    }

  • 相关阅读:
    【荐】说说CSS Hack 和向后兼容
    【阮一峰】深入研究URL编码问题及JavaScript相应的解决方案
    什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性
    实用框架(iframe)代码
    数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,
    BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
    c++中基本的语法问题
    RIP协议两个版本号对不连续子网的支持情况实验
    getChars的使用方法
    ios8中百度推送接收不到
  • 原文地址:https://www.cnblogs.com/stay-sober/p/4158793.html
Copyright © 2011-2022 走看看