Web入门:创建TCP服务器

创建服务器:

from socket import *
from time import ctime


HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)  # 创建服务器套接字
tcpSerSock.bind(ADDR)                       # 绑定端口, 类似于接线动作
tcpSerSock.listen(5)                        # 最多监听连接:5

while True:
    print('Waiting for connection...')
    tcpCliSock, addr = tcpSerSock.accept()        # 接受客户端连接
    print('...connected from: ', addr)

    while True:
        data = tcpCliSock.recv(BUFSIZE)            # 接受BUFFSIZE大小的数据
        if not data:
            break
        # data = bytes(data, encoding="utf-8")       # str-->>bytes
        str_add = 'I am your server.\n'
        str1 = str_add + '[%s] %s' % (bytes(ctime(), 'utf-8'), data)

        tcpCliSock.send(str1.encode())        # str.encode()  str-->>bytes

    tcpCliSock.close()
tcpSerSock.close()

理解:TCP服务器套接字是一个object class,变量tcpSerSock 是一个socket的instance,后面的.bind(), .listen 是tcpSerSock的动作, bind()是“接线”动作, listen()是监听动作。其中, tcpSerSock.accept()得到来访的客户信息, 在后面的while loop 中, 和客户进行交流。这些动作必须有先后顺序。

小笔记:

str类型数据转化为bytes类型数据: str.encode('utf-8')     bytes(string, encoding='utf-8')  

bytes类型数据转换为str类型数据: bytes.decode(bytes, 'utf-8')     str(bytes, encoding='utf-8')

创建客户端:

# -*- coding: utf-8 -*-
"""
@author: Leo
"""

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

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

while True:
    data = input('>>>')
    if not data:
        break
    data = bytes(data, encoding="utf-8")     # str -->> bytes
    tcpCliSock.send(data)
    data = tcpCliSock.recv(BUFSIZE)
    if not data:
        break
    # print(data.decode('utf-8'))
    data = str(data, encoding='utf-8')        # bytes -->> str
    print(data, type(data))
tcpCliSock.close()                        # 关闭客户端

客户端与服务器通过套接字, 和HOST, PORT变量所确定的端口,进行通讯。

我把这个"口", 比作学校墙外的小卖部在学校墙上凿的洞, 小卖部是服务器, 买早餐的学生是客户端。 小卖部服务器和客户端学生同时在同一个洞(通讯地址一致)前时, 购买协议, 语言描述的物品才有了交换的意义。

在创建服务器的代码中tspSerSock.accep()返回的值tcpCliSock, 和创建客户端代码中的客户端变量tcpCliSock, 描述的分别是小卖部服务器眼中的洞, 和客户端学生眼中洞。在对于两者tcpCliSock.send()都是往洞里放交易的物品(方便面或者红票票),tcpCliSock.recv()对于两者而言都是从洞中取出墙的另一侧人放入的东西。

总结一下: tcp协议是一个墙上的洞,墙里墙外的人通过同时在动一个洞前, 做一些动作, 完成物品交换(信息交换) 

你可能感兴趣的:(Web)