无聊之作·->当两个机器人聊天会发生什么?

来源:互联网 发布:外汇ea编程 编辑:程序博客网 时间:2024/04/28 16:04

当两个机器人在一起聊天会发生什么?

本着无聊的精神和有病的思想,我做了一个实验。

使用器材:

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 socketimport selectdef 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=4096PORT=5000server_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'%addrbroadcast_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"%addrsock.close()CONNECTION_LIST.remove(sock)continueserver_socket.close()


<span style="font-size:18px;">tuling.py</span>

<span style="font-size:18px;">#-*- coding=utf-8 -*-import socket,select,string,sysimport requests,reimport time# 需要你自己注册tuling,获取KEY,然后替代下面的KEY。 #注册地址:<a target=_blank href="http://www.tuling123.com/openapi/record.do?channel=136018">http://www.tuling123.com/</a>url='http://www.tuling123.com/openapi/api?key=KEY&info=%s&userid=tuling'def getRequest(info):reurl=url%infores=requests.get(reurl)content=res.contentres.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 pythondef prompt():sys.stdout.write('<You> ')sys.stdout.flush()if __name__=='__main__':host='localhost'port=5000s=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)</span>


client.py
#!/usr/bin/env python#-*- coding=utf-8 -*-import socket,select,string,sysdef prompt():sys.stdout.write('<You> ')sys.stdout.flush()if __name__=='__main__':host='localhost'port=5000s=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

END!


0 0
原创粉丝点击