今天将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.7_1.14_编写一个简单的回显客户端/服务器应用

    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. [Python 网络编程] TCP、简单socket模拟ssh (一)

    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 & epoll

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

  9. python 网络编程要点

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

随机推荐

  1. C++使用OLE高速读写EXCEL的源码

    我的代码参考的地方是这儿,再次感谢原作者 http://blog.csdn.net/gyssoft/archive/2007/04/29/1592104.aspx 我根据自己的需要做了整理,干净了一点 ...

  2. HDU 5446 Unknown Treasure(Lucas定理+CRT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] ...

  3. How to get the xpath by clicking an html element

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element

  4. 模式匹配-KMP算法

    /***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 # ...

  5. apache kafka系列之性能优化架构分析

    apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

  6. c#打包文件解压缩

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: /// <summary>            /// 得到指定的输入流的ZIP ...

  7. 最大值减去最小值小于或等于num的子数组数量

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路, ...

  8. BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )

    先最短路预处理, 然后状压就行了 -------------------------------------------------------------------------- #include ...

  9. activemq demo指南

    queue与topic的技术特点对比   topic queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状态 topic ...

  10. jquery选择器:nth-child()与空格:eq() 的区别;

    在一个7x7的表格当中 nth-child(1); td.parents("table").find("tr :nth-child(1)").css(" ...