网络编程

1、引入:

网络编程 是如何在程序中实现两台计算机的通信

eg:当你使用浏览器访问新浪时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上。。

电脑不只浏览器,还有QQ、邮件客户端等其他的,,不同的程序连接的别的计算机也会不同;;确切的说,网络通信 是两台计算机的两个进程之间的通信

eg:浏览器进程和新浪服务器上的某个Web服务进程在通信。。。而QQ进程呢是和腾讯的某个服务器上的某个进程在通信

用python进行网络编程,就是在python程序本身这个进程内,连接别的服务器进程的通信端口进行通信

2、TCP/IP简介

①为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议;只要支持这个协议,任何私有网络就可以联入互联网

②通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是IP地址,类似123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个IP地址,所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。

③IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。

④TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发

⑤一个IP包除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

⑥端口有什么作用?在两台计算机通信时,只发IP地址是不够的,因为同一台计算机上跑着多个网络程序。一个IP包来了之后,到底是交给浏览器还是QQ,就需 要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。

3、客户端

# !/user/bin/env python
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# AF_INET指定使用IPv4协议;SOCK_STREAM指定使用面向流的TCP协议
s.connect(('www.sina.com.cn',80))
# 参数是一个tuple,包含地址和端口号
s.send('GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 向新浪服务器发送请求,要求返回首页的内容
# 接收数据:
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
# recv(max)方法,一次最多接收指定的字节数
if d:
buffer.append(d)
else:
break
data = ''.join(buffer)
# 关闭连接:
s.close()
# 接收到的数据包括HTTP头和网页本身,我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件
header, html = data.split('\r\n\r\n', 1)
print header
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
f.write(html)

4、服务器
服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了
Eg:编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去

服务器端:
# !/user/bin/env python
# -*- coding: utf-8 -*-
import socket,time,threading
def tcplink(sock,addr):
print 'Accept new connect from %s:%s...' % addr
sock.send('Welcome!')
# 发送给客户端
# 连接建立后,服务器首先发一条欢迎消息,然后等待客户端数据,并加上Hello再发送给客户端。如果客户端发送了exit字符串,就直接关闭连接
while True:
data = sock.recv(1024)
# 每次最多接收1024k字节
time.sleep(1)
if data == 'exit' or not data:
break
sock.send('hello,%s!' % data)
sock.close()
print 'Connect from %s:%s closed' % addr

if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
# 监听端口,绑定到本机地址
s.listen(5)
# listen()方法开始监听端口,参数指定等待连接的最大数量
print 'Waiting for connection,,,'
# 服务器程序通过一个永久循环来接收来自客户端的连接,accept会等待并返回一个客户端的连接;;每个连接都必须创建新线程
while True:
sock,addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
客户端:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print s.recv(1024)
for data in ['Michael', 'Tracy', 'Sarah']:
# 发送数据:
s.send(data)
print s.recv(1024)
s.send('exit')
s.close()

注:服务器端是一直监听着的,需要手动停止运行
结果如下:左服务器,右客户端

 

小结:

用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。通常,服务器程序会无限运行下去。

同一个端口,被一个Socket绑定了以后,就不能被别的Socket绑定了。一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket

 

转载于:https://www.cnblogs.com/zzfighting/p/5754338.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值