Python网络编程
python的网络编程
OSI介绍
OSI(open system intercronnection)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义,一个规范,它把网络从逻辑上分为7层,每一层都有相关的,相对应的物理设备,比如交换机,路由器.
OSI目标
解决异种网络互联时所遇到的兼容性问题,其主要的功能就是帮助不同类型的主机实现数据传输.他最大的优点是将服务,接口和协议这三个概念明确的区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯
TCP/IP协议的回顾
socket编程
socket的英文原意是孔或者插座
通常称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.
每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务
应用程序通常通过"套接字"向网络发出请求或者应答网络请求.
socket连接过程
服务器监听
客户端请求
连接确认
服务器监听:
服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态
客户端请求:
客户端由套接字提出连接请求,要连接的目标是服务器端的套接字.为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端的套接字的地址和端口号,然后就向服务器套接字发出连接请求
连接确认:
当服务器端套接字监听到或者说接收到客户端套接字的连接请求后,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了.而服务器套接字继续处于监听状态,继续接受其他客户端套接字的连接请求.
开发一个C-S架构的程序
服务器:使用serversocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户端连接请求,客户端连接后,会话产生;在完成会话后,关闭连接
客户端:使用socket对网络上了某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭socket.客户端不需要指定打开的端口,通常临时的,动态的分配一个1024以上的端口
使用socket模块
socket模块的语法
socket([faimly[,type[,proto]]]) --socket object
faimly:socket.AF_INET(ipv4)
type:socket.SOCK_STREM(tcp)
socket.SOCK_DGRAM(udp)
proto:
scoket服务器实现
socket对象的方法
bind() 绑定ip 端口
listen() 监听
accept() 获取连接状态
send() 发送
recv() 接受
close() 关闭
实例:
#!/usr/bin/python
#coding: utf8
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',2017))
sock.listen(10)
while True:
conn,addr=sock.accept()
print conn
print addr
telnet或者nc命令测试
接受客户端发送内容并且显示
#!/usr/bin/python
#coding: utf8
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',2017))
sock.listen(10)
while True:
conn,addr=sock.accept()
print "client %s is connectting" %addr[0]
conn.send("you are connectting\n")
strso=conn.recv(1024)
print strso
修改服务端循环接收客户端信息:
#!/usr/bin/python
#coding: utf8
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',2017))
sock.listen(10)
while True:
conn,addr=sock.accept()
print "%s client is connectting" %addr[0]
while True:
conn.send("you are connectting\n")
strso=conn.recv(1024)
print strso
客户端实现:
bind()
connect()
send()
recv()
close()
#!/usr/bin/python
#coding: utf8
import socket
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',2017))
while True:
client.send("i am client")
strso=client.recv(1024)
print strso
time.sleep(1)
客户端由用户输入信息:
[root@master socket]# cat client.py
#!/usr/bin/python
#coding: utf8
import socket
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',2017))
while True:
x = raw_input("我说: ")
client.send(x)
strso=client.recv(1024)
print strso
time.sleep(1)