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()
原文地址:https://www.cnblogs.com/grasp/p/10606196.html