python实现tcp服务器和客户端(socket)

python实现tcp服务器和客户端(socket)

1.socket模块

socket是什么

socket最初是为了同一主机上的应用程序创建的,使得一个程序与另外一个程序之间可以通信,也就是所谓的进程间通信,有两种类型的socket:基于文件和面向网络的。
socket层级结构

  • UNIX 套接字是我们所讲的套接字的第一个家族,并且拥有一个“家族名字”AF_UNIX(又名 AF_LOCAL,在 POSIX1.g 标准中指定),它代表地址家族(address family):UNIX。包括 Python 在内的大多数受欢迎的平台都使用术语地址家族及其缩写 AF;其他比较旧的统可能会将地址家族表示成域(domain)或协议家族(protocol family),并使用其缩写 PF 而非 AF。类似地,AF_LOCAL(在 2000~2001 年标准化)将代替 AF_UNIX。然而,考虑到后向兼容性,很多系统都同时使用二者,只是对同一个常数使用不同的别名。Python 本身仍然在使用 AF_UNIX。

  • 第二种类型的套接字是基于网络的,它也有自己的家族名字 AF_INET,或者地址家族:因特网。另一个地址家族 AF_INET6 用于第 6 版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前 AF_INET 是使用得最广泛的。

2.创建tcp时间戳服务器

创建tcp服务器和客户端的基本流程
在这里插入图片描述

from socket import *
from time import ctime

HOST = ''
PORT = 31188
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)#初始化
tcpSerSock.bind(ADDR)
tcpSerSock.listen()#监听端口

while True:
    print('witing for connection')#等待cilent的连接
    tcpCliSock, addr = tcpSerSock.accept()
    print('connected from:{}'.format(addr))

    while True:
        data = tcpCliSock.recv(BUFSIZ).decode()#接受的字符
        if not data:
            break
        tcpCliSock.send(ctime().encode())#发送字符
    tcpCliSock.close()
tcpSerSock.close()#关闭端口

  1. 创建socket前必须使用socket.socket()函数,socket_family 为AF_INET即为第二类的socket面向网络的,还有一种AF_INET6 面向ipv6网络。socket_type为AF_STREAM或AF_DGARM。现在建立tcp服务器也就是第一种。
  2. bind()绑定端口,listen() 监听端口,
  3. accept()被动接受客户端的连接(阻塞),并返回一个独立的客户端socket,这是一个独立的队列,用来和即将到来的消息进行交换。在这里插入图片描述
  4. recv()接受消息但是接收到的消息为bytes,使用decode()解码为str格式,对应的send()函数也应该用encode()进行编码,才能正常的通讯。
  5. 最后将两个队列accept和syn队列都关闭,结束通讯。

3.tcp客户端

from socket import *

HOST = '127.0.0.1'
PORT = 31188
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    sdata = input('> ')
    if not sdata:
        break
    tcpCliSock.send(sdata.encode())
    rdata = tcpCliSock.recv(BUFSIZ).decode()
    if not rdata:
        break
    print(rdata)
tcpCliSock.close()
  • 需要注意的是HOST为127.0.0.1,这也是localhost即为本机的地址,如果要两个主机通讯的话则需要设置为目标主机的ip。

4.执行tcp服务端和客户端

  • 服务端在这里插入图片描述
  • 客户端
    在这里插入图片描述
    这样就实现了通讯。得到了服务器的时间戳。

5.实际应用

分布式主机经常会因为时间不同步问题而产生问题,我们就可以用python写简单的脚本,实现简单的时间同步脚本。

猜你喜欢

转载自blog.csdn.net/qq_36361250/article/details/84453499