zoukankan      html  css  js  c++  java
  • python网络编程(Socket、TCP、UDP)

    Socket 是网络编程的一个抽象概念,通常我们用一个Socket表示 “打开了一个网络链接”,而打开一个Socket 需要知道目标计算机的IP 地址和端口号,再指定协议类型即可。python 提供了两个级别的网络服务

    • 1.低级别的网络服务支持基本的Socket,它提供了标准的BSD Sockets API ,可以访问底层操作系统Socket 接口的全部方法
    • 2.高级别的网络服务模块Socket Server ,它提供了服务器中心类,可以简化网络服务器的开发

    socket() 函数,python中我们使用socket 函数来创建套接字,语法格式如

    • socket.socket(family[,type[,protocal]])

    • 参数

      • family 套接字家族可以使用AF_UNIX(单一进程通信) 或者 AF_INET(服务器通信)
      • type 套接字类型可以根据是面向连接的还是非连接分为SCOKET_STREAM 或SOCKET_DGRAM
      • protocol 一般不填默认为0

    TCP编程

    • 网络编程包括两部分:服务端和客户端,TCP是一种面向连接的通信方式,主动发动连接的叫客户端,被动响应的叫服务端。
    • 创建服务端5步骤:
      • 1 创建socket,绑定Socket到本地ip
      • 2 开始监听连接
      • 3 进入循环,不断接受客户端的连接请求
      • 4 接收传来的数据,并发送给对方
      • 5传输完毕,关闭Socket
    
    #coding:utf-8
    #创建TCP服务端
    import socket
    import threading
    import time
    def dealClient(sock, addr):
        #第四步:接收传来的数据,并发送给对方数据
        print('Accept new connection from %s:%s...' % addr)
        sock.send(b'Hello,I am server!')
        while True:
            data = sock.recv(1024)
            time.sleep(1)
            if not data or data.decode('utf-8') == 'exit':
                break
            print '-->>%s!' % data.decode('utf-8')
            sock.send(('Loop_Msg: %s!' % data.decode('utf-8')).encode('utf-8'))
        #第五步:关闭套接字
        sock.close()
        print('Connection from %s:%s closed.' % addr)
    if __name__=="__main__":
        #第一步:创建一个基于IPv4和TCP协议的Socket
        # 套接字绑定的IP(127.0.0.1为本机ip)与端口
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('127.0.0.1', 9999))
        #第二步:监听连接
        s.listen(5)
        print('Waiting for connection...')
        while True:
            # 第三步:接受一个新连接:
            sock, addr = s.accept()
            # 创建新线程来处理TCP连接:
            t = threading.Thread(target=dealClient, args=(sock, addr))
            t.start()
    

    socket.SOCK_STREAM用于TCP

    • 接着编写客户端,3步骤:
      • 1 创建Socket,连接远端地址
      • 2 连接后发送数据和接收数据
      • 3 传输完毕,关闭Socket
    #coding:utf-8
    import socket
    #初始化Socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #连接目标的ip和端口
    s.connect(('127.0.0.1', 9999))
    # 接收消息
    print('-->>'+s.recv(1024).decode('utf-8'))
    # 发送消息
    s.send(b'Hello,I am a client')
    print('-->>'+s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    #关闭套接字
    s.close()
    

    运行截图:

    • 服务端:

    • 客户端:

    C:Python27python.exe F:/python_scrapy/python_study/TCP_client.py
    -->>Hello,I am server!
    -->>Loop_Msg: Hello,I am a client!
    
    Process finished with exit code 0
    
    

    UDP编程

    • 不需要建立连接

    • 速度快

    • 不关心是否到达目的地

    • 通信双方以流的形式发送数据

      • 服务端程序:
    #coding:utf-8
    import socket
    #创建Socket,绑定指定的ip和端口
    #SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样。
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(('127.0.0.1', 9999))
    print('Bind UDP on 9999...')
    while True:
        # 直接发送数据和接收数据
        data, addr = s.recvfrom(1024)
        print('Received from %s:%s.' % addr)
        s.sendto(b'Hello, %s!' % data, addr)
    
    
    - 客户端:
    
    #coding:utf-8
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    for data in [b'Hello', b'World']:
        # 发送数据:
        s.sendto(data, ('127.0.0.1', 9999))
        # 接收数据:
        print(s.recv(1024).decode('utf-8'))
    s.close()
    

    socket.SOCK_DGRAM用于UDP

  • 相关阅读:
    网站数据库
    提笔不知道说啥
    预祝大家新年快乐
    又..
    明日出发
    吸气呼气
    网吧
    光阴似箭
    <转>生活中的各种食品安全问题
    老了吗?
  • 原文地址:https://www.cnblogs.com/guguobao/p/9400534.html
Copyright © 2011-2022 走看看