python socket编程

udp协议:

  • 发送时不会先建立连接,广播式的,可以一对一或一对多,传送数据并不安全,不能保证数据能够到达
  • 使用udp协议的socket流程:
    • 创建套接字
    • 发送/接收数据
    • 关闭套接字

      import socket
      #创建套接字
      udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
      #发送数据
      udp_socket.sendto('要发送的数据'.encode(),('127.0.0.1',7890))
      #接收数据
      recv_data = udp_socket.recvfrom(1024) #这里会返回一个元组,有两个数据,第一个是返回的消息,第二个是数据来源的ip和端口
      data = recv_data[0].decode()
      addr = recv_data[1]
      print(data,addr)
      #关闭套接字
      udp_socket.close()

  • 建立udp服务端时,需要绑定端口

    import socket
    #创建套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定端口
    udp_socket.bind('',7890)
    #接收数据
    recv_data = udp_socket.recvfrom(1024)
    data = recv_data[0].decode()
    addr = recv_data[1]
    print(data,addr)
    #发送数据
    udp_socket.sendto('要发送的数据'.encode(),addr)
    #关闭套接字
    udp_socket.close()
    ##tcp协议:

  • 发送时必须先建立连接,是一对一的,所以数据传输一般是安全可靠的,有严格的客户端和服务端之分
  • 客户端流程
    • 创建套接字
    • 与服务端建立连接
    • 发送/接收数据
    • 关闭连接

      import socket
      #创建套接字
      client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      #与服务端连接
      client_socket.connect(('127.0.0.1',7890))
      #发送数据
      client_socket.send('这是发送的数据'.encode())
      #接收数据
      recv_data = client_socket.recv(1024).decode()
      print(recv_data)
      #关闭套接字
      client_socket.close()

  • 服务端流程
    • 创建套接字
    • 绑定端口
    • 开启监听
    • 等待客户端连接
    • 使用新的套接字与客户端连接
    • 接收/发送数据
    • 关闭新的连接,结束与该客户端的连接
    • 关闭服务端连接

      import socket
      server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      server_socket.bind(('',7890))
      server_socket.listen(10)
      new_socket,client_addr = server_socket.accept() #这里返回一个新的socket对象和客户端的地址
      recv_data = new_socket.recv(1024).decode()
      print(recv_data)
      new_socket.send('服务端发送的信息'.encode())
      new_socket.close()
      server_socket.close()

为了连接多个客户端,可将等待连接及之后的代码放入循环内:

while True:
    new_socket,client_addr = server_socket.accept() #这里返回一个新的socket对象和客户端的地址
    recv_data = new_socket.recv(1024).decode()
    print(recv_data)
    new_socket.send('服务端发送的信息'.encode())
    new_socket.close()

当关闭socket后,连接所占用的资源不会立即释放,此时再开启服务端可能会出现端口被占用的情况,此时可以设置端口复用

server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) #在绑定之前设置

转载于:https://www.cnblogs.com/being-a-tester/p/10322303.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值