Python 网络套接字编程

13 篇文章 0 订阅
6 篇文章 1 订阅
【网络套接字】
一、使用 TCP协议
1)客户端/Client
    # 模块 socket 提供了创建网络套接字的函数
    # 创建 socket 时需要指明 IP层协议 和 传输层协议
    # 使用 socket 进行连接时要以 元组 的形式指明目标的 URL 和 端口号
    import socket
    recBuffer = []
    act = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 使用 IPv4 和 TCP
    act.connect(('10.62.36.88', 12345))    # 目标URL 和 端口号 以 元组 的形式指明
    print 'Waiting for response...'
    while True:    # 使用循环保证数据全部被接收
        data = act.recv(1)    # 阻塞式接收数据,每次最多接收 1Byte
        if data != '^':
            recBuffer.append(data)
        else:    # 如果接收到的数据为空说明数据接收完毕,跳出循环
            break
    data = ''.join(recBuffer)
    print data
    act.send('Python脚本编程之套接字')
    print 'Message been sent.'
    act.send('^')
    print 'Terminate signal been sent.'
    act.close()    # 关闭socket,千万别忘了
2)服务器端/Server
    # 服务器端程序应该以多线程方式编写,并发处理来自多处的请求
    # 服务器端运行在本地网络,监听 127.0.0.1
    # 服务器端运行在本机所有网卡,监听 0.0.0.0
    # 服务器端运行在指定网卡,监听该网卡IP xxx.xxx.xxx.xxx
    import socket, threading
    def newConnection(newSocket, newAddress):    # 负责处理连接请求的子线程所调用的函数
        recBuffer = []
        print 'new connection request detected, IP is %s port %s' %(newAddress)
        newSocket.send('Server is dealing with your request. Your IP is %s port %s\nPlease standby...' %(newAddress))
        print 'Message been sent. Waiting for response...'
        newSocket.send('^')
        print 'Terminate signal been sent.'
        while True:
            data = newSocket.recv(1)
            if not data or data == '^':    # 如果接收到的数据为空,或客户端发送了 '^' 则停止接收数据
                break
            else:
                recBuffer.append(data)
        data = ''.join(recBuffer)
        print data
        print 'link going down, target IP is %s port %s' %(newAddress)
        newSocket.close()    # 一定不要忘了关闭 socket
    act = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 使用 IPv4 和 TCP
    act.bind(('10.62.36.88', 12345))    # 绑定主机上 IP 为 10.62.36.88 的网卡,打开端口 12345 等待连接
    print 'Listening on port 12345, max number of link is 10...'
    act.listen(10)    # 开始监听 12345 端口,并设置最大连接数为 10
    while True:
        newSocket, newAddress = act.accept()    # 阻塞式接受连接请求,返回值是一个 (sock, addr)元组
        thr = threading.Thread(target = newConnection, args = (newSocket, newAddress))    # 新建线程去处理请求
        thr.start()    # 启动线程

二、使用 UDP协议
1)客户端/Client
    import socket
    act = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print 'Ready to send UDP data to 10.62.36.88...'
    while True:
        data = raw_input('data to send: ')
        if data != 'disconnect':
            act.sendto(data, ('10.62.36.88', 12345))
            data = act.recv(512)
            print data
        else:
            break
    act.close()
2)服务器端/Server
    # UDP是 面向无连接 的协议,传输速度比 TCP协议快,但不如 TCP协议可靠
    # UDP协议 与 TCP协议 可以同时使用一个端口
    # 因为 UDP协议监听所有发到指定端口的数据,所以在本示例的情形下不使用多线程也可以接收多个客户端数据
    import socket
    act = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    # 使用 IPv4 和 UDP
    print 'Waiting UDP data on port 12345...'
    act.bind(('10.62.36.88',  12345))
    while True:
        newData, newAddress = act.recvfrom(512)
        print newAddress, newData
        act.sendto('-- Reply from server: data recieved! --', newAddress)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值