1

我有一个 Blender 代码,它从 csv 文件中获取数据集,并使用它们在游戏引擎中旋转机器人手臂和人体模型。此代码工作正常,但现在我想通过无线连接将数据发送到 Blender。

我在 Blender 中设置了一个服务器代码(在 Python 3 上运行)

# Server Program
# Make sure the client is being run on the data generation computer

SERVER_LOOP = True

import socket
import sys
import json
import bge

cont = bge.logic.getCurrentController()
owner = cont.owner

print ('INFO: Starting up')


# Create a TCP/IP socket to listen on
print ('INFO: Creating TCP/IP Socket')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Prevent from 'ADDRESS ALREADY IN USE' upon restart
print ('INFO: Housekeeping...')
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind the socket to port 8081 on all interfaces
server_address = ('localhost', 8081)
print ('INFO: Binding and starting up on %s port %s' % server_address)
server.bind(server_address)
print ('INFO: Server bound')

def send_welcome(cont):
    cont.send('SERVER: Welcome'.encode('utf8'))

# Listen for connectons for 5 seconds
server.listen(5)

# Connection is the SOCKET OBJECT for the connection
# Client_address is the connected peer(the client)
connection, client_address = server.accept()
print ('INFO: Connection from', connection.getpeername())
print ('INFO: Sending welcome msg')
send_welcome(connection)
print ()

while SERVER_LOOP:

    # Receive data
    try:
        data = connection.recv(10000)

    # Unless there's an error
    except OSError:
        print (connection)

    # Decode the data into usable lists
    if type(data) != type(''): 
        data = data.decode()

    # If we want to end the client stream but keep the server running    
    if data=='end' or data=='End' or data=='END':
        print ('INFO: Closing connection with ',connection.getpeername())
        connection.shutdown(socket.SHUT_RD | socket.SHUT_WR)
        print ()
        connection.close()
        connection, client_address = server.accept()
        print ('INFO: Connection from', connection.getpeername())
        print ('INFO: Sending welcome msg')
        send_welcome(connection)
        print ()

    # If we want to stop running the server
    elif data=='end server' or data=='End server' or data=='End Server':
        print ()
        print ('SERVER SHUT DOWN')
        SERVER_LOOP = False

    # Display when data is loaded back on the client side
    else:
            # gives feedback in server command line
            data = json.loads(data)
            owner['test'] = data
            print ('CLIENT: %s' % data)
            message = 'ping'
            connection.send(('SERVER: %s' % message).encode('utf-8'))
            print ('SERVER: %s' % message)

以及与它一起运行的客户端代码(这个在 Python 2.7 上运行)

# Client Program
# Make sure the server is being run in Blender

import socket
import time
import json

print 'INFO: Creating Socket'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

ip_addr = raw_input('IP: ')
port_addr = raw_input('PORT: ')

# Type 'localhost' in the IP field
# Type '8081' in the PORT field

print 'INFO: Connecting to server'
s.settimeout(5) # Times out if 5 seconds without connecting to client
s.connect((ip_addr, int(port_addr)))

# Listen for welcome
data = s.recv(10000)
print data
print ''
while 1:
    message = raw_input('CLIENT: ')
    if message=='end' or message=='End' or message=='END':
            print ''
            print 'SHUTTING DOWN CLIENT, SERVER STILL RUNNING'
            s.send(message)
            break
    elif message=='end server' or message=='End server' or message=='End Server':
            print ''
            print 'SHUTTING DOWN SERVER'
            s.send(message)
            break
    else:
            s.send(message)
            data = s.recv(10000)
            print data

print 'INFO: Closing socket'
s.close()
print 'INFO: Quitting'

现在,显然这不会进行旋转;这只是一个测试脚本,以确保两者之间的数据传输正常。确实如此——在 Blender 的系统控制台中,数据按我想要的方式显示。但是,我在 Blender 中有一个名为“test”的字符串调试属性,它应该显示刚刚在客户端输入的当前数字,直到我关闭整个程序。

例如:

  • 我在 Blender 中运行服务器脚本
  • 我在 IDLE 中运行客户端脚本
  • 我在客户端输入数字
  • 它们出现在服务器端的系统控制台中,但它们不会出现在游戏引擎中
  • 我从客户端关闭服务器
  • 现在,我输入的最后一个数字终于出现在服务器端了

所以问题是 Blender 运行我的脚本,然后在它完成后运行游戏引擎,但我希望它们同时运行。

如果我的解释没有意义,请告诉我;如果需要,我可以为我的东西提供下载。

4

1 回答 1

1

我不知道这是否仍然是一个问题 - 你在 2 月发布,现在是 8 月,但我只是在寻找类似问题的答案。您的问题是 Blender 在脚本完成运行之前不会更新其帧。您的游戏实际上卡在它播放的第一帧上,因为它在该帧命中时立即启动脚本,并且由于脚本的性质,永远不会结束。

目前,您使用 server.listen(5) 表示它侦听 5 秒,但该函数中的数字 5 指的是积压而不是时间长度[source]。socket.listen() 将无限期地停止您的游戏(据我所知),就像无限循环一样。

这可能不是您正在寻找的答案,但它绝对是一个答案。

于 2013-08-14T17:55:50.853 回答