socket网络编程
清欢Viki
别人欣赏的永远是你骄傲的样子。
展开
-
Socket TCP简单案例
1. 流程构建TCP客户端、服务端 客户端发送数据,并接收服务器传回的数据长度 服务器接收并打印数据2. 客户端代码 运行环境:IDEAimport java.io.*;import java.net.Inet4Address;import java.net.InetSocketAddress;import java.net.Socket;public clas...原创 2019-03-19 22:08:10 · 245 阅读 · 0 评论 -
Socket数据传输的可能存在问题及解决方案
消息粘包TCP保证数据完整性、顺序性,不会发生消息粘包 UDP不保证数据完整性,可能发生丢包的情况 粘包并非数据传输层的粘包,是数据处理逻辑层面上的粘包,也就是网络上各种包的处理。比如接收的包不是想要的包,或者接收包的顺序发生错误等消息不完整性TCP不会发生数据不完整的情况,一旦出现一定是TCP停止运行 消息不完整依然指的是数据逻辑接收层面。物理传输层面数据一定能安全完整的送达另一...原创 2019-04-16 21:57:50 · 4404 阅读 · 0 评论 -
NIO服务器线程优化
现有线程分析每个客户端都有读写两个线程,加上selector的线程以及转发、等待连接线程等,可见线程是非常多的。线程优化后的模型减少线程数量,每个客户端不再开读和写线程,而是开整体的读线程池和写线程池。 ByteBuffer也不再为每个客户端都开辟一个,而是使用统一的ByteBuffer。 异步线程采用锁(AtomicBoolean)实现数据同步运行环境IDEA目录...原创 2019-04-13 16:45:57 · 378 阅读 · 4 评论 -
简单聊天室的服务器状态分析
服务器状态 - 繁忙服务端需要等待客户端连接 服务器需要等待接收客户端的消息 客户端等待接收服务端的消息 以上过程都是阻塞的所以使用了异步线程服务器线程数量每个客户端分别有接收消息线程和发送消息线程 n个客户端线程数量:2n 服务端线程总数量:至少2n+4 (服务端主线程,服务器GC回收(垃圾回收)线程,监听客户端连接线程,服务端转发消息线程)服务器压力测试开启1000个...原创 2019-04-09 22:42:39 · 267 阅读 · 0 评论 -
简单聊天室之NIO改写服务端
NIO改写服务端性能分析篇已经写到,阻塞模式若客户端数量达到上万十万百万,服务器的cpu、内存和线程的压力非常大,必须要进行性能改进。方案便是将服务端改写成非阻塞模式(NIO) 将等待连接的accept改写为ServerSocketChannel的Socket注册方法 读写线程也分别改写为ServerSocketChannel的Socket注册方法相比前边案例改写的类TCPServe...原创 2019-04-12 20:00:53 · 200 阅读 · 0 评论 -
简单聊天室案例
综述条件:分为客户端、服务端。 约束:数据传输协议。对消息转换为byte数组末尾添加换行符,作为消息约束。 原理:服务端监听消息来源、客户端连接服务器并发送消息到服务器客户端之间的数据传输模型:客户端发送数据给服务端,由服务端转发给其他客户端。功能实现客户端发送消息给其他客户端(包括服务端) 服务端发送广播给客户端运行环境IDEA目录结构多模块项目 ...原创 2019-04-07 22:40:48 · 820 阅读 · 0 评论 -
UDP辅助TCP实现点对点数据传输
目的是在不知道对方主机IP情况下想要建立TCP连接进行数据传输整体思路是首先UDP广播消息,服务器接收到广播消息后回送本机IP和端口,这样便能进行连接UDP搜索IP与端口构建基础口令消息(发送消息的格式,服务器接收可以识别才能回送消息,避免接收其他干扰广播) 局域网广播口令消息(指定端口) 接收指定端口回送的消息(IP与端口)UDP搜索取消异步线程接收回送消息 异步线程等待...原创 2019-04-01 21:08:32 · 1000 阅读 · 0 评论 -
阻塞IO与非阻塞IO(NIO)
阻塞IO服务器会一直等待客户端的链接 每个客户端一直等待服务端消息的传输 cpu从读到写或者从写到读的线程切换浪费较多时间非阻塞IO(NIO)加大服务器的繁忙程度,减少线程数量。不是一直在等待客户端连接或者等待数据传输,而是有数据到达时通知线程,有客户端连接时通知线程。若没有,服务器则去处理其他的调度业务。NIO的常用用法函数已经在其他文章改写聊天室的代码会在以后的章...原创 2019-04-10 21:47:46 · 444 阅读 · 0 评论 -
基于TCP的客户端与服务端消息传输
承接上文 UDP辅助TCP实现点对点数据传输 , 当时仅能实现客户端消息发送服务端回送数据长度,本节将能实现服务端向客户端的消息发送。此时便涉及数据发送与接收并行多线程收发并行 TCP多线程收发协作大致思路客户端开一个线程用于接收服务端的消息 服务端开一个大线程监听客户端连接,每个线程中开一个读线程,一个写线程运行环境IDEA目录结构client ...原创 2019-04-03 21:39:26 · 537 阅读 · 0 评论 -
非阻塞IO(NIO)常用API
1.NIO的职责Selector负责事件分发,当有事件到达时,Channel向Selector注册,并通过Buffer进行数据交互2.Selector注册事件APISelectorKey.OP_CONNECT 连接就绪 SelectorKey.OP_ACCEPT 接收就绪 SelectorKey.OP_READ 读就绪(新数据到达) SelectorKey.OP_WRITE...原创 2019-03-22 21:46:36 · 468 阅读 · 0 评论 -
非阻塞IO(NIO)家族成员
1.主体部分Buffer缓冲区:数据处理的基础单元,客户端发送与接收数据都需通过Buffer进行转发 Channel通道:Buffer传输的通道,类似于流,但不同于IN/OUT Stream;流具有独占性与单向性;通道则偏向于数据流通多样性 Socket选择器:处理客户端所有事件的分发器2. Charset扩展部分Charset字符编码:加密解密 原生支持的、数据通道级别的数据处...原创 2019-03-22 21:06:27 · 134 阅读 · 0 评论 -
网络编程初识
1. 几个概念网络--在计算机领域中,网络是信息传输 、接收和共享的虚拟平台。通过它把点、面、体的信息联系到一起,从而实现这些资源 的共享。 局域网--各个终端通过路由器联系在一起的网络,局域网之间可进行资源共享。 互联网--无数局域网的互联而成的网络。2. 网络编程从大的方面说就是对信息的发送与接收 通过操作相应的API调度计算机的硬件资源,...原创 2019-03-18 22:16:11 · 121 阅读 · 0 评论 -
TCP主要API详解
TCP的功能聊天消息传输、推送 单人语音、视频聊天 UDP能做的TCP几乎都能做,但要考虑复杂性、性能等问题 限制:无法进行广播、多波等操作APIsocket() 创建Socket bind() 绑定一个Socket到一个本地地址和端口上 connect() 连接到远程套接字 accept() 接受一个进的连接(服务器) write() 将数据写入Socket输出流 re...原创 2019-03-20 18:22:03 · 1685 阅读 · 0 评论 -
UDP的广播实例
运行环境IDEA目录结构 MessageCreator 数据构造器,用于信息发送的数据格式化 UDPProvider 用于提供数据,即广播的接收者 UDPSearcher 用于搜索支持方,即广播发送者 MessageCreator类public class MessageCreator { //发送数据包的头部 private s...原创 2019-03-20 16:02:32 · 640 阅读 · 0 评论 -
UDP主要API详解
1. DatagramSocket用于接收与发送UDP的类 负责发送一个UDP包或接收UDP包 不同于TCP,UDP并没有合并到Socket API中(无服务器和客户端的区别) DatagramSocket() 创建简单实例,不指定端口和IP DatagramSocket(int port) 创建监听固定端口的实例(接收数据的端口) DatagramSocket(int port, ...原创 2019-03-19 22:54:30 · 1593 阅读 · 0 评论 -
完整的ChatRoom聊天室代码
概述上节说到消息粘包和数据不完整的问题未解决,也就是数据传输缓冲区固定,一旦数据长度超出缓冲区大小,便会出现问题。 解决方案就是,把每条消息封装成一个包,包包含包头和包体,包头封装要发送数据的长度,包体封装数据。 创建两个变量记录当前读到的位置和数据总长度,读取部分到缓冲区,若读到结尾结束,未到结尾继续读;接收类似 不包含文件传输功能运行环境IDEA目录结构多模块项目...原创 2019-04-16 22:37:52 · 5043 阅读 · 0 评论