一个基于TCP协议的简单客户/服务器架构

学习

最近在看python的socket模块,发现python网络编程比C++的网络编程容易不少。一边看书一边做才是王道啊。下面的实例参考《Python 核心编程》一书,实现服务器与客户端简单的通信。

服务端
伪代码实现

服务器端伪代码实现流程(以下是单线程的,可以修改为多线程):

1
2
3
4
5
6
7
8
9
ss = socket() # 创建服务器套接字 
ss.bind() # 把地址绑定到套接字上
ss.listen() # 监听连接
inf_loop: # 服务器无限循环
cs = ss.accept() # 接受客户的连接
comm_loop: # 通讯循环
cs.recv()/cs.send() # 对话(接收与发送)
cs.close() # 关闭客户套接字
ss.close() # 关闭服务器套接字(可选)
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#coding=utf-8 
#!/usr/bin/python
from socket import *
host = ''
port = 64444
bufsiz = 1024
addr = (host, port)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(addr)
tcpSerSock.listen(4)
while True:
print 'waiting for connection...'
tcpCliSock, addr = tcpSerSock.accept()
print '...connected from:', addr

while True:
data = tcpCliSock.recv(bufsiz)
if not data:
break
print '%s > %s' %(addr[0], data)
serData = raw_input('>')
tcpCliSock.send(serData)
tcpCliSock.close() tcpSerSock.close()
客户端
伪代码实现
1
2
3
4
5
cs = socket() # 创建客户套接字 
cs.connect() # 尝试连接服务器
comm_loop: # 通讯循环
cs.send()/cs.recv() # 对话(发送/接收)
cs.close() # 关闭客户套接字
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#coding=utf-8 
#!/usr/bin/python
from socket import *
host = '192.168.5.254'
port = 64444
bufsiz = 1024
addr = (host, port)
tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(addr)
while True:
data = raw_input('> ')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(bufsiz)
if not data:
break
print data
tcpCliSock.close()
测试

测试他们之间的通信,先开启服务端监听客户请求,再开启客户端请求服务(当客户端请求服务时,服务端会被动连接客户端)
pythonsockettcp01
pythonsockettcp02
此时服务端和客户端已建立连接,可以进行通信了。
pythonsockettcp03
pythonsockettcp04
pythonsockettcp05
pythonsockettcp06
pythonsockettcp07

----------------本文结束 感谢阅读----------------