Python客户端 - 服务器(*缺乏理解)

时间:2017-08-23 07:51:43

标签: python networking client-server

我遇到了挑战:

消息传递系统由2个组件组成 - 客户端和服务器。

3种消息传递:

1)以当前服务器时间回复

2)响应目前为止对服务器进行的调用次数(*自开始运行以来)

3)两个数字相乘。

我试图用python做到这一点,所以我看到了这个视频教程:

https://www.youtube.com/watch?v=WrtebUkUssc

并阅读本指南:

http://www.bogotobogo.com/python/python_network_programming_server_client.php

但是我非常缺乏理解,服务器如何知道客户要求的内容?

以及服务器如何响应每个查询,我能看到它只有字节接收..

我希望有人可以帮助我,我只有24小时回答(这对工作来说是个挑战)

  • 注意:我是一名新的计算机科学专业的学生。

谢谢大家!!

2 个答案:

答案 0 :(得分:0)

如果我遇到你的情况,我不会试图深入了解幕后发生的所有事情。

首先,我会检查一下我应该达到的目标:

1) respond with current server time

  • 让服务器启动并运行
  • 能够通过某些路线(示例/时间)上的http GET方法接收请求
  • 能够发送回复
  • 选择响应格式(json是一个不错的选择)
  • 知道您的数据是否以该格式有效(对于json,您可以使用https://jsonlint.com/
  • 发送包含服务器时间的响应

2) respond with number of calls made to the server so far(*since it started running):

目前尚不清楚你被要求做什么。也许服务器应该能够多次响应?

3) multiplication of two numbers:

  • 选择您支持的http方法。如果您选择http GET客户端将必须在/ url / 2/3 /中发送这些数字。如果你选择http POST,你将不得不发送在url中看不到的数据(也称为有效载荷),如/ multiply
  • 能够发送回复
  • 选择响应格式(json是一个不错的选择)
  • 知道您的数据是否以该格式有效(对于json,您可以使用https://jsonlint.com/
  • 发送包含答案的回复(示例回复数据可能看起来像{"answer": 6}

首先选择服务器代码。通过查看requestresponse,方法GETPUTPOST以及http status code是什么来了解一下http。当您编码时,您必须了解一些基本的http状态代码,例如200404400。使用简单的Web框架,如flask,这样您就不必处理udp,tcp,套接字和其他无关的东西。了解如何向服务器发出http请求。 curl是一个不错的选择,但如果您想要其他内容,请确保您的客户端会显示响应状态代码,标题和数据。最后但并非最不重要的是不要陷入困境,因为卡住会很快烧掉你的时间。

答案 1 :(得分:0)

您链接到的article为您提供了足够的信息来创建客户端和服务器来执行您所要求的工作。

注意:本回答重点关注HTTP的原始套接字连接:请参阅@ŽilvinasRudžionis的答案

  

服务器如何知道客户要求的内容?

没有。至少不是本质上的。这就是为什么你需要编写代码以使其理解客户端所要求的内容。理解这一点的文章的最佳部分是Echo Server部分。

要开始理解,您需要遵循此示例。

# echo_server.py
import socket

host = ''                                  # Symbolic name meaning all available interfaces
port = 12345                               # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET,          # See [1]
                  socket.SOCK_STREAM) 
s.bind((host, port))                       # Server claims the port
s.listen(1)                                # See [2]
conn, addr = s.accept()                    # This is code halting, everything
                                           # will hold here and wait for a connection
print('Connected by', addr)

while True:
    data = conn.recv(1024)                # Receive 1024 bytes
    if not data: break                    # If data is Falsey (i.e. no data) break
    conn.sendall(data)                    # Send all data back to the connection
conn.close()

[1] [2]

# echo_client.py
import socket

host = socket.gethostname()               # Server is running on the same host
port = 12345                              # The same port as used by the server
s = socket.socket(socket.AF_INET,         # See server code ([1])
                  socket.SOCK_STREAM)
s.connect((host, port))                   # Initiate the connection
s.sendall(b'Hello, world')                # Send some bytes to the server
data = s.recv(1024)                       # Receive some bytes back
s.close()                                 # Close the connection
print('Received', repr(data))             # Print the bytes received

这为您提供了一个基本框架,可以查看正在发生的事情。从这里,您可以添加自己的代码来检查数据和连接。

最重要的部分是您接受服务器上的连接的位。在这里,您可以检查收到的数据并做出适当的回应。对于time,文章中的first example显示了如何执行此操作。

#--snip--
import time

# Receive all data
while True:
    data = conn.recv(1024)
    if not data: break

# Now we can check the data and prepare the response
if data == "TIME":
    return_data = (time.ctime(time.time()) + "\r\n").encode('ascii')
elif data == "REQUEST COUNT":
    # Code to get request count
elif "MULTI" in data:
    # Example: MULTI 2 3
    data = data.split(" ")  # Becomes ["MULTI", "2", "3"]
    # Code to multiply the numbers

# Send the result back to the client
conn.sendall(return_data)

我有created a github gist的时间示例,您可以下载和使用。它应该适用于Python 2和3。

<script src="https://gist.github.com/alxwrd/b9133476e2f11263e594d8c29256859a.js"></script>