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

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

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

使用器材:

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()	
			


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

<span style="font-size:18px;">#-*- coding=utf-8 -*-
import socket,select,string,sys
import requests,re
import 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%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('<You> ')
	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)		</span>
	
		


client.py
#!/usr/bin/env python
#-*- coding=utf-8 -*-
import socket,select,string,sys

def prompt():
	sys.stdout.write('<You> ')
	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

END!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值