Python学习笔记之【网络编程】

TCP编程

客户端

import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))

#接受或发送
s.send(...)
s.recv(1024)
......

s.close()

AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6

SOCK_STREAM指定使用面向流的TCP协议

Web服务的标准端口是80,SMTP服务是25端口,FTP服务是21端口,等等。端口号小于1024的是Internet标准服务的端口,端口号大于1024的,可以任意使用。

服务器

import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
s.bind(('127.0.0.1', 9999))
# 开始监听,参数指定等待连接的最大数量
s.listen(5)
print 'Waiting for connection...'

# 处理连接的线程
def tcplink(sock, addr):
    sock.send(...)
    time.sleep(...)
    data = sock.recv(1024)
    sock.close()


# 通过死循环来接受连接
while True:
    # 接受一个新连接
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

监听的地址和端口:可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址。127.0.0.1表示本机地址。

HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。

 

UDP编程

客户端

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [...]:
    # 发送数据:
    s.sendto(data, ('127.0.0.1', 9999))
    # 接收数据:
    print s.recv(1024)
s.close()

从服务器接收数据仍然调用recv()方法。

服务器

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))

while True:
    # 接收数据:
    data, addr = s.recvfrom(1024)
    print 'Received from %s:%s.' % addr
    s.sendto('Hello, %s!' % data, addr)

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包,直接接收任何客户端的数据。

SOCK_DGRAM指定了这个Socket的类型是UDP。

 

爬取网页

# 导入socket库:
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
# 发送数据/请求,要求返回首页的内容
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)
    if d:
        buffer.append(d)
    else:
        break
data = ''.join(buffer)
# 关闭连接:
s.close()
# 把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件
header, html = data.split('\r\n\r\n', 1)
print header
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
    f.write(html)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值