您的位置:首页 > 理论基础 > 计算机网络

python socket(tcp/udp)编程

2015-06-03 20:56 567 查看
一:tcp/ip协议

网络上两个计算机之间的数据通信,归根到底就是不同主机的进程交互,而每个主机的进程都对应着某个端口。也就是说,单独靠IP地址的无法完成通信的,必须要有IP和端口。

OSI七层模型和tcp/ip



ip协议是在网络层,负责在网络把一台主机的数据传输到另一台目标主机上。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。也就是目前为止,目标主机对收到的数据包的完整性还是未知的,也不知道传输是否面向连接还是无连接。

tcp协议在传输层,是建立在IP协议之上的。TCP协议是面向连接的,可靠传输,保证通信主机间数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

udp协议,同样是建立在IP协议之上,但是UDP协议面向无连接的通信协议,不保证数据包的顺利到达,不可靠传输。所以效率比tcp要高。

二:tcp编程

由于tcp是面向连接的,也就是连接前,断开后都要进行验证。

三次握手建立连接:



四次挥手:



服务端tco_server.py代码如下:

'''
Created on 2015-6-1

@author: lkz
'''
import socket
import threading
import time
def proc(sock,addr):
print 'Accept new connection from %s:%s...' % addr
sock.send('welcome!')
while True:
data=sock.recv(1024)
time.sleep(1)
if not data or data =='exit':
break
sock.send('hello %s!' % data)
sock.close()
print 'connect from %s:%s closed' % addr
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#1,创建socket对象
s.bind(('127.0.0.1',9999))#2,绑定端口,地址
s.listen(5)#3,监听状态
print 'waiting for connect!'
while 1:
sock,addr = s.accept()#4:接受建立连接
print 'accept is retunr(%s,%s)' % (sock,addr)
t = threading.Thread(target=proc,args=(sock,addr))
t.start()
tcp_client.py代码如下:

'''
Created on 2015-6-1

@author: lkz
'''
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#1创建对象
s.connect(('127.0.0.1',9999))#连接请求
print 'sucess connected!'
for data in ['L','K','Z','exit']:
print 'send %s' % data
s.send(data)#发送数据
print s.recv(1024)#接受数据
s.close()#释放连接
print 'connect closed'
运行结果:

服务端:



客户端:



三:UDP编程:

udp_server.py:

'''
Created on 2015-6-1

@author: Administrator
'''
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',4000))
while True:
data,addr = s.recvfrom(1024)
print 'received (%s) from %s ' % (data,addr)
s.sendto('hello %s !' % data,addr)


udp_client.py
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('client',('127.0.0.1',4000))
print s.recv(1024).decode('utf-8')
s.close()


由于不需要建立连接,相对比较简单。
运行结果:

服务端打印出:received (client) from ('127.0.0.1', 64627) 

客户端打印出:hello client !
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python socket udp tcp