1.网络编程
客户端/服务器端架构
服务器是一个软件或硬件,用于向一个或者多个客户端提供所需的服务,服务器存在的唯一目的就是等待客户端的请求,给这些客户提供服务,然后再等待其他的请求。
2. 套接字:通信端点
套接字是一种计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必须创建套接字。就像电话的插口一样,没有它就完全没办法通信。
2.1 基于文件系统的套接字
AF_UNIX(AF_LOCAL)是一种基于文件系统的,AF表示地址家族。由于两个进程都是运行在同一台机器上的,所以这些套接字都是基于文件系统,因此他们的底层结构又文件系统来支持,同一台电脑,文件系统是不同进程都能访问的。
2.2 基于网络的套接字
AF_INET或“地址家族:Internet”,
3. 套接字类型
无论你使用哪一种地址家族,套接字的类型只有两种/:一种是面向连接的,另一种的是无连接的。
3.1 面向连接
在通信之前必须先建立连接。可以提供顺序的,可靠的,不会重复的数据传输,而且也不会被加上数据边界。
实现这种连接的主要协议就是传输控制协议TCP。要创建TCP套接字就得在创建的时候指定套接字类型SOCK_STREAM,它是流套接字。由于这些套接字使用网际协议(IP)来查找网络主机,所以就形成了TCP/IP两个协议来描述整个系统。
3.2 无连接
也即是说无需要建立连接就可以进行通讯,但这时数据到达的顺序,可靠性及不重复性就不能保证了。数据报会保留数据边界,这就表示,数据是整个发送的,不会像面向连接的协议那样被拆分。
实现这种连接的协议是用户数据报协议(UDP),要创建UDP套接字就得创建的时候指定套接字类型为SOCK_DGRAM。也就组成UDP/IP.
4. TCP
4.1 TCP服务器
# -*- coding:utf-8 -*-
#tcp_server.py
'''
Created on 2016-1-17
@author: Stephen Huang
'''
import socket
from time import ctime
HOST=''
PROT=21567
BUFSIZE = 1024
ADDR = (HOST, PROT)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建服务器签字套
tcp_server_socket.bind(ADDR) # 把创建的地址绑定到套接字上
tcp_server_socket.listen(5) #监听连接,listen()表示最多允许同时连接的数量
try:
while True:
print 'waiting for connection ...'
tcp_client_socket, addr = tcp_server_socket.accept()
print '... connected from :', addr
while True:
data = tcp_client_socket.recv(BUFSIZE)
if not data:
break
tcp_client_socket.send('[%s] %s' %(ctime(), data))
# tcp_client_socket.close()
except Exception, e:
print e
finally:
tcp_server_socket.close()
4.2 TCP客户端
# -*- coding:utf-8 -*-
# tcp_client.py
'''
Created on 2016-1-17
@author: Stephen Huang
'''
import socket
HOST='127.0.0.1'
PROT=21567
BUFSIZE = 1024
ADDR = (HOST, PROT)
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client_socket.connect(ADDR)
try:
while True:
data = raw_input('...> ')
if not data:
break
tcp_client_socket.send(data)
data = tcp_client_socket.recv(BUFSIZE)
if not data:
break
print data
except Exception, e:
print e
finally:
tcp_client_socket.close()
4.3 测试结果
5. UDP
5.1 UDP服务器
# -*- coding:utf-8 -*-
#udp_server.py
'''
Created on 2016-1-17
@author: Stephen Huang
'''
import socket
from time import ctime
HOST=''
PROT=21567
BUFSIZE = 1024
ADDR = (HOST, PROT)
udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建服务器签字套
udp_server_socket.bind(ADDR) # 把创建的地址绑定到套接字上
try:
while True:
print 'waiting for message ...'
udp_client_socket, addr = udp_server_socket.recvfrom(BUFSIZE)
udp_server_socket.sendto('[%s] %s' %(ctime(), addr))
print '... recevied from and returned to :', addr
except Exception, e:
print e
finally:
udp_server_socket.close()
5.2 UDP客户端
# -*- coding:utf-8 -*-
# udp_client.py
'''
Created on 2016-1-17
@author: Stephen Huang
'''
import socket
HOST='127.0.0.1'
PROT=21567
BUFSIZE = 1024
ADDR = (HOST, PROT)
udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
while True:
data = raw_input('...> ')
if not data:
break
udp_client_socket.sendto(data)
data, ADDR = udp_client_socket.recvfrom(BUFSIZE)
if not data:
break
print data
udp_client_socket.close()
except Exception, e:
print e
finally:
udp_client_socket.close()
5.3 测试结果
6. SocketServer模块
参考
- http://python.usyiyi.cn/translate/python_278/library/socket.html
- python核心编程第16章 网络编程