Python One服务器和多个客户端

时间:2015-08-04 21:10:44

标签: python-2.7 sockets camera client server

我是套接字的新手。我正在为相机网络编写程序。现在我使用两个摄像头捕捉图像并获得红色物体的位置。每个摄像头都连接到客户端。我正在使用线程来从两个客户端获取数据。

我能够查看获得的数据,但由于原因我无法操纵数据。

这是我的代码:

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来获取两个客户端的输入。

有没有办法做同样的事情,但有一台服务器和两台客户端?

1 个答案:

答案 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"更多的东西,注意不要用信号量更新公共对象,并锁定乱丢线程交互代码。