采用socket编程,完成两个树莓派之间、或者树莓派与Ubuntu系统之间的网络文字通信(或聊天)
分析:
首先我们需要了解socket编程的原理以及它是怎么实现的。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,下面这张图片很好地表述了socket实现的过程。
图片来源于百度百科
语言选择
我所用的是Python,其他语言(c,c++,Java,php等)的网络编程应该网上有很多,我个人爱好用Python,刚好最近也在学习Python的一些知识。那我们可以进入到Python官方提供的关于socket函数中去看
https://docs.python.org/3/library/socket.html
现在开始写代码
根据我们的需求:实现两台设备之间的网络聊天。我写的比较简单,就是一台设备发送一条消息,只有接收到消息后才能再发送(即一人一次只能发送一条消息,需对方回复后再发送第二条消息)
接下来直接上代码,写的简单,也没进行优化,可改度也不大。
服务器端
import socket
import datetime
import time
host = socket.gethostname()
port = 12345
Arr=(host,port)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(Arr)
s.listen(1)
sock,addr = s.accept()
print('Connection Success1')
info = sock.recv(1024).decode()
while info != 'exit':
print('Client:'+info)
now='--'+datetime.datetime.ctime(datetime.datetime.now())
send_mes =input()+ str(now)
sock.send(send_mes.encode())
if send_mes =='exit':
break
info = sock.recv(1024).decode()
sock.close()
s.close()
然后是客户端`
import socket
s= socket.socket()
host = "这里是你要连接的主机ip地址"
port = 12345
Arr=(host,port)
s.connect(Arr)
print('Linked Success!')
info = ''
while info != 'exit':
print('Server:'+info)
send_mes=input()
s.send(send_mes.encode())
if send_mes =='exit':
break
info = s.recv(1024).decode()
s.close()
然后就可以简单的聊天了。