使用select()时如何发送流槽套接字?

2024-05-29 05:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

经过长时间的研究和测试,我终于问到这里。在

我的脚本必须处理多个客户端连接,同时必须从另一个套接字获取和发送流。在

最后,我终于可以让它工作,但只为一个用户。该用户连接到套接字,脚本连接到另一个套接字,然后将流返回给客户端。 脚本运行得很好,但有一些硬限制: -它把数据流发送给客户,但是, -即使套接字处于非阻塞模式,我认为在另一个套接字中调用一个套接字是它像在阻塞模式下那样反应的主要原因(因为其中一个套接字在不断地发送数据?)在

顺便说一句,我认为select()方法可以让我做我想做的事情,但我不清楚如何做。在

这是服务器代码taht适用于一个客户机,但正在阻塞

#!/usr/bin/env python
# coding: utf-8 

from __future__ import print_function

import sys, time, base64, socket

server_ip = 'XX.XX.XX.XX'

def caster_connect(connected_client, address):
    username = 'XXXXXXX'
    password = 'XXXXXXXXX'
    host = 'XX.XX.XX.XX'
    port = 2102
    pwd = base64.b64encode("{}:{}".format(username, password).encode('ascii'))
    pwd = pwd.decode('ascii')
    u_message = ''
    stream_type = 'CMRp'

    header = \
    "GET /" + str(stream_type) + " HTTP/1.1\r\n" +\
    "Host " + str(host) + "\r\n" +\
    "Ntrip-Version: Ntrip/1.0\r\n" +\
    "User-Agent: my_script.py/0.1\r\n" +\
    "Accept: */*\r\n" +\
    "Authorization: Basic {}\r\n\r\n".format(pwd) +\
    "Connection: close\r\n"

    print("Connecting to caster...\n")

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host,int(port)))
    s.send(header.encode('ascii'))
    print("Waiting answer from caster...\n")

    while True:
        try:
            data = s.recv(2048)

            connected_client.send(data)
            print("Sending data from caster at %s" % time.time())
            sys.stdout.flush()
        # On any error, close sockets
        except socket.error, e:
            print("No data received from caster : %s" % e)
            print("Close client connection at %s" % format(address))
            s.close()
            break

    return

#----------------

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((server_ip, 5680))
sock.settimeout(3)

try:
    while True:
        try:
            sock.listen(5)
            client, address = sock.accept()
            print ("%s connected" % format(address) )

            msg = client.recv(4096)
        except socket.timeout, e:
            err = e.args[0]
            if err == 'timed out':
                print("Timed out, retry later")
                continue
            else:
                print(socket.error)
                sock.close()
        except socket.error:
            print(socket.error)
            sock.close()
        else:
            if len(msg) == 0:
                print("Shutdown on client end")
                sock.close()
            else:
                print(msg)
                caster_response = caster_connect(client, address)
        sys.stdout.flush()

    print("Close")
    client.close()
    sock.close()`enter code here`
except keyboardInterrupt:
    print("W: Keyboard interrupt, closing socket")
finally:
    sock.close()

这是我找到的处理select()的代码

^{pr2}$

在这段代码中(在this page)我没有做任何更改,因为我不知道如何处理它。在

也许通过创建另一个只处理流部分的服务器脚本,那么主脚本将充当客户端的服务器,但作为流部分的客户端?在


Tags: from脚本clientformat客户端closedataaddress

热门问题