4.1 socket
socket
背景概念
脑图结构
OSI 模型
socket 概念特性
脑图结构
理解示意图
额外补充
Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中, Socket其实就是一个门面模式
它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。
TCP_socket
server
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) # 把地址绑定到套接字
sk.listen() # 监听链接
conn,addr = sk.accept() # 接受客户端链接
ret = conn.recv(1024) # 接收客户端信息
print(ret) # 打印客户端信息
conn.send(b'hi') # 向客户端发送信息
conn.close() # 关闭客户端套接字
sk.close() # 关闭服务器套接字(可选)client
import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret)
sk.close() # 关闭客户套接字特性
粘包
额外补充
TCP (Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。
使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
UDP_socket
server
import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字
udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr) # 对话(接收与发送)
udp_sk.close() # 关闭服务器套接字client
import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)额外补充
UDP (User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。
使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
其他补充方法
文本笔记
socket概念
套接字:实现网络编程进行数据传输的一种技术手段
相关模块: import socket
分类
流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。
数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。 面向连接--tcp协议--可靠的--流式套接字
无连接--udp协议--不可靠--数据报套接字 tcp套接字编程
服务端流程
1. 创建套接字
sk = socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
功能: 创建套接字
参数:
socket_family 网络地址类型 AF_INET-->ipv4
socket_type 选择类型,与 TCP/UDP 中选择, 默认就是 TCP 模式
套接字类型 SOCK_STREAM 流式(TCP)
SOCK_DGRAM 数据报(UDP)
proto 通常为0,可以忽略 选择子协议
返回值: 套接字对象
2. 绑定地址
sk.bind(addr)
功能: 绑定本机网络地址
参数: 二元元组 (ip,port) 例如:('0.0.0.0',8888)
3. 设置监听
sk.listen(n)
功能 : 将套接字设置为监听套接字,确定监听队列大小
参数 : 监听队列大小
4. 等待处理客户端连接请求
conn,addr = sk.accept()
功能: 阻塞等待处理客户端请求
返回值: conn 客户端连接套接字
addr 连接的客户端地址
* 阻塞函数 : 程序运行过程中遇到阻塞函数则暂停执行,直到达成某种条件后继续运行。
5. 消息收发
data = conn.recv(buffersize)
功能 : 接受客户端消息
参数 :每次最多接收消息的大小
返回值: 接收到的内容 n = conn.send(data)
功能 : 发送消息
参数 :要发送的内容 bytes格式
返回值: 发送的字节数 * str --> bytes string.encode()
bytes --> str bytes.decode()
6. 关闭套接字
sk.close()
功能:关闭套接字
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8008))
sk.listen()
conn, addr = sk.accept()
conn.send(b"hello")
conn.close()
sk.close()
""" 客户端流程
1. 创建套接字
sk = socket.socket()
* 只有相同类型的套接字才能进行通信
2. 请求连接
sk.connect(server_addr)
功能:连接服务器
参数:元组 服务器地址
3. 收发消息
print(sk.recv(1024))
* 防止两端都阻塞,recv send要配合
4. 关闭套接字
"""
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 8008))
print(sk.recv(1024))
sk.close()
""" 代码流程总结
服务端:socket() --> bind() --> listen() --> accept() --> recv(),send() --> close()
客户端:socket() --> connect() --> send(),recv() --> close() 整体过程总结
* tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
* tcp连接中如果一端已经不存在,让然试图通过send发送则会产生BrokenPipeError
* 一个监听套接字可以同时连接多个客户端,也能够重复被连接
* 网络收发缓冲区
【1】网络缓冲区有效的协调了消息的收发速度
【2】send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
* tcp粘包
【1】 原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。
【2】 影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
【3】 处理:
1. 人为的添加消息边界
2. 控制发送速度 UDP套接字编程
服务端流程
1. 创建数据报套接字
sk = socket(AF_INET,SOCK_DGRAM)
2. 绑定地址
sk.bind(addr)
3. 消息收发
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息
参数: 每次最多接收多少字节
返回值: data 接收到的内容
addr 消息发送方地址
n = sockfd.sendto(data,addr)
功能: 发送UDP消息
参数: data 发送的内容 bytes格式
addr 目标地址
返回值:发送的字节数
4. 关闭套接字
sockfd.close()
"""
import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(('127.0.0.1', 9000))
msg, addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi', addr)
udp_sk.close()
""" 客户端流程
1. 创建套接字
sk=socket.socket(type=socket.SOCK_DGRAM)
2. 收发消息
sk.sendto(data,("127.0.0.1",8000))
sk.recvfrom(1024)
3. 关闭套接字
sk.close()
"""
import socket sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ("127.0.0.1", 9000)
sk.sendto(b"hello", addr)
data, addr = sk.recvfrom(1024)
print(data)
sk.close()
"""
4.1 socket的更多相关文章
- socket读写返回值的处理
在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- Socket聊天程序——初始设计
写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- Mono 3.2.3 Socket功能迎来一稳定的版本
由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
随机推荐
- Mac上webstorm与git仓库建立连接
1.打开Mac终端,输入$ cd ~/.ssh检查.ssh文件是否存在($在终端中存在,不需要自己输入),不存在,进行步骤2 2.如果没有安装ssh文件,输入命令$ssh -v,安装ssh文件,成功时 ...
- 设计模式系列之策略模式(Strategy Pattern)
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它 ...
- shell脚本批量ssh登陆主机并执行命令
shell脚本批量ssh登陆主机并执行命令 今天在客户现场遇到了这个问题,客户没有管理工具,无法批量登陆主机下发命令,几个个C段啊,让我一个一个登陆,.................. 所以写了个s ...
- 定时任务 Cron表达式
Cron表达式由6~7项组成,中间用空格分开.从左到右依次是: 秒.分.时.日.月.周几.年(可省略) Cron表达式的值可以是数字,也可以是以下符号: "*":所有值都匹配 &q ...
- iead2018创建JavaWe工程
菜单栏中 File-> Project,弹出如下界面,选择 Java并勾选 Web Application 填写 Project Name 配置 tomcat 点击右上角的绿色的小锤子,然后打开 ...
- 高端内存映射之kmap_atomic固定映射--Linux内存管理(二十一)
1 固定映射 1.1 数据结构 linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述 x86 arm arm64 arch/x86/include/asm/ ...
- SQLServer修改表数据
使用SSMS数据库管理工具修改数据 修改任意一条或者多条都可以 1:打开数据库,选择数据表,右键点击->编辑所有行(如未配置,点击编辑前200行). 2.编辑需要修改的数据->编辑完成后, ...
- CVS简单介绍
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Jerome_s/article/details/27990707 CVS - Concurrent Ver ...
- Spring事件和监听器
Application下抽象子类ApplicationContextEvent的下面有4个已经实现好的事件 ContextClosedEvent(容器关闭时) ContextRefreshedEven ...
- (三)Installation
Elasticsearch requires at least Java 8. Specifically as of this writing, it is recommended that you ...