Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中的套接字,侦听端口_Python_Python 3.x_Sockets - Fatal编程技术网

Python3中的套接字,侦听端口

Python3中的套接字,侦听端口,python,python-3.x,sockets,Python,Python 3.x,Sockets,我想在Python3中监听端口 import socket sock = socket.socket() sock.bind(('', 9090)) sock.listen(1) conn, addr = sock.accept() print 'connected:', addr while True: data = conn.recv(1024) if not data: break conn.send(data.upper()) conn.c

我想在Python3中监听端口

import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

print 'connected:', addr

while True:
    data = conn.recv(1024)
    if not data:
        break
    conn.send(data.upper())

conn.close()
我要听的数据如下所示:

8,0,0,test,0,2016/07/19,14:40:57.938,2016/07/19,14:40:57.938,,,,,,,,,,,,0
8,0,0,test,0,2016/07/19,14:40:57.965,2016/07/19,14:40:57.965,,,,,,,,,,,,0
3,0,0,test,0,2016/07/19,14:41:04.687,2016/07/19,14:41:04.687,,2475,,,,,,,,,,0
..
这就是我需要阅读到“\n” 所以我需要改变这个街区,但我不知道如何

data = conn.recv(1024)
if not data:
    break
conn.send(data.upper())
我要更换nc:

nc -k -l -p 30003 | python3 script.py
其中script.py

while True:
    for string in sys.stdin:

此外,我还需要重新连接如果出现问题,服务器必须随时准备接收所有数据,就像nc-k-l-p 30003 | python3 script.py一样。主要思想是一直读取,直到在流中找到字符为止。当然\n您正在读取的字节可能超过1024字节,因此您需要将读取的所有内容存储在缓冲区中。这可以通过以下类进行模拟:

while True:
    for string in sys.stdin:
class SocketLineReader:
    def __init__(self, socket):
        self.socket = socket
        self._buffer = b''

    def readline(self):
        pre, separator, post = self._buffer.partition(b'\n')
        if separator:
            self._buffer = post
            return pre + separator

        while True:
            data = self.socket.recv(1024)
            if not data:
                return None

            pre, separator, post = data.partition(b'\n')
            if not separator:
                self._buffer += data
            else:
                data = self._buffer + pre + separator
                self._buffer = post
                return data
使用方法:

import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)

conn, addr = sock.accept()

print('connected:', addr)

reader = SocketLineReader(conn)
while True:
    data = reader.readline()
    print(data)
    if not data:
        break
    conn.send(data.upper())

conn.close()
如果希望服务器永远提供数据,请使用另一个while循环:

这种方法的问题是没有并行性。您的服务器无法处理并行连接。解决此问题的一种方法是将每个新连接发送到单独的线程:

import socket
import threading

def handle(conn):
    print('connected:', addr)
    reader = SocketLineReader(conn)
    # The other code goes here

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)

while True:
    conn, addr = sock.accept()
    threading.Thread(target=handle, args=(conn,)).start()

在达到性能极限之前,这应该是正常的。有一些方法可以提高效率,例如事件循环,但我认为这是超越这个问题的。

这绝对是我想要的。但是有一些麻烦:当我第一次连接时:nc localhost端口Ctrl+C,脚本完成。是否可以将其修改为始终工作?谢谢。@user7365441您只需告诉您的侦听套接字永远接受即可,即在一个while循环中。我已经更新了答案。太好了!非常感谢。