Advertisement

Python网络编程:简介

阅读量:

背景知识

ip、port、等。。。

socket简介

创建socket:

AddressFamily:可选方案包括AF_INET和AF_UNIX两种类型。其中,AF_INET主要用于网络进程间通信(而IPv6的情况待查),通常推荐采用该方案。

使用方式:

  1. 发送数据的流程:
    1. 创建套接字
    2. 发送数据
    3. 关闭
  2. 接收数据的流程:
    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)

还没有任何评论哟~