首页 > 其他分享 >Scoket层(TCP,TDP)

Scoket层(TCP,TDP)

时间:2024-01-16 16:23:17浏览次数:24  
标签:Scoket TCP server client send msg 字节 TDP socket

【一】Scoket层在哪

  • 还是用图来说话,一目了然。

img

【二】什么是socket

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

    • 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面
    • 对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
  • 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

  • 也有人将socket说成ip+port

    • ip是用来标识互联网中的一台主机的位置
    • 而port是用来标识这台机器上的一个应用程序
    • ip地址是配置到网卡上的
    • 而port是应用程序开启的
    • ip与port的绑定就标识了互联网中独一无二的一个应用程序
  • 而程序的pid是同一台机器上不同进程或者线程的标识

【三】套接字发展史及分类

  • 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。
  • 一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。
  • 这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是
    • 基于文件型的
    • 基于网络型的。

【1】基于文件类型的套接字家族

  • 套接字家族的名字:
    • AF_UNIX
  • unix一切皆文件
    • 基于文件的套接字调用的就是底层的文件系统来取数据
    • 两个套接字进程运行在同一机器
    • 可以通过访问同一个文件系统间接完成通信

【2】基于网络类型的套接字家族

  • 套接字家族的名字:
    • AF_INET
  • (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现
    • 所有地址家族中,AF_INET是使用最广泛的一个
    • python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

【四】TCP协议

# 创建socket对象
server = socket()
# 监听端口
IP = '127.0.0.1'
PORT = 8080
server.bind((IP, PORT))
# 监听连接对象个数
server.listen(5)
# 创建连接对象
conn, addr = server.accept()
# 通过连接对象接收数据 1kb = 1024 bytes  
conn.recv(1024)  # 最大1024

【1.0】基础版

服务端

from socket import socket

server = socket()
server.bind(('127.0.0.1', 9696))
server.listen(5)
conn, addr = server.accept()
from_client_lsg = conn.recv(1024)
from_client_lsg = from_client_lsg.decode('utf8')
print(from_client_lsg)
send_to_client_msg = '我是服务端'
send_to_client_msg = send_to_client_msg.encode('utf8')
conn.send(send_to_client_msg)
conn.close()
server.close()

客户端

from socket import socket
client = socket()
client.connect(('127.0.0.1', 9696))
send_to_server_msg = '我是客户端'
send_to_server_msg = send_to_server_msg.encode('utf8')
client.send(send_to_server_msg)
from_server_msg = client.recv(1024)
from_server_msg = from_server_msg.decode('utf8')
print(from_server_msg)
client.close()

【2.0】循环版

服务端

from socket import socket

server = socket()

server.bind(('127.0.0.1', 9696))
server.listen(5)
while True:
    conn, addr = server.accept()
    msg = conn.recv(1024)
    msg = msg.decode('utf8')
    print(f'msg:>>>{msg}')
    if msg == 'q':
        conn.close()
        break
    while True:
        send_msg = input("发送的消息 :>>>> ").strip()
        if not send_msg: continue
        conn.send(send_msg.encode('utf8'))
        break
server.close()

客户端

from socket import socket

while True:
    client = socket()
    client.connect(('127.0.0.1', 9696))
    send_msg = input("请输入消息 :>>>> ").strip()
    if not send_msg: continue
    client.send(send_msg.encode('utf-8'))
    if send_msg == 'q':
        client.close()
        break

    msg = client.recv(1024)
    print(msg.decode('utf8'))

【五】UDP协议

服务端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8888))
msg, addr = server.recvfrom(1024)
print(msg.decode('utf8'))
print(addr)
data = '我是服务端'
data = data.encode('utf8')
server.sendto(data, addr)

客户端

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
msg = '我是客户端'
msg = msg.encode('utf8')
client.sendto(msg, ('127.0.0.1', 8888))
msg, addr = client.recvfrom(1024)
print(msg.decode('utf8'))
print(addr)

【补充】struct模块

  • struct.pack()
    

    是Python内置模块

    struct
    

    中的一个函数

    • 它的作用是将指定的数据按照指定的格式进行打包,并将打包后的结果转换成一个字节序列(byte string)
    • 可以用于在网络上传输或者储存于文件中。
  • struct.pack(fmt, v1, v2, ...)
    
    • 其中,fmt为格式字符串,指定了需要打包的数据的格式,后面的v1,v2,...则是需要打包的数据。
    • 这些数据会按照fmt的格式被编码成二进制的字节串,并返回这个字节串。
  • fmt
    

    的常用格式符如下:

    • x --- 填充字节
    • c --- char类型,占1字节
    • b --- signed char类型,占1字节
    • B --- unsigned char类型,占1字节
    • h --- short类型,占2字节
    • H --- unsigned short类型,占2字节
    • i --- int类型,占4字节
    • I --- unsigned int类型,占4字节
    • l --- long类型,占4字节(32位机器上)或者8字节(64位机器上)
    • L --- unsigned long类型,占4字节(32位机器上)或者8字节(64位机器上)
    • q --- long long类型,占8字节
    • Q --- unsigned long long类型,占8字节
    • f --- float类型,占4字节
    • d --- double类型,占8字节
    • s --- char[]类型,占指定字节个数,需要用数字指定长度
    • p --- char[]类型,跟s一样,但通常用来表示字符串
    • ? --- bool类型,占1字节
  • 具体的格式化规则可以在Python文档中查看(链接)。

img

import json
import struct

header = {
    'file_size': 20255
}
head_bytes = bytes(json.dumps(header), encoding='utf-8')

head_len_bytes = struct.pack('i', len(head_bytes))

print(f"这是原本的数据 :>>>> {header}")
print(f"这是json序列化后的数据 :>>>> {head_bytes}")
print(f"这是压缩后的数据 :>>>> {head_len_bytes}")

标签:Scoket,TCP,server,client,send,msg,字节,TDP,socket
From: https://www.cnblogs.com/unrealqcc/p/17967942

相关文章

  • OSI七层协议和TCP,IP五层协议
    OSI七层协议介绍互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层tcp/ip四层应用层传输层网络层网络接口层tcp/ip五层应用层传输层网络层数据链路层物理层osi七层应用层表示层会话层传输层网络层数据链路层物理层tcp/ip四层应......
  • C# socket tcp/ip 如何判断连接是否正常
    判断socket是否断开连接,网上有N种说法:1.Socket.Connected这个属性只能说明上一次通信时还是正常的。比如说你拔掉网线后就它显示还是为true。用这个方法最好和ping一起组合使用。ping的方法如下publicboolPingOC(Stringips){boolret;Processp=newProcess();p.Start......
  • tcpdump+wireshark抓包分析
    目录tcpdump核心参数详解tcpdump的输出理解输出结构flag标识符常规过滤规则基于IP地址过滤基于网段过滤基于端口过滤基于协议进行过滤可选参数解析不解析域名提升速度结果输出到文件从文件中读取数据指定抓取个数指定设备口过滤规则组合tcpdump是linux下的一个命令行抓包工具wir......
  • TCP和UDP
    目录TCP头部结构TCP和UDP区别TCP头部结构TCP和UDP区别......
  • 41. 干货系列从零用Rust编写负载均衡及代理,websocket与tcp的映射,WS与TCP互转
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • tcpdump
    目录简介步骤1:安装tcpdump步骤2:捕获数据包步骤3:过滤和分析数据包步骤4:将捕获结果写入文件步骤5:查看捕获结果常用参数使用场景简介tcpdump是一个命令行实用程序,允许您捕获和分析通过系统的网络流量。它通常用于帮助排除网络问题,以及作为安全工具。以下是使用tcpdump的基本步骤:......
  • 5.HTTP和TCP
    6.1http1.0和http1.1有什么区别。HTTP1.1相较于HTTP1.0增加了长连接、管道。长连接:为解决HTTP/1.0发送一次请求,建立一次TCP,因此HTTP/1.1新增了长连接,减少连接重复创建和断开管道:解决HTTP/1.0在一个TCP连接中每发送一个请求需等待一个响应的问题,HTTP/1.1新增管道,一个TCP中......
  • Kong网关转发TCP协议和WebSocket协议的请求
    一、TCP协议1、修改配置文件,开启流端口vim/etc/kong/kong.confstream_listen=0.0.0.0:9000,0.0.0.0:90012、利用KongA配置tcp和websocket协议上游服务配置 路由配置:Destinations写kong网关的9000端口(只支持ip+port的形式)   二、WebSocket协议上游服务配置......
  • QTcpSocket发送存储QObject的QList
     #include<QTcpSocket>#include<QDataStream>#include<QByteArray>voidsendObjectList(QTcpSocket*socket,constQList<QObject*>&objectList){QByteArrayserializedData;QDataStreamout(&serializedData,QIODev......
  • TCP之三次握手四次挥手与UDP区别
    目录1TCP三次握手四次挥手1.1数据包说明1.1.1TCP数据包1.1.2UDP数据包1.1.3TCP和UDP差异1.1.4TCP可靠性传输机制1.2三次握手1.2.1三次握手定义1.2.2三次握手问题1.2.2.1问题引入分析1.2.2.2历史连接1.2.2.3同步双方初始序列号1.2.2.4避免资源浪费1.3四次挥手1TCP......