Python网络协议socket

01 协议基础

01 网络协议

协议:一种规则

网络协议:网络规则,一种在网络通信中的数据包的数据规则

02 TCP/IP协议

osi模型

tcp/ip协议

03 tcp协议

TCP协议提供了一种端到端的、基于连接的、可靠的通信服务。

  • 三次握手

    • 创建连接
  • 四次挥手

    • 断开连接
  • TCP协议特点

    • 先创建连接,然后才能够发送消息
    • 全双工的
    • 三次握手、四次挥手
    • 安全性可靠性更高
    • 数据包的大
  • TCP应用场景

    • 数据量大的

    • 及时响应的

    • 比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

      常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ...

04 udp协议

  • UDP协议特点
    • 不是面向连接的通信协议,通信前不需要建立连接
    • 数据传输快
    • 不可靠,不稳定,不确保对方收到数据包,尤其网络原因,数据包丢失不会重发
    • 适用于传输大量数据
  • UDP应用场景
    • 数据量小的
    • 对时效要求不高的
    • QQ语音 QQ视频 TFTP ......

05 区别

02 协议应用

01 socket

1. 使应用程序能够直接将数据经传输层来传输,本质上是对 TCP/IP 的运用进行了一层封装,然后由应用程序直接调用其接口方法进行通信操作。
2. Socket通信可以分为2个部分,服务端和客户端;
服务端需要建立 socket 来监听指定的地址,然后等待客户端来连接。
而客户端则需要建立 socket 并与服务端的 socket 地址进行连接
3. 端口是什么概念?一台电脑就是你家的小区,你买东西如果填的地址是你家小区,那么快递员最多能把东西送到小区门口;但是如果你写上了你家的门牌号,那么快递员就能送到你家门口。同样的,电脑上同时运行着很多程序,比如QQ,旺旺...但是电脑只有只有一个IP地址,一条消息来了没人知道这个消息是给谁的,于是就有了端口的概念。QQ在这台电脑的4567端口,旺旺在这台电脑1234端口。发消息的人只要知道它在什么端口,就能准确地把消息发过来了。
同样的,网络通信两端的人得事先约定好一个端口,然后一个人守着这个端口,待另一方连接了这个端口,这才算建立了Socket连接。就好两个人打电话,不需要关心信号怎么转换和传输,但在建立这次通话之前必须有人拨号,同时有人守在电话旁

02 tcp应用

服务端

  • 1、创建一个服务器对象:server=socket.socket()
  • 2、在网络中绑定地址和端口: server.bind(x) #x必须元组(ip,port)
  • 3、开启网络内的监听:server.listen(y) #一次接受客户端的队列长度
  • 4、接受连接: sock,addr=server.accept()
  • 5、发送数据: sock.send(z) #z必须是字节码
  • 6、接收数据: sock.recv(1024)
  • 7、关闭连接 server.close()
    注意:accept()具有线程阻塞。需要将accept()放在循环中。
python 复制代码
# 服务端
# 模拟tcp协议的客户端和服务器

# 导入通讯包socket

# 服务器
# 1.导包 import socket
# 2.创建socket实例对象  tcps = socket.socket()
# 3.绑定ip,端口 bind
# 4.设置监听 listion()
# 5.等待客户端的连接 accept()
# 6.接收和发送消息 recv() send()
# 7.关闭 close

import socket

tcps_socket = socket.socket()

ip = '192.172.4.24'
port = 8082
tcps_socket.bind((ip, port))

tcps_socket.listen(5)
print("服务器已经启动...")

c, addr = tcps_socket.accept()   # 返回两个,一个是实例对象,该对象的addr
print(c)
while True:
    msg = c.recv(1024).decode('utf-8') # 解码
    print(msg)
    c.send('我收到你的消息了'.encode('utf-8')) # 编码

# 服务端可以一直响应客户端

客户端

  • 1、创建一个客户端对象:client=socket.socket()
  • 2、实现客户端与服务端连接:client.connect(x) #x必须是元组(ip,port)指服务端ip和port
  • 3、客户端向服务器发送消息:client.send(data) #data必须是字节码b'xxxx'
  • 4、预留:服务端向客户端返回消息: client.recv(1024) #必须是2的x次方数字
  • 5、断开连接:client.close()
python 复制代码
# 客户端
# 1.导包
# 2.创建socket实例对象 tcpc = socket.socket()
# 3.连接服务器
# 4.接收和发送消息 recv() send()
# 5.关闭
#
# import socket
#
# tcpc_socket = socket.socket()
#
# ip = '192.172.4.24'
# port = 8082
# tcpc_socket.connect((ip, port))
#
# say = input('客户端说:')
# tcpc_socket.send(say.encode('utf-8'))
# msg = tcpc_socket.recv(1024).decode('utf-8')
# print(msg)

# 客户端可以一直给服务端发送消息

import socket
print('xixi')
tcpc_socket = socket.socket()
# AF_INET : 网络ipv4
# SOCK_STREAM : TCP协议

ip = '192.172.4.24'
port = 8082
tcpc_socket.connect((ip, port))

while True:
    say = input('客户端说:')
    tcpc_socket.send(say.encode('utf-8'))
    print('555')
    msg = tcpc_socket.recv(1024).decode('utf-8')
    print(msg)
    print(666)

03 udp应用

客户端

  • 1、创建一个客户端对象client=socket.socket()
  • 2、
python 复制代码
# udp
# socket
# ipv4
# SOCK_DGRAM  == udp 协议
# import socket
# socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP连接对象
# 1. 导包
# 2. 生成连接对象
# 3. 连接服务器
# 4. 接收发送消息

import socket
import time

udpc_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# while True:
for i in range(1, 11):
    ip = '192.172.4.24'
    port = 8084

    udpc_socket.sendto(f'第{i}次向服务器发送消息'.encode('utf-8'),(ip, port))
    # time.sleep(2)
    # s, addr = udpc_socket.recvfrom(1024)
    # print(s.decode(('ut99f-8')))
# udpc_socket.close()

服务器

python 复制代码
# 服务器
# 1.导包
# 2.创建连接对象
# 3.绑定ip,端口
# 4.接收消息

import socket

udps_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

ip = '192.172.4.24'
port = 8084
udps_socket.bind((ip, port))

for i in range(1, 11):
    c_date, c_addr = udps_socket.recvfrom(1024)  # recv只接收数据,recvfrom c端的数据,c的地址
    print(c_date.decode('utf-8'))
    udps_socket.sendto(f'第{i}次收到客户端的消息'.encode('utf-8'), c_addr)
udps_socket.close()

# udp tcp 区别:
# # 可以先启动客户端么?
# # udp的客户端,一次发送十个消息
# # 服务端接收到几个消息
相关推荐
Swift社区7 分钟前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光10 分钟前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求15 分钟前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生15 分钟前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it29 分钟前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
四口鲸鱼爱吃盐39 分钟前
Pytorch | 利用AI-FGTM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
是娜个二叉树!1 小时前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
互联网杂货铺1 小时前
Postman接口测试:全局变量/接口关联/加密/解密
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
Schwertlilien1 小时前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习
liuyunshengsir1 小时前
Squid代理服务器的安装使用
开发语言·php