Socket的应用(一)——创建一个简单的回显客户端/服务器

在这篇文章中,我们将利用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应用便已经完成了。

 

猜你喜欢

转载自blog.csdn.net/nanguodehouzi/article/details/83151299