Python使用socket搭建TCP服务器(后期的客户端:GPRS模块)
作者:互联网
socket模块
其实不只是Python,例如C#,Java等都会有这个模块
百度百科:socket是一种操作系统提供的进程间通信机制。[1] 在操作系统中,通常会为应用程序提供一 组应用程序接口(API),称为套接字接口(英语:socket API)。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。最早的套接字接口来自于4.2 BSD,因此现代常见的套接字接口大多源自Berkeley套接字(Berkeley sockets)标准。在套接字接口中,以IP地址及通信端口组成套接字地址(socket address)。远程的套接字地址,以及本地的套接字地址完成连线后,再加上使用的协议(protocol),这个五元组(five-element tuple),作为套接字对(socket pairs),之后就可以彼此交换数据。例如,在同一台计算机上,TCP协议与UDP协议可以同时使用相同的port而互不干扰。
操作系统根据套接字地址,可以决定应该将数据送达特定的行程或线程。这就像是电话系统中,以电话号码加上分机号码,来决定通话对象一般。
概念太复杂,只需记住这个Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。是用来写网络编程的,比如说TCP,UDP通信,新手入门的话一般都是用写两个Py文件,一个是服务器(server),一个是客户端(可以写多个客户端,一起和server通信)
UDP和TCP对比
TCP:安全,在进行通信之前必须先建立一个连接,该连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这种类型的通信也称为虚拟电路或流套接字。
UDP:不安全,与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。
在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。
代码
server
首先是用socket创一个对象
参数:SOCK_DGRAM
AF_INET:面向网络的套接字,一般写用这个,除此之外还有一个套接字是面向文件的–>AF_UNIX
SOCK_STREAM:TCP套接字(固定的) 如果写的是UDP则用:
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ddress='127.0.0.1' #127.0.0.1是监听本机
port=12345 #监听自己的哪个端口
buffsize=1024 #接收从客户端发来的数据的缓存区大小
服务器代码
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("0.0.0.0", 9001))
server.listen()
conn, addr = server.accept()
while True:
# info = input('>>>') # 输入数据,编码并发送给客户端
# info = info.encode('utf-8')
# conn.send(info)
c_info = conn.recv(5120).decode('utf-8') # 接受客户端消息并解码
if len(c_info)>0:
print(c_info)
#conn.send(data="I am server,message is dealing")
conn.close()
server.close()
我使用的host是 0.0.0.0,可以实现任意连接
(在这里写的都是单向通信,也就是客户端向服务器发送数据)
client
import socket
if __name__ == '__main__':
# 获取本机计算机名称
hostname = socket.gethostname()
# 获取本机ip
ip = socket.gethostbyname(hostname)
#client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client = socket.socket()
client.connect((ip, 9001))
while True:
info = input('>>>') # 输入数据,编码并发送给服务端
info = info.encode('utf-8')
client.send(info)
s_info = client.recv(1024) # 接受服务端的消息并解码
s_info = s_info.decode(encoding='utf-8')
print(s_info)
if s_info == 'bye': # 如果服务端发送的消息为bye,回复bye,结束循环
client.send(b'bye')
print('bye_1')
break
client.close()
(另外一个角度来说,也可以用现成的网络调试助手来向写好的TCP服务器发数据)
最后面把server的代码跑在Linux系统上,也可以接受任意电脑(客户端)发来的数据
后期的话就把GPRS写成一个TCP的客户端,就可以实现硬件跟服务器通信
后面的话就是解决一些多个客户端对服务器发数据,在服务器那里将数据识别,分出数据来自哪个下位机,分清楚之后就开始对数据进行一个检验和存入数据库的操作。
标签:GPRS,info,socket,Python,TCP,server,接字,客户端 来源: https://blog.51cto.com/u_15195370/2764055