• java socket 基础操作


    服务端:

    public class Server {
        public static void main(String[] args) throws Exception {
            //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket = new ServerSocket(10086); 
            //2、调用accept()方法开始监听,等待客户端的连接
            Socket socket = serverSocket.accept();
            //3、获取输入流,并读取客户端信息
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String info = null;
            //会阻塞知道客户端有数据过来
            while ((info = br.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + info);
            }
            socket.shutdownInput();//关闭输入流,不会关闭套接字
            //4、获取输出流,响应客户端的请求
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();
            //5、关闭资源,会发送字符串到客户端
            pw.close();
            os.close();//会关闭套接字
            br.close();
            isr.close();
            is.close();
            socket.close();
            serverSocket.close();
        }
    }

    客户端:

    public class Client {
        public static void main(String[] args) throws Exception {
            //1、创建客户端Socket,指定服务器地址和端口
            Socket socket = new Socket("localhost", 10086); //这种方式会直接连接connect
            //2、获取输出流,向服务器端发送信息
            OutputStream os = socket.getOutputStream();//字节输出流
            PrintWriter pw = new PrintWriter(os);//将输出流包装成打印流
            pw.write("用户名:admin;密码:123");
            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
            socket.close();
        }
    }

    1.在客户端或者服务端通过socket.shutdownOutput()都是单向关闭的,即关闭客户端的输出流并不会关闭服务端的输出流,所以是一种单方向的关闭流;
    2.通过socket.shutdownOutput()关闭输出流,但socket仍然是连接状态,连接并未关闭
    3.如果直接关闭输入或者输出流,即:in.close()或者out.close(),会直接关闭socket

    当需要判断一个Socket是否可用的时候,不能简简单单判断是否为null,是否关闭,下面给出一个比较全面的判断Socket是否可用的表达式,这是根据Socket自身的一些状态进行判断的,它的状态有:

    • bound:是否绑定
    • closed:是否关闭
    • connected:是否连接
    • shutIn:是否关闭输入流
    • shutOut:是否关闭输出流
    socket != null && socket.isBound() && !socket.isClosed() && socket.isConnected()&& !socket.isInputShutdown() && !socket.isOutputShutdown()
  • 相关阅读:
    ultraedit 窗口布局
    Oracle之Char VarChar VarChar2
    Python之pickle
    Python之xpath
    Python常用数据结构之heapq模块
    Python实现排序算法之快速排序
    Python常用数据结构之collections模块
    New York is 3 hours ahead of California
    leetcode978
    leetcode979
  • 原文地址:https://www.cnblogs.com/grasp/p/10606196.html
Copyright © 2020-2023  润新知