本节我直接进入Web编程. 我们将写一个python版的web服务器, 使得用户输入一个数字(例如8), 返回给用户圆周率$\pi$的前8位. 此外要求做到:
- 支持多客户端与服务器同时通信(用thread实现)
- 支持简单的错误判断(输入非数字时报错)
- 使用telnet进行本地测试
效果见图:
mserver.png
Python源码如下
#!/usr/bin env python
# This is mserver.py
# which can server multiple client at the same time
# use the thread, see
# https://stackoverflow.com/a/40351010/1910004
# run the server: python mserver.py
# test with telnet( apt-cyg install inetutils )
# telnet localhost 8000
import socket
import thread
# need pip install mpmath
from mpmath import mp
def Show_Pi( digits ):
response = ''
if digits.isdigit() and digits >= 0:
# Compute last digits of pi
response = 'The first '+ str(digits) + ' digits of pi are: \r\n'
mp.dps = digits
response += str( mp.pi )
else:
response = 'Your input is: ' + digits + '\r\n'
response += 'Please input a number!'
response += '\r\n' # start new line at the client
return response
def New_Client( clientsocket, addr ):
while True:
msg = clientsocket.recv( 1024 )[:-2] #remove the \r\n
if not msg: break
print( addr, ' >> ', msg )
clientsocket.send( Show_Pi( msg ) )
clientsocket.close()
# Create a socket object
s = socket.socket()
host = 'localhost' #socket.gethostname()
port = 8000
print( 'Server started on :' + socket.gethostname() )
print( 'Waiting for clients...' )
# Bind to the port
s.bind( ( host, port ) )
# Wait for client connection
s.listen( 5 )
while True:
# Establish connection with client
c, addr = s.accept()
print( 'Got connection from', addr )
thread.start_new_thread( New_Client, ( c, addr ) )
s.close()
网友评论