服务端:

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()

最新文章

  1. Winform主窗体设计
  2. Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)
  3. 基于DDD的.NET开发框架 - ABP Session实现
  4. AS项目转到eclipse中方法
  5. 给The Lab Renderer for Unity中地形添加阴影
  6. RedHat linux配置yum本地资源
  7. busybox inetd tftpd
  8. nginx平滑重启与平滑升级的方法
  9. Linux TCP队列相关参数的总结
  10. FAT下的winhex数据恢复
  11. LAMP源码安装,搭建zabbix监控
  12. sklearn包中有哪些数据集你都知道吗?
  13. 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
  14. 【笔记】Python基础二:数据类型之集合,字符串格式化,函数
  15. js 限制输入框只能输入数字的问题
  16. Vue入门笔记(一)--基础部分
  17. 【Alpha go】Day 2!
  18. @ControllerAdvice + @ExceptionHandler 使用
  19. shell 知识点
  20. 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查

热门文章

  1. Holer实现外网访问本地MySQL数据库
  2. C++中cin.getline与cin.get要注意的地方
  3. bootstrap框架下 单选按钮组的选中以及取值问题
  4. kettle 在javascrip代码组件中使用fireToDB()函数实现自定义数据库查询
  5. git教程:删除文件
  6. DW/BI领域的自动化调度方案
  7. python学习1---列表、矩阵、数组
  8. NYOJ-15:括号匹配(二)
  9. SpringSecurity身份验证基础入门
  10. 设置table的每竖的宽度