Python网络编程——编写一个简单的回显客户端/服务器应用

时间:2022-05-23 05:25:18

今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端。采用python3.5版本,在注释中会标明python2和python3的不同之处。

1.代码

(1)服务器端及对应代码解释

 # ! /usr/bin/env python
# -*- coding: utf-8 -*-
# 编写回显服务器 import socket
import sys
import argparse # 定义常量
host = 'localhost'
data_payload = 2048
backlog = 5 def echo_server(port): # 创建一个TCP socket
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) # 将socket绑定到server_address地址
sock.bind(server_address) # 监听客户端
# backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
# 这里设定为5
sock.listen(backlog)
# 在调用 Listen 之前,必须首先调用 Bind 方法,否则 Listen 将引发 SocketException。
while True:
print("Waiting to receive message from client") # 调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。
# accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection
# 是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
client, address = sock.accept() # 指定data最大长度为2048字节
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__':
# 创建一个解析对象,其中描述为"Socket Error Examples"
parser = argparse.ArgumentParser(description='Socket Server Example')
# 采用add_argument方法
# name or flags —— 必须的参数,该参数接收选项参数或者是位置参数
# action:
# (1)store —— 默认action模式,储存值到指定变量
# (2)store_const —— 储存值在参数的const部分指定,多用于实现非布尔的命令行flag
# (3)store_true/store_false —— 布尔开关。可以2个参数对应一个变量
# (4)append —— 储存值到列表,储存值在参数的const部分指定
# (5)append_const —— 储存值到列表,储存值在参数的const部分指定
# (6)version —— 输出版本信息然后退出
# type —— 把从命名行输入的结果转成设置的类型,通常用来检查值的范围,以及合法性。默认string  
# required —— 指定某个选项在命名中出现, 默认False, 若为 True, 表示必须输入该参数
# dest —— 把位置或者选项关联到一个特定的名字
parser.add_argument('--port', action="store", dest="port", type=int, required=True)
# 调用parse_args()方法进行解析
given_args = parser.parse_args()
port = given_args.port
echo_server(port) def bind(self, address): # real signature unknown; restored from __doc__
"""
bind(address) Bind the socket to a local address. For IP sockets, the address is a
pair (host, port); the host must refer to the local host. For raw packet
sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])
"""
pass
def listen(self, backlog=None): # real signature unknown; restored from __doc__
"""
listen([backlog]) Enable a server to accept connections. If backlog is specified, it must be
at least 0 (if it is lower, it is set to 0); it specifies the number of
unaccepted connections that the system will allow before refusing new
connections. If not specified, a default reasonable value is chosen.
"""
pass

服务器端代码

(2)客户端及对应代码解释

 # ! /usr/bin/env python
# -*- coding: utf-8 -*-
# 编写回显客户端 import socket
import sys
import argparse host = 'localhost' def echo_client(port):
# 创建TCP socket连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取服务器端host和端口号
server_address = (host, port)
print("Connecting to %s port %s" % server_address)
sock.connect(server_address) try:
# 将message内容发送到服务器端
message = "Test message, This will be echoed"
print("Sending %s" % message)
# python2和python3此处不同
# python2—— sock.sendall(message)
# sendall()发送完整的TCP数据,成功返回None,失败抛出异常
sock.sendall(message.encode()) # 服务器端将发送的数据回传给客户端并打印
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(1024)
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_args = parser.parse_args()
port = given_args.port
echo_client(port)

客户端代码

(3)运行结果

 1. 服务器端
Abel$ python3 1_13a_echo_server.py --port=9900
Starting up echo server on localhost port 9900
Waiting to receive message from client 2.客户端发送数据时,服务器端
Data: b'Test message, This will be echoed'
sent b'Test message, This will be echoed' bytes back to ('127.0.0.1', 62389)
Waiting to receive message from client 3.客户端
Abel$ python3 1_13b_echo_client.py --port=9900
Connecting to localhost port 9900
Sending Test message, This will be echoed
Received: b'Test message, This will be echoed'
Closing connection to the server

Python网络编程——编写一个简单的回显客户端/服务器应用的更多相关文章

  1. python2&period;7&lowbar;1&period;14&lowbar;编写一个简单的回显客户端&sol;服务器应用

    1.服务端 server.py # -*- coding: utf-8 -*- import socket import argparse host = 'localhost' data_payloa ...

  2. Linux网络编程:一个简单的正向代理服务器的实现

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...

  3. python高级编程 编写一个包1

    #目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...

  4. &lbrack;Python 网络编程&rsqb; TCP、简单socket模拟ssh &lpar;一&rpar;

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...

  5. python网络编程之最简单的单工通信

    tcp_server.py from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(('',12345)) ser ...

  6. Python并发编程-线程-一个简单的例子

    from threading import Thread import time def func(n): #子线程完成的 time.sleep(1) print(n) #多线程示例 for i in ...

  7. python 网络编程(四)---UDP服务端客户端

    1.服务器端 UDP服务器建立与TCP相类似,具体比较如下: 补充下,第四步:不必使用listen还有accept函数. 具体代码如下:(设置socket选项省略) import socket fro ...

  8. Python网络编程(4)——异步编程select &amp&semi; epoll

    在SocketServer模块的学习中,我们了解了多线程和多进程简单Server的实现,使用多线程.多进程技术的服务端为每一个新的client连接创建一个新的进/线程,当client数量较多时,这种技 ...

  9. python 网络编程要点

    From http://www.zhihu.com/question/19854853 Python网络编程是一个很大的范畴,个人感觉需要掌握的点有:1. 如何使用Python来创建socket, 如 ...

随机推荐

  1. PLSQL Developer 不能连接 oracle 11g 64位 的解决办法

    http://blog.itpub.net/14184018/viewspace-760730 http://www.cnblogs.com/gulvzhe/archive/2012/08/27/26 ...

  2. winform(无边框窗体与timer)

    一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...

  3. 一个中型项目:本地校园App

    好暨: 这个项目的起源于课堂老师作业的要求.老师要求一年下来完成一个构想并实现Demo.思考良久,在要提交构想的那个晚上,想到了校园App,当时团队只有两个人,但我感觉到:就是它了!项目启动时间——2 ...

  4. hud 2099

    #include <stdio.h> #include <stdlib.h> int main() { int m,n,i,flag; ) { flag=; &&amp ...

  5. 小程序2-基本架构讲解&lpar;一&rpar;WXML 模板

    项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件 .wxml 后缀的 WXML 模板文件 .wxss 后缀的 WXSS 样式文件 .js 后缀的 JS 脚本逻辑文件 WXML 模 ...

  6. 启动sql2012时出现Cannot find one or more components&period;Please reinstall the application

    ①在运行中输入regedit.exe,启动注册表工具 ②找到注册表中的此处路径“HKEY_CURRENT_USER\Software\Microsoft\SQL Server Management S ...

  7. TP5系统变量输出

    1.超全局变量 模板中: {$Think.sever.server_name}              //全部小写,输出blog.cn 控制器: $_SERVER['SERVER_NAME']  ...

  8. Dom4j用Xpath获取节点——(六)

    xml文档 <?xml version="1.0" encoding="utf-8"?> <书架> <书> <书名 n ...

  9. 20155239吕宇轩 Exp1 PC平台逆向破解&lpar;5&rpar;M

    20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...

  10. 为什么HashMap不是线程安全的

    电面突然被问到这个问题,之前看到过,但是印象不深,导致自己没有答出来,现在总结一下. HashMap的内部存储结构 transient Node<K,V>[] table; static ...