Python教程--socket通信

一、前言

socket通信,是指两个或者多个设备间,进行数据交换的一种方式,有UDP,TCP,SOCKET_RAW等协议,当然,我们这里不阐述具体网络的通信的方式,只是教大家如何使用Python进行通信

二、套接字

socket就是我们耳熟能详的套接字,一个socket代表通信的一端,我们在这里给大家介绍常用的三种,UDP通信,TCP通信,SOCKET_RAW(这玩意其实不常用)

1、UDP

UDP是无连接的传输协议,他的好处是不需要握手,只需要知道接收端的IP和端口,就可以进行发送,由于不需要握手连接,所以消耗资源小,传输速度快;但也正因为没有握手,所以没有重传,使用UDP要在网络情况好的情况下使用,不然丢包问题会很严重

UDP分为客户端和服务端,我们写一个程序,来帮助大家理解

客户端:
import socket

# 创建套接字对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#  发送Hello,World字符串,注意不能直接发送字符串,要先编码再发送,目标IP为192.168.3.111,目标端口为8888
s.sendto("Hello, World".encode(),("192.168.3.111", 8888))
#  关闭套接字
s.close()
服务端:
import socket

# 创建套接字对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#  绑定本机IP为192.168.3.111,端口为8888(注意:此时,本机IP要设置为192.168.3.111)
s.bind(("192.168.3.111", 8888))
#  接收数据,当没有数据进来时,recvfrom是阻塞的
data, addr = s.recvfrom(1024)
#  解编码并打印接收到的数据
print(data.decode())
#  关闭套接字
s.close()

结果:	Hello, World

用两台机器,先运行服务端,再运行客户端,就能看到如上结果了,以下程序也是同样的操作方式

2、TCP

TCP与UDP相反,TCP是需要握手连接的,所以TCP是稳定可靠的,但是效率不如UDP

客户端:
import socket

# 创建套接字对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 先进行握手连接,连接的目标IP是192.168.3.111,端口为8888
s.connect(("192.168.3.111", 8888))
#  发送Hello,World字符串,先编码再发送
s.send("Hello, World".encode())
服务端:
import socket

#  创建套接字对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#  绑定本机IP为192.168.3.111,端口为8888(注意:此时,本机IP要设置为192.168.3.111)
s.bind(("192.168.3.111", 8888))
#  监听
s.listen(128)
#  接收客户端的连接
client_socket, client_addr = s.accept()
#  接收客户端发送的信息
data = client_socket.recv(1024)
#  给客户端回复消息
client_socket.send("I recv this message".encode("utf-8"))
# 关闭套接字
client_socket.close()
s.close()

2、SOCKET_RAW

SOCKET_RAW我们见得不多,上面的UDP和TCP都是在三层网络发包,即通过IP和端口,而SOCKET_RAW则是通过MAC地址进行数据收发,即二层网络

客户端:

import socket
import struct


# 创建套接字,协议为800
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))

# 绑定本地网卡
s.bind(("eth0", socket.htons(0x0800)))

# 通过struct对地址数据进行封装,目标Mac地址为aa:aa:aa:aa:aa:aa,源地址为bb:bb:bb:bb:bb:bb,协议类型为800
packet = struct.pack("!6s6s2s", b'\xaa\xaa\xaa\xaa\xaa\xaa', b'\xbb\xbb\xbb\xbb\xbb\xbb', b'\x08\x00')

s.send(packet + "Hello, World".encode())
服务端:

import socket

#  创建套接字
s= socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x800))
#  接收数据
data = s.recvfrom(1024)
print(data)

三、总结

UDP和TCP是我们最常用的套接字协议,大家熟练掌握这两个,至于说SOCKET_RAW,一般只有在专门做通信的地方才会用到这各方式,大家了解一下就好

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值