socket 

背景概念

脑图结构

OSI 模型

socket 概念特性

脑图结构

理解示意图

 额外补充

  Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。

  在设计模式中, Socket其实就是一个门面模式

  它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。

TCP_socket

server

  1. import socket
  2. sk = socket.socket()
  3. sk.bind(('127.0.0.1',8898)) # 把地址绑定到套接字
  4. sk.listen() # 监听链接
  5. conn,addr = sk.accept() # 接受客户端链接
  6. ret = conn.recv(1024) # 接收客户端信息
  7. print(ret) # 打印客户端信息
  8. conn.send(b'hi') # 向客户端发送信息
  9. conn.close() # 关闭客户端套接字
  10. sk.close() # 关闭服务器套接字(可选)

client

  1. import socket
  2. sk = socket.socket() # 创建客户套接字
  3. sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
  4. sk.send(b'hello!')
  5. ret = sk.recv(1024) # 对话(发送/接收)
  6. print(ret)
  7. sk.close() # 关闭客户套接字

特性

粘包

额外补充

  TCP (Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。

  使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP_socket

 server

  1. import socket
  2. udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字
  3. udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字
  4. msg,addr = udp_sk.recvfrom(1024)
  5. print(msg)
  6. udp_sk.sendto(b'hi',addr) # 对话(接收与发送)
  7. udp_sk.close() # 关闭服务器套接字

client

  1. import socket
  2. ip_port=('127.0.0.1',9000)
  3. udp_sk=socket.socket(type=socket.SOCK_DGRAM)
  4. udp_sk.sendto(b'hello',ip_port)
  5. back_msg,addr=udp_sk.recvfrom(1024)
  6. print(back_msg.decode('utf-8'),addr)

额外补充

  UDP (User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。

  使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

其他补充方法

文本笔记

  1. socket概念
  2. 套接字:实现网络编程进行数据传输的一种技术手段
  3. 相关模块: import socket
  4. 分类
  5. 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。
  6. 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。
  7.  
  8. 面向连接--tcp协议--可靠的--流式套接字
  9. 无连接--udp协议--不可靠--数据报套接字
  10.  
  11. tcp套接字编程
  12. 服务端流程
  13. 1. 创建套接字
  14. sk = socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
  15. 功能: 创建套接字
  16. 参数:
  17. socket_family 网络地址类型 AF_INET-->ipv4
  18. socket_type 选择类型,与 TCP/UDP 中选择, 默认就是 TCP 模式
  19. 套接字类型 SOCK_STREAM 流式(TCP)
  20. SOCK_DGRAM 数据报(UDP)
  21. proto 通常为0,可以忽略 选择子协议
  22. 返回值: 套接字对象
  23. 2. 绑定地址
  24. sk.bind(addr)
  25. 功能: 绑定本机网络地址
  26. 参数: 二元元组 (ip,port) 例如:('0.0.0.0',8888)
  27. 3. 设置监听
  28. sk.listen(n)
  29. 功能 将套接字设置为监听套接字,确定监听队列大小
  30. 参数 监听队列大小
  31. 4. 等待处理客户端连接请求
  32. conn,addr = sk.accept()
  33. 功能: 阻塞等待处理客户端请求
  34. 返回值: conn 客户端连接套接字
  35. addr 连接的客户端地址
  36. * 阻塞函数 程序运行过程中遇到阻塞函数则暂停执行,直到达成某种条件后继续运行。
  37. 5. 消息收发
  38. data = conn.recv(buffersize)
  39. 功能 : 接受客户端消息
  40. 参数 :每次最多接收消息的大小
  41. 返回值: 接收到的内容
  42.  
  43. n = conn.send(data)
  44. 功能 : 发送消息
  45. 参数 :要发送的内容 bytes格式
  46. 返回值: 发送的字节数
  47.  
  48. * str --> bytes string.encode()
  49. bytes --> str bytes.decode()
  50. 6. 关闭套接字
  51. sk.close()
  52. 功能:关闭套接字
  53. """
  54. import socket
  55. sk = socket.socket()
  56. sk.bind(("127.0.0.1", 8008))
  57. sk.listen()
  58. conn, addr = sk.accept()
  59. conn.send(b"hello")
  60. conn.close()
  61. sk.close()
  62. """
  63.  
  64. 客户端流程
  65. 1. 创建套接字
  66. sk = socket.socket()
  67. * 只有相同类型的套接字才能进行通信
  68. 2. 请求连接
  69. sk.connect(server_addr)
  70. 功能:连接服务器
  71. 参数:元组 服务器地址
  72. 3. 收发消息
  73. print(sk.recv(1024))
  74. * 防止两端都阻塞,recv send要配合
  75. 4. 关闭套接字
  76. """
  77. import socket
  78. sk = socket.socket()
  79. sk.connect(("127.0.0.1", 8008))
  80. print(sk.recv(1024))
  81. sk.close()
  82. """
  83.  
  84. 代码流程总结
  85. 服务端:socket() --> bind() --> listen() --> accept() --> recv(),send() --> close()
  86. 客户端:socket() --> connect() --> send(),recv() --> close()
  87.  
  88. 整体过程总结
  89. * tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
  90. * tcp连接中如果一端已经不存在,让然试图通过send发送则会产生BrokenPipeError
  91. * 一个监听套接字可以同时连接多个客户端,也能够重复被连接
  92. * 网络收发缓冲区
  93. 1】网络缓冲区有效的协调了消息的收发速度
  94. 2sendrecv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
  95. * tcp粘包
  96. 1 原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。
  97. 2 影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
  98. 3 处理:
  99. 1. 人为的添加消息边界
  100. 2. 控制发送速度
  101.  
  102. UDP套接字编程
  103. 服务端流程
  104. 1. 创建数据报套接字
  105. sk = socket(AF_INET,SOCK_DGRAM)
  106. 2. 绑定地址
  107. sk.bind(addr)
  108. 3. 消息收发
  109. data,addr = sockfd.recvfrom(buffersize)
  110. 功能: 接收UDP消息
  111. 参数: 每次最多接收多少字节
  112. 返回值: data 接收到的内容
  113. addr 消息发送方地址
  114. n = sockfd.sendto(data,addr)
  115. 功能: 发送UDP消息
  116. 参数: data 发送的内容 bytes格式
  117. addr 目标地址
  118. 返回值:发送的字节数
  119. 4. 关闭套接字
  120. sockfd.close()
  121. """
  122. import socket
  123.  
  124. udp_sk = socket.socket(type=socket.SOCK_DGRAM)
  125. udp_sk.bind(('127.0.0.1', 9000))
  126. msg, addr = udp_sk.recvfrom(1024)
  127. print(msg)
  128. udp_sk.sendto(b'hi', addr)
  129. udp_sk.close()
  130. """
  131.  
  132. 客户端流程
  133. 1. 创建套接字
  134. sk=socket.socket(type=socket.SOCK_DGRAM)
  135. 2. 收发消息
  136. sk.sendto(data,("127.0.0.1",8000))
  137. sk.recvfrom(1024)
  138. 3. 关闭套接字
  139. sk.close()
  140. """
  141. import socket
  142.  
  143. sk = socket.socket(type=socket.SOCK_DGRAM)
  144. addr = ("127.0.0.1", 9000)
  145. sk.sendto(b"hello", addr)
  146. data, addr = sk.recvfrom(1024)
  147. print(data)
  148. sk.close()
  149. """

4.1 socket的更多相关文章

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

  10. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

随机推荐

  1. Dynamics 365中的常用Associate和Disassociate消息汇总

    摘要: 微软动态CRM专家罗勇 ,回复301或者20190123可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 因为编程时候 ...

  2. 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口

    从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...

  3. OPC协议解析-关于OPC协议的几个问题

    1    什么是OPC协议? 为了便于自动化行业不同厂家的设备和应用程序能相互交换数据,定义了一个统一的接口函数,就是OPC协议规范.有了OPC就可以使用统一的方式去访问不同设备厂商的产品数据. OP ...

  4. Docker Data Center系列(二)- UCP安装指南

    本系列文章演示如何搭建一个mini的云平台和DevOps实践环境. 基于这套实践环境,可以部署微服务架构的应用栈,演练提升DevOps实践能力. 1 系统要求 1.1 硬件和软件要求 Linux内核版 ...

  5. MySQL MHA FailOver后,原Master节点自动以Slave角色加入解群的研究与实现

    MHA是一套MySQL高可用管理软件,除了检测Master宕机后,提升候选Slave为New Master之外(漂虚拟IP),还会自动让其他Slave与New Master 建立复制关系.MHA Ma ...

  6. MySQL中Identifier Case Sensitivity

    在MySQL当中,有可能遇到表名大小写敏感的问题.其实这个跟平台(操作系统)有关,也跟系统变量lower_case_table_names有关系.下面总结一下,有兴趣可以查看官方文档"Ide ...

  7. sqlserver 清空数据 主键从1开始

    TRUNCATE  TABLE  TbName   --TbName是表名 表清空数据之后 使新增加的记录保持从1 开始

  8. Oracle——DQL、DML、DDL、DCL

    1.DQL:数据查询语言 基本结构:由select.from.where组成 子句组成的查询块:    SELECT <字段名表>    FROM <表或视图名>    WHE ...

  9. 浅谈TCP IP协议栈(四)IP协议解析

    通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...

  10. SQLServer之删除触发器

    删除触发器 注意事项 可以通过删除DML触发器或删除触发器表来删除DML触发器. 删除表时,将同时删除与表关联的所有触发器. 删除触发器时,会从 sys.objects.sys.triggers 和 ...