在这篇文章中,我们将利用Python的Socket模块,编写一个简单的本地TCPC/S应用:创建Server和Client,在开始时Server等待Client的请求过程中,Server显示出等待信息,之后Client连接上Server并发送消息,最后Server则要回显出来自客户端的所有输出,并发送回应消息,而Client在收到消息后将其显示出来并关闭连接,这个过程中若任何异常报错,都会显示在客户端界面上。
Server:
import socket
import argparse
host = 'localhost'
data_payload = 2048
backlog = 5
def echo_server(port):
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个TCP套接字
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #重用套接字地址
server_address = (host,port)
print("Starting up echo server on %s port %s" %(server_address,sock.bind(server_address)))
sock.listen(backlog) #设置连接至服务器端的最大客户端数量
while True:
print("Waiting to receive message from client")
client , address = sock.accept() #创建了一个新的通道并获得了客户端的IP地址
data = client.recv(data_payload)
if data:
print("Data:%s" %data)
client.send(data)
print("sent %s bytes back to %s" %(data,address))
client.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Socket Server Example')
parser.add_argument('--port',action = "store", dest="port", type =int, required = True)
given_args = parser.parse_args()
port = given_args.port
echo_server(port)
Client:
import socket
import argparse
host = 'localhost'
def echo_client(port):
sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM) #创建一个新的套接字
server_address = (host , port)
print("Connecting to %s %s" %server_address)
sock.connect(server_address) #连接服务器
try:
message = "Test message.This will be echoed"
print("Sending %s" %message)
sock.sendall(message.encode())
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected: #开启循环判断知道将服务器端的消息全部收到
data = sock.recv(32)
amount_received += len(data)
print("Received: %s" %data)
except socket.error as e: #异常消息处理
print("Socket error :%s" %str(e))
except Exception as e: #异常消息处理
print("Other exception: %s" %str(e))
finally: #关闭连接
print("Closing connection to the server")
sock.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Socket Server Example')
parser.add_argument('--port', action = "store", dest = "port", type = int, required = True)
given_arges = parser.parse_args()
port = given_arges.port
echo_client(port)
在编写Server和Client代码时,运用到了argparse模块,在本文中我们便运用了此模块指定了TCP端口。
在这里,只介绍此模块的基本用法:1.创建解析器对象ArgumetParser,其中description用来描述程序
2.add_argument方法,用于指定程序需要接受的命令参数,其中action为参数发出的动作,store为储存,若有dest,如dest=“port”,则意味着可以通过那么可以通过args.port访问该参数;
3.调用parse_args()方法进行解析。
代码编写完成后,我们可以打开Windows的CMD,进入代码文件的物理路径,指定相同端口号运行文件即可,先启动Server,之后启动Client:
Server:
Client:
Server:
一个简单的回显C/S应用便已经完成了。