使用java实现socket编程

1. 流式socket:它是对tcp面向连接传输服务的封装,建立一个流式socket,相当于在两台主机之间建立端到端的虚拟双字节流管道。

cc984072af5f4a9e84b4cf2f9e303a17.jpg

 2. 服务器端:必须先于客户端运行,并长久保持,被动等待客户端发起三次握手请求,并提供服务。

3. 客户端:只有在客户有需求时启动,主动发起三次握手请求,并等待服务结果。

4. socket服务器端的几个重要概念:

  • 监听socket对象:在指定的IP地址和端口上监听来自不同客户端的连接请求,并实现三次握手,握手成功后把已经建立的tcp连接记录放入"连接队列”。这些工作都是由操作系统内核模块自动完成,可以理解为在后台默默工作的一个线程。这个虚拟socket管道的一端是确定的,另一端是不确定的,等待客户端的请求,所以称为监听socket对象。
  • 连接队列:存放tcp连接信息的队列,由操作系统自己维护。
  • 通信socket对象:从连接队列每取出一个tcp连接记录(取出的动作是由java程序完成的),就关于该tcp连接创建一个新的socket与客户端对接到一起,专门负责客户端与服务器端的实际数据通信。

5.多线程实现socket服务器端应对并发服务:

  • 线程:一个独立的执行线路。不同线程在逻辑上相互独立的并行执行。属于一个进程的多个线程共享一个地址空间。每一个线程都有自己的“主函数”,该主函数执行完毕,线程的生命周期结束。
  • java的线程对象:它是对操作系统线程对象的一个封装。一般该线程对象都是Thread类的子类。子类需要重载run函数,作为自己的线程主函数。
  • 多线程socket优点:逻辑清晰。
  • 多线程socket缺点:线程太多,线程切换会使得效率降低。另外线程的启动和回收会消耗时间。
  • 线程池:避免多线程在启动和回收时大量不必要的开销(无法避免线程切换时的开销)。线程池一开始为休眠态,当需要某个线程,就从池中唤醒它,去执行相应的主函数,结束后,线程不会销毁,而是回到线程池中继续休眠。在这个过程中把线程还回线程池的开销小于直接销毁线程的开销。

0db996aa5bae4700a19d2ed44a4cc500.jpg

 Java中ThreadPoolExecutor类提供一个线程池执行对象。

如何给线程池发送任务:创建task对象,自定义run()并放入任务队列,线程池就会循环从任务队列执行。

6.代码见文章开头资源(免费下载)

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值