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的客户端,就可以实现硬件跟服务器通信

后面的话就是解决一些多个客户端对服务器发数据,在服务器那里将数据识别,分出数据来自哪个下位机,分清楚之后就开始对数据进行一个检验和存入数据库的操作。

上一篇:当今[远程抄表](http://hkhuake.com.cn/)的所有无线通信模式---手机基站移动无线通讯网络


下一篇:茶树变身“脱贫树”,春季茶园管理,茶园土壤墒情监测系统