psychopy心理學編程 socket聯機通信示例

psychopy 定作實驗程序 https://item.taobao.com/item.htm?spm=a230r.1.14.6.Q6E2OW&id=530690095131&ns=1&abbucket=15#detailpython

有的實驗會用到兩臺電腦聯機,要求被試互相爲對方分配賞金或者得分,要求被試之間合做或者競爭。有時咱們會用假被試,即讓被試玩單機的,但卻告訴他是聯機的。這個方式雖然很機智,但有時也充滿了遺憾——若是真的能夠讓被試作真正的聯機任務該多好!網絡

在這裏,分享一個聯機通信腳本,如下是腳本運行過程和腳本文件。具體的思路請自行參悟,或者app

from pydoc import help
import socket
help(socket.socket)

運行成果

秒拍視頻 http://www.yixia.com/u/paike_r2r9ujpkf9socket

運行過程

  1. 把兩臺計算機鏈接到同一網絡內,推薦鏈接在同一個WIFI下或者路由器下。使用路由器或WIFI熱點的DHCP爲計算機分配IP地址(一般是自動的),或者手動分配。令一臺計算機爲主機,令另外一臺爲輔助機。
  2. 把service.py與client.py中的IP地址改爲主機的IP地址。
  3. 把service.py拷貝到主機,把client.py拷貝到輔助機。
  4. 運行service.py,出現一個黑框。
  5. 運行client.py,主機與輔助機同時全屏出現psychopy界面。
  6. 在輔助機上按任意鍵,會顯示在主機上。按"q"鍵結束。

示例代碼

service.py

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 04 22:53:45 2016

@author: zbg
"""

import socket
import sys
import threading

def WaitFor(connect, s):
    while connect.recv(1024) != s:
        pass


HOST = '192.168.1.102'
PORT = 8888 
data = ''

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
                    

con, addr = s.accept()
WaitFor(con, 'start')



from psychopy.visual import Window, ImageStim, TextStim
from psychopy import core, event, gui, clock
done = False
win = Window(fullscr = True)
while not done:
    key = con.recv(1024)
    if key =='q':
        done = True
    
    t =TextStim(win, key ,pos=(0,-0.0), height = 1.5)
    t.draw()
    win.flip()

win.close()
s.close()

client.py

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 05 16:33:06 2016

@author: zbg
"""

import socket
import threading


ip = '192.168.1.102'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, 8888))
sock.send('start')

from psychopy.visual import Window, ImageStim, TextStim
from psychopy import core, event, gui, clock

win = Window(fullscr = True)
t =TextStim(win, u"我是鍵盤,按q退出" ,pos=(0,-0.0))
t.draw()
win.flip()

keys = event.getKeys()
while 'q' not in keys:
    if len(keys) > 0:
        print keys[0]
        sock.send(keys[0])
    keys = event.getKeys()

sock.send('q')
sock.close()
win.close()
相關文章
相關標籤/搜索