我是套接字的新手。我正在为相机网络编写程序。现在我使用两个摄像头捕捉图像并获得红色物体的位置。每个摄像头都连接到客户端。我正在使用线程来从两个客户端获取数据。
我能够查看获得的数据,但由于原因我无法操纵数据。
这是我的代码:
tc1.py
import socket
import cv2
import numpy as np
import PySal
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
xt, yt = PySal.track_R(frame)
if xt > 0 :
tt = "c1 = "str(xt) + ", " + str(yt)
clientsocket.send(tt)
tc2.py
import socket
import cv2
import numpy as np
import PySal
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8088))
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
xt, yt = PySal.track_R(frame)
if xt > 0 :
tt = "c2 = "str(xt) + ", " + str(yt)
clientsocket.send(tt)
ts1.py
import socket
def ts1():
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(5)
connection, address = serversocket.accept()
while True:
buf = connection.recv(64)
if len(buf) > 0:
print buf
ts2.py
import socket
def ts2():
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8088))
serversocket.listen(5)
connection, address = serversocket.accept()
while True:
buf1 = connection.recv(64)
if len(buf1) > 0:
print buf1
server.py
from ts1 import ts1
from ts2 import ts2
from threading import Thread
if __name__ == '__main__':
Thread(target = ts1).start()
Thread(target = ts2).start()
所以基本上我正在线程ts1.py和ts2.py来获取两个客户端的输入。
有没有办法做同样的事情,但有一台服务器和两台客户端?
答案 0 :(得分:0)
通过更新ts1并删除ts2来拥有服务器控制器。
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8088))
serversocket.listen(5)
While True:
connection, address = serversocket.accept()
Thread reader_thread passing in connection - exit on end of read.
这会生成服务于一个连接的短期线程,读取文件然后退出。由于我们没有被读取延迟,因此accept可以连接到任意数量的客户端。
基于代码的更完整的示例是:
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8088))
serversocket.listen(5)
While True:
connection, address = serversocket.accept()
def receiver():
buf1 = connection.recv(4096)
while True:
if len(buf1) > 0:
print buf1
rt = Thread(target=receiver)
此方法将线程视为具有访问来自调用函数的连接的闭包。或者,线程创建有一个' args'选项,以便您可以传入数据。对于OO方法,您可以基于Thread创建一个类。
我假设您的代码中相机读取器线程永远不会终止。如果抛出异常或套接字丢失,应该改进代码以重新连接。这将在客户端/相机端。
请注意,线程重量轻。他们共享记忆。当您更换"打印buf1"更多的东西,注意不要用信号量更新公共对象,并锁定乱丢线程交互代码。