python-socket包访问web服务-TCP的服务器端和客户端之间的通信

python:socket包访问web服务-TCP的服务器端和客户端之间的通信

TCP的服务器端和客户端之间的通信

工具:
Pycharm下进行的
准备工作:
创建文件夹:web_connection
这里写图片描述


1:服务端:server.py
代码:

# coding=utf-8
"""
@author: jiajiknag
程序功能: 服务器端
"""
# 导包
import socket
from time import ctime
# 端口号,地址
host='127.0.0.1'
port=12345
BUFSIZ=1024
# 创建一个变量addr:地址和端口
addr=(host,port)
#创服务器套接字
tcpSerSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#套接字与地址绑定
# 以下还可以写成:tcpSerSock.bind((host,port))
tcpSerSock.bind(addr)
# 监听连接,传入连接请求的最大数
tcpSerSock.listen(5)


while True:
    # 输出提示:等待连接
    print('waiting for connection...')
    # 接收
    tcpCliSock,addr =tcpSerSock.accept()
    # 输出连接的地址
    print('...connected from:',addr)

    while True:
        # tcpCliSock.send(data)传入的参数是应该是bytes类型,而不是str类型
        data =tcpCliSock.recv(BUFSIZ).decode()
        # 输出接收的数据
        print('date=',data)
        if not data:
            break
        tcpCliSock.send(('[%s] %s' %(ctime(),data)).encode())

    # 关闭
    tcpCliSock.close()
tcpSerSock.close()

2:客户端:client.py
代码

# coding=utf-8
"""
@author: jiajiknag
程序功能: 客户端
"""
import socket
# from socket import *
#  or 'localhost'
host = '127.0.0.1'
port= 12345
BUFSIZ = 1024
# 创建一个变量addr:地址和端口
addr=(host,port)
#创服务器套接字
tcpCliSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#套接字与地址绑定
# 以下还可以写成:tcpSerSock.bind((host,port))
tcpCliSock.connect(addr)

while True:
    # 输入用户输入的数据
    data = input('> ')
    #print('data=',data);
    if not data:
        break
    # 发送数据(经过将byte型编码为str)
    tcpCliSock.send(data.encode())
    data = tcpCliSock.recv(BUFSIZ).decode()
    if not data:
        break
    print(data)
# 最后记得要关闭
tcpCliSock.close()

3:结果


socket包访问web服务

1:socket_web.py
代码:

# coding=utf-8
"""
@author: jiajiknag
程序功能: socket包访问web服务
"""
# 导入socket包
import socket
# multiprocessing包是Python中的多进程管理包
# 在 multiprocessing 中,通过创建 Process 对象然后调用其 start() 方法来生成进程。
# Process 遵循 threading.Thread 的API。多进程程序的一个简单例子是
from multiprocessing import Process

# 定义客户端处理函数
def handle_client(client_socket):
    """处理客户端请求"""
    # 获取客户端请求数据
    # 接收TCP数据,数据以字符串形式返回。指定要接收的最大数据量为1024字节
    request_data = client_socket.recv(1024)
    # 打印客户端请求的数据
    print("request data:", request_data)

    # 构造响应数据
    response_start_line = "HTTP/1.1 200 OK\r\n"
    response_headers = "Server: My server\r\n"
    response_body = "hello wtclab"
    response = response_start_line + response_headers + "\r\n" + response_body
    print("response data:", response)
    # 向客户端返回响应数据
    client_socket.send(bytes(response, "utf-8"))
    # 关闭客户端连接
    client_socket.close()


if __name__=="__main__":
    # 创建TCP Socket对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 将套接字绑定到地址和端口,在AF_INET下,以tuple(host, port)的方式传入,
    # 如s.bind((host, port))
    server_socket.bind(("127.0.0.1", 8888))
    # 开始监听TCP传入连接,backlog指定在拒绝链接前,
    # 操作系统可以挂起的最大连接数,该值最少为1,大部分应用程序设为5就够用了
    server_socket.listen(50)

    while True:
        # accept()方法接受TCP链接并返回(conn, address),
        # 其中conn是新的套接字对象,可以用来接收和发送数据,address是链接客户端的地址。
        client_socket, client_address = server_socket.accept()
        # 打印连接的客户端的IP作为提示信息
        print("[%s, %s]用户连接上了" % client_address)
        # Process([group [, target [, name [, args [, kwargs]]]]]),
        # target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。
        # group实质上不使用。
        handle_client_process = Process(target=handle_client, args=(client_socket,))
        # 启动进程
        handle_client_process.start()
        # 关闭socket
        client_socket.close()

2:结果

你可能感兴趣的:(python)