day26-2 基于TCP协议的套接字编程

基于TCP协议的套接字编程

套接字

套接字有两种,分别是基于文件型和基于网络型

  • 基于文件类型的套接字家族:AF_UNIX,unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一文件系统间接完成通信
  • 基于网络类型的套接字家族:AF_INET

套接字工作流程

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待用户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接

基于TCP协议的套接字编程(简单)

服务端

import socket


# 创建符合TCP协议的服务端
server = socket.socket(socket.AF_INET,
                       socket.SOCK_STREAM)  # TCP协议称为流失协议,UDP称为数据报协议SOCK_DGRAM

# 绑定端口
server.bind(('127.0.0.1', 8000))  # 127.0.0.1代表本地

# 对端口进行监听
server.listen(5)  # 半连接池,限制的是请求书

# 等待客户端连接
print('start....')
conn, client_addr = server.accept()
print('conn: ', conn)
print('client_addr: ', client_addr)

# 收到消息
data = conn.recv(1024)  # 限制最大接收的字节数
print('来自客户端的数据: ', data)

# 回消息
conn.send(data.upper())  # 将数据变大写

# 关闭连接
conn.close()

# 关闭服务器
server.close()

客户端

import socket

# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端端口
client.connect(('127.0.0.1', 8000))

# 发送消息
client.send('hello'.encode('utf8'))

# 接收服务端返回的消息
data = client.recv(1024)
print('来自服务端的数据:', data)

# 关闭客户端
client.close()

基于TCP协议的套接字编程(循环)

服务端

import socket

# 创建符合TCP协议的服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定端口
server.bind(('127.0.0.1', 8000))

# 对端口进行监听
server.listen(5)

# 等待客户端连接
print('start...')

# 链接循环
while True:
    conn, client_addr = server.accept()

    # 通信循环
    while True:
        try:
            # 接收消息
            data = conn.recv(1024)
            print('来自客户端的数据:', data)

            # 回消息
            conn.send(data)
        except ConnectionResetError:  # 捕捉客户端与服务端关闭连接
            break

客户端1

import socket

# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端端口
client.connect(('127.0.0.1', 8000))

while True:
    # 发送消息
    msg = input('please enter msg>>>')
    client.send(msg.encode('utf8'))

    # 接收消息
    data = client.recv(1024)
    print('来自服务端的数据:', data.upper())

客户端2

import socket

# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端端口
client.connect(('127.0.0.1', 8000))

while True:
    # 发送消息
    msg = input('please enter msg>>>')
    client.send(msg.encode('utf8'))

    # 接收消息
    data = client.recv(1024)
    print('来自服务端的数据:', data.upper())

在服务器连接客户端1时,虽然能监听客户端2,但不能给客户端2返回消息,将客户端1关闭后即断开连接,给客户端2返回数据

原文地址:https://www.cnblogs.com/863652104kai/p/11091317.html