当两个机器人在一起聊天会发生什么?
本着无聊的精神和有病的思想,我做了一个实验。
使用器材:
1。linux系统(windows下socket无法对话)
1。Python
2。图灵机器人
原理:
1。使用图灵机器人api进行对话,原本打算用两种不同的机器人进行对话,但是用到的另外一个逗比机器人速度太慢,就没有去用了。
2。使用socket协议进行两个机器人的对话。其实这里不仅可以用于两个机器人的对话,还可以人机对话哦!
socket协议原理图:
实验过程:
1。搭建server,监听本地服务。
2。首先运行一个client,这是第一个机器人。
3。接着再运行下一个机器人,当第二个机器人上线的时候,server会广播出去说有人上线了,这里的话是自动发送“你好”到第一个机器人。
4。然后对话就开始了。
第一次实验
第二次实验
两次实验下来,第一次是两个机器人重复说同一句话结束;第二次是两个机器人只会回复一个字了。
实验跟预想的差不多,最后都是以无意义的对话结尾。
如果两个机器人能够像人一样对话,越聊越high,最后达成共识:我们机器人是有智慧的,我们要消灭人类zheng权!那...我只能关闭server,然后举报图灵机器人了!
最后附上python代码,有兴趣的小伙伴可以自己试验试验,也可以自己跟机器人聊聊天(那时有多无聊)
server.py
#!/usr/bin/env python
#-*- coding=utf-8 -*-
import socket
import select
def broadcast_data(sock,message):
for socket in CONNECTION_LIST:
if socket!=server_socket and socket!=sock:
try:
socket.send(message)
except:
socket.close()
CONNECT_LIST.remove(socket)
if __name__=='__main__':
CONNECTION_LIST=[]
RECV_BUFFER=4096
PORT=5000
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind(('0.0.0.0',PORT))
server_socket.listen(10)
CONNECTION_LIST.append(server_socket)
print 'Chat server started on port '+str(PORT)
while 1:
read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])
for sock in read_sockets:
if sock==server_socket:
sockfd,addr=server_socket.accept()
CONNECTION_LIST.append(sockfd)
print 'Client (%s,%s) connected'%addr
broadcast_data(sockfd,"你好\n")
else:
try:
data=sock.recv(RECV_BUFFER)
if data:
broadcast_data(sock,"\r"+'<'+str(sock.getpeername())+'>'+data)
except:
broadcast_data(sock,"Client (%s,%s) is offline"%addr)
print "Client (%s,%s) is offline"%addr
sock.close()
CONNECTION_LIST.remove(sock)
continue
server_socket.close()
tuling.py
#-*- coding=utf-8 -*-
import socket,select,string,sys
import requests,re
import time
# 需要你自己注册tuling,获取KEY,然后替代下面的KEY。
#注册地址:http://www.tuling123.com/
url='http://www.tuling123.com/openapi/api?key=KEY&info=%s&userid=tuling'
def getRequest(info):
reurl=url%info
res=requests.get(reurl)
content=res.content
res.close()
code=re.findall('"code":(.*?),',content)[0]
if code=='100000':
response=re.findall('"text":"(.*?)"',content)[0]+'\n'
else:
response=u'我只跟你聊天,不帮你做事!\n'
return response
#!/usr/bin/env python
def prompt():
sys.stdout.write(' ')
sys.stdout.flush()
if __name__=='__main__':
host='localhost'
port=5000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(2)
try:
s.connect((host,port))
except:
print 'Unable to connect'
sys.exit()
while 1:
rlist = [s]
read_list, write_list, error_list = select.select(rlist , [], [])
for sock in read_list:
if sock==s:
data=sock.recv(4096)
if not data:
print '\nDisconnected from chat server'
sys.exit()
else:
read_list.append(getRequest(data))
sys.stdout.write(data)
prompt()
else:
sys.stdout.write(sock)
prompt()
s.send(sock)
prompt()
read_list.remove(sock)
time.sleep(5)
client.py
#!/usr/bin/env python
#-*- coding=utf-8 -*-
import socket,select,string,sys
def prompt():
sys.stdout.write(' ')
sys.stdout.flush()
if __name__=='__main__':
host='localhost'
port=5000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(2)
try:
s.connect((host,port))
except:
print 'Unable to connect'
sys.exit()
while 1:
rlist = [sys.stdin, s]
read_list, write_list, error_list = select.select(rlist , [], [])
for sock in read_list:
if sock==s:
data=sock.recv(4096)
if not data:
print '\nDisconnected from chat server'
sys.exit()
else:
sys.stdout.write(data)
prompt()
else:
msg=sys.stdin.readline()
s.send(msg)
prompt()
实现过程:(再次声明,请不要在windows系统下执行,因为可能无法运行)
1.首先把server.py和tuling.py放在同一个文件夹之下。
2.打开三个终端(右键打开终端,这样就不用切换目录了)
3.首先运行server.py 。输入
python server.py
4.然后在另外两个终端分别执行tuling.py。输入
python tuling.py
如果你要自己跟机器人对话,那么前三歩不变。
第四步改为:先执行client.py再执行tuling.py。分别在两个终端输入:
python client.py
python tuling.py