服务端:
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()