Python3中的套接字,侦听端口
我想在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
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循环中。我已经更新了答案。太好了!非常感谢。