阿瞳的小马驹 2023-03-06 21:36 采纳率: 100%
浏览 27
已结题

tcp客户端与服务端开发

问题遇到的现象和发生背景

关于TCP客户端与服务端开发的小小的小问题:
当客户端与服务端建立连接后,无论客户端发送什么都会接收到服务端返回的固定静态web页面,这个是服务端

# coding=gbk
import socket
import threading

if __name__ == '__main__':
    # 创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定
    tcp_server_socket.bind(('', 8080))
    # 监听
    tcp_server_socket.listen(128)
    # 等待连接
    while True:
        conn_socket, ip_port = tcp_server_socket.accept()
        print('连接成功', ip_port)
        recv_socket = conn_socket.recv(1024).decode()
        print('接收到的数据是', recv_socket)
        with open('index.html', 'rb') as file:
            f_read = file.read()
        # 相应行
        request_lines = 'http/1.1 200 0k \r\n'
        # 响应头
        request_head = 'Server:ZZT \r\n'
        # 响应体
        request_body = f_read
        # 发送数据
        request_http = (request_lines + request_head + '\r\n').encode('gbk') + request_body
        conn_socket.send(request_http)
    conn_socket.close()
    tcp_server_socket.close()

这个是服务端

# coding=gbk

import socket


"""
    客户端:我们这个界面就是客户端,网络调试助手相当于是服务端
"""

if __name__ == '__main__':
    # 创建客户端套接字 socket.SOCK_STREAM:表示的是流式传输协议,也就是tcp这种传输协议,socket.AF_INET:表示的是使用的是ipv4的IP地址
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 和客户端建立连接  里面传参元组(主机地址:ip,端口号:port)
    tcp_client_socket.connect(("192.168.6.1", 8080))
    print('连接服务器成功')
    # 发送数据
    while True:
        data = input('请输入您要发送的数据')
        if data == 'out':
            break
        tcp_client_socket.send(data.encode('utf-8'))
        # 接收数据 1024代表接受的最大数据
        recv_data = tcp_client_socket.recv(1024)
        print('服务端回复的数据是:', recv_data.decode('utf-8'))
    # 关闭套接字
    tcp_client_socket.close()

遇到的现象和发生背景,请写出第一个错误信息

,我想提取出客户端请求的资源路径,然后打印出来,然后就在服务端里加了字符串分割,然后输出(按照报文格式可知,按照空格分隔字符串后,返回一个列表,下标为1的就是客户端的请求资源路径)这个时候,我就搞不懂了


```python
 while True:
        # 等待客户端请求连接
        conn_socket, ip_port = tcp_sever_socket.accept()
        print('客户端连接成功', ip_port)
        # 获取浏览器发送的http请求报文数据
        client_request_data = conn_socket.recv(1024).decode()
     **   # print(client_request_data)
         **字符串分割:**
        client_request = client_request_data.split(' ')
        print(client_request)
          **打印输出**
        request_path = client_request[1]
        print('客户端请求的资源为:', request_path)**
        # 读取固定的页面数据,组装成为http响应报文数据发送给浏览器
        with open('.' + request_path, 'rb') as f:
            f_data = f.read()
        # 响应行
        request_line = 'HTTP/1.1 200 OK\r\n'

###### 运行结果及详细报错内容
运行之后,客户端发送123,而服务端就报错,不是说下标越界,就是分割对象为空,
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/511505901876114.jpg "#left")

###### 我想要达到的结果
这和我想的不一样啊😭,他不是按照请求报文去分割的,而是直接分割了客户端输入的数据,我就不知道怎么改了,大佬救救我


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-07 09:25
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 修改了问题 3月6日
  • 创建了问题 3月6日

悬赏问题

  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 Mac(标签-IDE|关键词-File) idea
  • ¥15 潜在扩散模型的Unet特征提取
  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器