创建Socket:
该函数带有两个参数(参数必须写):
a. AF_INET(ipv4协议⽤于 Internet 进程间通信)
b. 套接字类型, 可以是 SOCK_STREAM(流式套接字, ⽤于TCP 协议) 或者 SOCK_DGRAM(数据报套接字, ⽤于 UDP 协议)
TCP慢但是稳定不会丢数据
UDP快但是可能会丢数据(黑客攻击)
确定了IP地址端口号(ipv4协议),TCP或UDP协议之后,计算机之间可以进行通信
""" UDP发送数据 """
from socket import * # 导入套接字模块
s = socket(AF_INET,SOCK_DGRAM) #创建套接字
addr = ("192.168.42.44",8080) # 用于接收数据的ip地址,端口号
data = input("请输入要发送的内容:")
s.sendto(data.encode("gb2312"),addr) # data.encode("gb2312"),data的数据转换为网络调试助手能识别的编码方式
s.sendto(b"abcd",addr)
"""
发送数据时,python3需要将字符串转成byte
encode(‘utf-8’) # 用utf-8对数据进行编码,获得bytes类型对象
decode()反过来
"""
redata = s.recvfrom(1024) # 参数 1024 代表本次接收能接收到的最大数据的字节数
print(redata[0].decode("gb2312")) # redata[0]代表接收到的第一个数据
s.close()
作为数据得接收方,需要事先绑定一个端口号: s.band(("IP地址",端口号))
from socket import *
s = socket(AF_INET,SOCK_DGRAM)
s.bind(("", 8088)) # 用一个元组传入(“ip地址”,端口号),注意:传给本机的时候"ip地址" 可以不用写
s.sendto(b"abc", ("192.168.42.44",8585)) # 对方的地址也是元组表示
#等待接收数据
redata = s.recvfrom(1024) #1024表示本次接收的最大字节数
print(redata[0].decode())
echo 服务器: 接受到什么原封发回
from socket import *
udpSock =socket(AF_INET,SOCK_DGRAM)
udpSock.bind(("",8585))
while True:
recvData = udpSock.recvfrom(1024)
udpSock.sendto(recvData[0], recvData[1])
udpSock.close()
创建聊天室
聊天室 1: 先发后收
from socket import *
udpSock =socket(AF_INET,SOCK_DGRAM)
udpSock.bind(("192.168.42.44",8581))
while True:
data = input("请输入:\n")
udpSock.sendto(data.encode(), ("192.168.42.44",8580))
recvData = udpSock.recvfrom(1024)
print(recvData[0].decode())
udpSock.close()
聊天室 2: 先收后发
from socket import *
udpSock =socket(AF_INET,SOCK_DGRAM)
udpSock.bind(("192.168.42.44",8580))
while True:
recvData = udpSock.recvfrom(1024)
print(recvData[0].decode())
data = input("请输入:\n")
udpSock.sendto(data.encode(), ("192.168.42.44",8581))
udpSock.close()