zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/grasp/p/10606196.html
Copyright © 2011-2022 走看看