python socket(tcp/udp)编程

一: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 !




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值