我是python的新手。我目前正在尝试在程序中制作和使用套接字列表/数组。所以我声明了一个数组如下:
myCSocks = ['CSock1', 'CSock2', 'CSock3', 'CSock4', 'CSock5']
我正在尝试使用我的数组元素如下:
myCSocks[i], addr = serverSocket.accept()
message = myCSocks[i].recv(1024)
我收到以下错误:
Traceback (most recent call last):
File "./htmlserv_multi.py", line 22, in <module>
message = myCSocks[i].recv(1024)
AttributeError: 'str' object has no attribute 'recv'
这种对我有意义,它说我的数组元素是String类型而不是套接字。所以我明白我的问题是什么,但我不知道如何解决它。我用google搜索“套接字python列表”,但没有找到任何东西。任何帮助将不胜感激。谢谢。
PS:我的最终目标是创建一个非常简单的多线程TCP Web服务器(使用python)
CODE:
#! /usr/bin/env python
from socket import *
#does this work?
myCSocks = []
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('192.168.1.4',12000))
serverSocket.listen(5)
while True:
for i in range(0, len(myCSocks)+1):
myCSocks[i], addr = serverSocket.accept()
try:
for i in range(0, len(myCSocks)):
message = myCSocks[i].recv(1024)
filename = message.split()[1]
f = open(filename[1:])
outputdata = f.read()
myCSocks[i].send('HTTP/1.1 200 OK\r\n\r\n')
for p in range(0, len(outputdata)):
myCSocks[i].send(outputdata[p])
myCSocks[i].close()
except IOError:
connectionSocket.send('HTTP/1.1 404 Bad Request\r\n\r\n')
connectionSocket.send('<HTML><p>ERROR 404: BAD REQUEST!</p></HTML>')
serverSocket.close()
exit()
答案 0 :(得分:1)
如果CSock1是已经定义的类,您可以只引用类对象。但是,如果您尝试执行多线程,则可以采用更好的方法:Multithreaded web server in python。如果你只是想使用套接字,我会看Multi Threaded TCP server in Python(第二个答案是最好的)。
答案 1 :(得分:1)
在这里查看内置的套接字模块(http://docs.python.org/2/library/socket.html)。这允许您创建套接字,发送和接收数据,在线文档中有简单的示例。如果用实际套接字替换字符串,您的代码可能会起作用。如果要按名称存储多个套接字,可以使用字典:
theDict = {}
theDict['socket1'] = socket.socket()
等
答案 2 :(得分:0)
一个非常简单的回显TCP(SOCK_STREAM
)服务器,演示了如何实现多处理服务器。利用threadPoolExecutor
来
异步接受连接。
import socket
import concurrent.futures
def server_instance(addr):
HOST = addr[0]
PORT = addr[1]
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Linked with: {addr}")
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
return f'DONE'
addresses = [
('127.0.0.1', 65432),
('127.0.0.1', 65431),
('127.0.0.1', 65433),
('127.0.0.1', 65435),
('127.0.0.1', 65434),
]
with concurrent.futures.ThreadPoolExecutor() as executor:
for address, status in zip(addresses, executor.map(server_instance, addresses)):
print(f"{address}: {status}")
客户端将数据发送到服务器。
import socket
import sys
HOST = '127.0.0.1'
if len(sys.argv) != 3:
print(f"[*] Usage: python {sys.argv[0]} <PORT> <MESSAGE>")
sys.exit()
PORT = int(sys.argv[1])
print(f"PORT SET TO: {PORT}")
MSG = bytes(sys.argv[2], encoding='utf8')
print(f"MESSAGE SET TO: {MSG}")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(MSG)
data = s.recv(1024)
print(f'[r] {repr(data)}')
f字符串需要python3.6及以上版本
当前期货需要python 3.2及更高版本