Python网络编程:简介
发布时间
阅读量:
阅读量
背景知识
ip、port、等。。。
socket简介
创建socket:
AddressFamily:可选方案包括AF_INET和AF_UNIX两种类型。其中,AF_INET主要用于网络进程间通信(而IPv6的情况待查),通常推荐采用该方案。
使用方式:
- 发送数据的流程:
1. 创建套接字
2. 发送数据
3. 关闭 - 接收数据的流程:
1. 创建套接字
2. 绑定本地自己的信息(ip和port)
3. 接收数据
4. 关闭
注意:
- 当接收方接收到一个元组时,则需从中提取传输的消息。
- 未绑定自身信息(以一个元组形式)的数据,在使用sendto函数发送数据时,则系统会自动分配一个随机的端口号给该进程使用。
- 编码方式。
示例
1(发送数据)
import socket
def send_eg1():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可以用网络调试助手来接收。
# 可以使用套接字收发数据
# udp_socket.sendto('hahah', 对方的ip和port)
# 上述写法会出错,要用bytes的方式发送,故要在发送内容上加b
udp_socket.sendto(b'hahah', ("192.168.1.2", 8080))
# 关闭套接字
udp_socket.close()
def send_eg2():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
send_data = input("请输入要发送的数据。")
udp_socket.sendto(send_data.encode('utf-8'), ("192.168.1.2", 8080))
# 关闭套接字
udp_socket.close()
def send_eg3():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
send_data = input("请输入要发送的数据。")
if send_data == 'exit':
break
udp_socket.sendto(send_data.encode('utf-8'), ('127.0.0.1', 7788))
# 关闭套接字
print('byebye!')
udp_socket.close()
def receive_eg1():
# 1.创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr)
# 3.接收数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 4. 打印接收到的数据
print(recv_data)
# 5.关闭套接字
udp_socket.close()
if __name__ == "__main__":
func = ("exit", send_eg1, send_eg2, send_eg3, receive_eg1)
chosefunc = int(input("please enter which function to do (1:send_eg1, 2:send_eg2, 3:send_eg3, 4:receive_eg1): "))
# print(type(func[chosefunc]))
if chosefunc>0 and chosefunc<5:
func[chosefunc]()
else:
print("error input!")
结果:

2(接收数据和发送数据)
import socket
def send_eg1():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可以用网络调试助手来接收。
# 可以使用套接字收发数据
# udp_socket.sendto('hahah', 对方的ip和port)
# 上述写法会出错,要用bytes的方式发送,故要在发送内容上加b
udp_socket.sendto(b'hahah', ("192.168.1.2", 8080))
# 关闭套接字
udp_socket.close()
def send_eg2():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
send_data = input("请输入要发送的数据。")
udp_socket.sendto(send_data.encode('utf-8'), ("192.168.1.2", 8080))
# 关闭套接字
udp_socket.close()
def send_eg3():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
send_data = input("请输入要发送的数据。")
udp_socket.sendto(send_data.encode('utf-8'), ('127.0.0.1', 7788))
if send_data == 'exit':
break
# 关闭套接字
print('byebye!')
udp_socket.close()
def receive_eg1():
# 1.创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定一个本地信息
localaddr = ("", 7788) # 一个原组
udp_socket.bind(localaddr)
# 3.接收数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 4. 打印接收到的数据
print(recv_data)
# 5.关闭套接字
udp_socket.close()
def receive_eg2():
# 1.创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定一个本地信息
localaddr = ("", 7788) # 一个元祖
udp_socket.bind(localaddr)
# 3.接收数据
while True:
# rece_data 中存储的是一个元祖(接收到的数据,(发送方的ip,port))
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 将这个元祖进行拆开
recv_msg = recv_data[0] # 存储接收到的数据
recv_sdaddr = recv_data[1] # 存储发送方的地址信息
# 4.打印接收到的数据
print("%s:%s"%(str(recv_sdaddr), recv_msg.decode("utf-8"))) # 注意这里的编码解码方式,要和发送端对应!
if recv_msg.decode("utf-8") == "exit":
print('byebye!')
break
# 5.关闭套接字
udp_socket.close()
if __name__ == "__main__":
func = ("exit", send_eg1, send_eg2, send_eg3, receive_eg1, receive_eg2)
chosefunc = int(input("please enter which function to do (1:send_eg1, 2:send_eg2, 3:send_eg3, 4:receive_eg1, 5:receive_eg2): "))
# print(type(func[chosefunc]))
if chosefunc>0 and chosefunc<6:
func[chosefunc]()
else:
print("error input!")
运行结果:

全部评论 (0)
还没有任何评论哟~
