22 Python网络编程

Python是很强大的网络编程工具。Python有很多针对常见网络协议的库,这些库可以使我们集中精力在程序的逻辑处理上,而不是停留在网络实现的细节中。使用Python很容易写出处理各种协议格式的代码,Python在处理字节流的各种模式方面很擅长。

网络编程初识

自从互联网诞生以来,基本上所有程序都是网络程序,很少有单机版程序了。
计算机网络把各个计算机连接到一起,让网络中的计算机可以互相通信。网络编程在程序中实现了两台计算机的通信。
举个例子,当你使用浏览器访问淘宝网时,你的计算机和淘宝的某台服务器通过互联网连接起来了,淘宝的服务器就会把网页内容作为数据通过互联网传输到你的电脑上。
由于你的电脑上可能不止浏览器,还有微信、办公软件、邮件客户端等,不同程序连接的计算机也会不同,因此网络通信是两台计算机的两个进程之间的通信。比如,浏览器进程和淘宝服务器上某个Web服务进程通信,而微信进程是和腾讯服务器上某个进程通信。
网络编程对所有开发语言都是一样的,Python也不例外。用Python进行网络编程就是在Python程序的进程内连接别的服务器进程的通信端口进行通信。

TCP/IP简介

大家对互联网应该很熟悉,计算机网络的出现比互联网要早很多。
为了联网,计算机必须规定通信协议。早期的计算机网络都是由各厂商自己规定一套协议,如IBM和Microsoft都有各自的网络协议,互不兼容。这就好比一群人有的说英语,有的说中文,有的说德语,但都只懂一种语言,因此只有说同一种语言的人可以交流,说不同语言的人就不行了。
为了把全世界所有不同类型的计算机都连接起来,必须规定一套全球通用协议。为了实现互联网这个目标,大家共同制定了互联网协议簇(Internet Protocol Suite),作为通用协议标准。Internet是由inter和net两个单词组合起来的,原意是连接“网络”的网络,有了Internet,只要支持这个协议,任何私有网络都可以连入互联网。
互联网协议包含上百种协议标准,由于最重要的两个协议是TCP和IP协议,因此大家把互联网协议简称为TCP/IP协议。
通信时双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上计算机的唯一标识就是IP地址,如192.168.12.27。如果一台计算机同时接入两个或更多网络(如路由器),就会有两个或多个IP地址,所以IP地址对应的实际是计算机的网络接口,通常是网卡。
IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此路由器负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途经多个路由,但不保证能到达,也不保证按顺序到达。IP地址实际上是一个32位整数(IPv4),以字符串表示的IP地址实际上是把32位整数按8位分组后的数字表示(如192.168.0.1),目的是便于阅读。
IPv6地址实际上是128位整数,是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334。
TCP协议建立在IP协议之上。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后对每个IP包编号,确保对方按顺序收到,如果包丢掉了就自动重发。
许多常用的更高级的协议都是建立在TCP协议基础上的,如用于浏览器的HTTP协议、发送邮件的SMTP协议等。
一个IP包除了包含要传输的数据外,还包含源IP地址和目标IP地址、源端口和目标端口。
端口有什么作用?两台计算机通信时,只发IP地址是不够的,因为同一台计算机运行着多个网络程序。一个IP包来了之后交给浏览器还是微信,需要端口号进行区分。每个网络程序都向操作系统申请唯一的端口号,这样两个进程在两台计算机之间建立网络连接就需要各自的IP地址和端口号。
一个进程也可能同时与多台计算机建立连接,因此它会申请很多端口。

网络设计模块

前面我们了解了TCP/IP协议、IP地址和端口的基本概念,下面我们开始了解网络编程。
标准库中有很多网络设计模块,除了明确处理网络事务的模块外,还有很多模块是与网络相关的。接下来我们讨论其中几个模块。

1 Socket简介

网络编程中有一个基本组件——套接字(socket)。
套接字为特定网络协议(如TCP/IP、ICMP/IP、UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。套接字允许程序接收数据并进行连接,如发送和接收数据。为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要。
套接字为BSD UNIX系统核心的一部分,而且被许多类似UNIX的操作系统(包括Linux)所采纳。许多非BSD UNIX系统(如MS-DOS、Windows、OS/2,Mac OS及大部分主机环境)都以库形式提供对套接字的支持。
3种最流行的套接字类型是stream、datagram和raw。stream和datagram套接字可以直接与TCP协议进行接口,而raw套接字与IP协议进行接口。套接字并不限于TCP/IP。
套接字主要是两个程序之间的“信息通道”。程序(通过网络连接)可能分布在不同的计算机上,通过套接字相互发送信息。在Python中,大多数网络都隐藏了socket模块的基本细节,并且不直接和套接字交互。

2 socket模块

套接字模块是一个非常简单的基于对象的接口,提供对低层BSD套接字样式网络的访问。使用该模块可以实现客户机和服务器套接字。要在Python中建立具有TCP和流套接字的简单服务器需要使用socket模块。利用该模块包含的函数和类定义可生成通过网络通信的程序。一般来说,建立服务器连接需要6个步骤。

步骤一:创建socket对象

在Python中,我们用socket()函数创建套接字,语法格式如下:

socket.socket([family[, type[, protocol]]])
  • family:可以是AF_UNIX(UNIX域,用于同一台机器上的进程间通信),也可以是AF_INET(对于IPV4协议的TCP和UDP)或AF_INET6(对于IPV6)。
  • type:套接字类型可以根据面向连接和非连接分为SOCK_STREAM(流套接字)或SOCK_DGRAM(数据报文套接字)。
  • protocol:一般不填,默认为0。

family参数指定调用者期待返回的套接口地址结构的类型。family的值包括3种:AF_INET、AF_INET6和AF_UNSPEC。
如果指定AF_INET,函数就不能返回任何IPV6相关的地址信息。
如果仅指定AF_INET6,就不能返回任何IPV4地址信息。
AF_UNSPEC意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。
如果某个主机既有AAAA记录(IPV6)地址,又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录作为sockaddr_in结构返回。
AF_INET6用于IPV6系统,AF_INET和PF_INET用于IPV4系统。
AF表示ADDRESS FAMILY地址族。
PF表示PROTOCOL FAMILY协议族。
在Windows中,AF_INET与PF_INET完全一样;在UNIX/Linux系统中,不同版本的AF_INET与PF_INET有微小差别。

步骤二:将socket绑定(指派)到指定地址上,socket.bind(address)。

address必须是一个双元素元组((host,port)),参数为主机名或ip地址+端口号。如果端口号正在被使用或保留、主机名或IP地址错误,就会引发socke.error异常。

步骤三:绑定后必须准备好套接字,以便接受连接请求。请求方式如下:

socket.listen(backlog)

backlog用于指定最多连接数,至少为1。接到连接请求后,这些请求必须排队,如果队列已满,就拒绝请求。

步骤四:服务器套接字通过socket的accept方法等待客户请求一个连接。请求方式如下:

connection,address=socket.accept()

调用accept方法时,socket会进入等待(或阻塞)状态。客户请求连接时,accept方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,如(connection, address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的互联网地址。

步骤五:处理阶段,服务器和客户通过send和recv方法通信(传输数据)。

服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv时,必须指定一个整数控制本次调用所接收的最大数据量。recv方法在接收数据时会进入blocket状态,最后返回一个字符串,用于表示收到的数据。如果发送的量超过recv允许的量,数据就会被截断。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除。

步骤六:传输结束,服务器调用socket的close方法以关闭连接。建立一个简单的客户连接需要4个步骤。

(1)创建一个socket以连接服务器socket=socket.socket(family,type)。
(2)使用socket的connect方法连接服务器socket.connect((host,port))。
(3)客户和服务器通过send和recv方法通信。
(4)结束后,客户通过调用socket的close方法关闭连接。

3 socket对象(内建)方法

socket提供了表1所示的服务器端套接字函数。

1 服务器端套接字函数
socket提供了表2所示的客户端套接字函数。
2 客户端套接字函数
socket提供了表3所示的公共用途套接字函数。
3 公共用途套接字函数

TCP编程

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,并且指定协议类型。大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的是客户端,被动响应连接的是服务器。

1 客户端

当我们在浏览器中访问某个网站时,自己的计算机就是客户端,浏览器会主动向所访问网站的服务器发起连接。如果一切顺利,所访问网站的服务器接受了我们的连接,一个TCP连接就建立起来了,接着就可以发送网页内容了。
例如,要创建一个基于TCP连接的Socket(以连接本地为例),可以这样做:

# 导入socket 库
import socket

# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口
s.connect((host, port))

创建Socket时,AF_INET指定使用IPv4协议。如果要用更先进的IPv6,就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议,这样一个Socket对象就创建成功了,但是还没有建立连接。
如果客户端要主动发起TCP连接,就必须知道服务器的IP地址和端口号。比如百度的IP地址可以用域名www.baidu.com自动转换到IP地址,但是怎么知道百度服务器的端口号呢?
作为服务器,提供服务时端口号必须固定下来。由于我们想要访问网页,因此新浪提供网页服务的服务器必须把端口号固定在80端口。80端口是Web服务的标准端口。其他服务都有对应的标准端口号,如SMTP服务是25端口,FTP服务是21端口,等等。端口号小于1024的是Internet标准服务端口,端口号大于1024的可以任意使用。
例如,连接百度服务器的代码如下:

s.connect(('www.baidu.com', 80))

建立TCP连接后,我们可以向百度服务器发送请求,要求返回首页的内容:

# 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n')

TCP连接创建的是双向通道,双方可以同时给对方发数据。谁先发、谁后发,怎么协调,要根据具体协议决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。
发送的文本格式必须符合HTTP标准。如果格式没问题,接下来就可以接收百度服务器返回的数据了:

# 接收数据
buffer = []
while True:
    # 每次最多接收1k 字节
    d = s.recv(1024)
    if d:
         buffer.append(d)
    else:
         break
data = b''.join(buffer)

接收数据时,调用recv(max)方法一次最多接收指定的字节数,因此会在while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环。
接收完数据后,调用close()方法关闭Socket,一次完整的网络通信就结束了:

# 关闭连接
s.close()

接收到的数据包括HTTP头和网页,我们只需要把HTTP头和网页分离一下,输出HTTP头,将网页内容保存到文件:

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件
with open('baidu.html', 'wb') as f:
    f.write(html)

接下来,只需要打开baidu.html文件,就可以进入百度首页了。
下面是以上功能的完整代码。

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

import socket

def socket_client():
    # 创建 socket 对象
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 获取主机名
    host = 'www.baidu.com'
    # 设置端口号
    port = 80
    # 连接服务,指定主机和端口
    s.connect((host, port))
    #发送数据
    s.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n')
    # 接收数据
    buffer = []
   while True:
         # 每次最多接收1k 字节
         d = s.recv(1024)
         if d:
             buffer.append(d)
         else:
             break
    data = b''.join(buffer)

    header, html = data.split(b'\r\n\r\n', 1)
    print(header.decode('utf-8'))
    # 把接收的数据写入文件
    with open('baidu.html', 'wb') as f:
         f.write(html)
    s.close()

def main():
    socket_client()

if __name__ == '__main__':
    main()

2 服务器

和客户端编程相比,服务器编程更复杂一些。
服务器编程首先要绑定一个端口,监听来自其他客户端的连接。如果某个客户端发起连接了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
服务器会打开固定端口(如80)监听,每发起一个客户端连接,就创建该Socket连接。由于服务器有大量来自客户端的连接,因此要能够区分一个Socket连接是和哪个客户端绑定的。确定唯一的Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口。
服务器还需要同时响应多个客户端请求,每个连接都需要一个新进程或新线程处理,否则服务器一次只能服务一个客户端。
下面编写一个简单的服务器程序,用于接收客户端连接,把客户端发过来的字符串加上Hello再发回去。
首先创建一个基于IPv4和TCP协议的Socket,操作如下:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

接下来绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有网络地址,还可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,外部计算机无法连接进来。
端口号需要预先指定。因为我们写的服务不是标准服务,所以用9999这个端口号。注意,小于1024的端口号必须有管理员权限才能绑定,操作如下:

# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 监听端口
s.bind((host, port))

接着调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:

# 设置最大连接数,超过后排队
s.listen(5)

接下来,服务器程序通过一个永久循环接受来自客户端的连接,accept()会等待并返回一个客户端连接,操作如下:

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

每个连接都必须创建新线程(或进程)来处理,否则单线程在处理连接的过程中无法接受其他客户端连接,操作如下:

def tcp_link(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send('欢迎学习Python网络编程!'.encode('utf-8'))
    while True:
         data = sock.recv(1024)
         time.sleep(1)
         if not data or data.decode('utf-8') == 'exit':
             break
         sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)

连接建立后,服务器首先发一条欢迎消息,然后等待客户端数据,并加上Hello再发送给客户端。如果客户端发送了exit字符串,就直接关闭连接。
要使用这个服务器程序,我们还需要一个客户端程序,代码如下:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 建立连接
s.connect((host, port))
# 接收欢迎消息
print(s.recv(1024).decode('utf-8'))
for data in ['小萌', '小智', '小强']:
    # 发送数据
    s.send(data.encode('utf-8'))
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

注意,客户端程序运行完毕就退出了,而服务器程序会永远运行下去,必须按Ctrl+C退出程序。
下面是以上功能的完整代码。
服务端代码实现:

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

import socket
import threading
import time

def socket_server():
    # 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 获取本地主机名
   host = socket.gethostname()

    port = 9999

    # 绑定端口
    server_socket.bind((host, port))

    # 设置最大连接数,超过后排队
    server_socket.listen(5)

    while True:
         # 接受一个新连接
         sock, addr = server_socket.accept()
         # 创建新线程处理TCP连接
         t = threading.Thread(target=tcp_link, args=(sock, addr))
         t.start()

def tcp_link(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send('欢迎学习Python网络编程!'.encode('utf-8'))
    while True:
         data = sock.recv(1024)
         time.sleep(1)
         if not data or data.decode('utf-8') == 'exit':
             break
         sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)

def main():
    socket_server()

if __name__ == '__main__':
    main()

客户端代码实现:

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

import socket

def socket_client():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 获取本地主机名
    host = socket.gethostname()
    port = 9999
    # 建立连接
    s.connect((host, port))
    # 接收欢迎消息
    print(s.recv(1024).decode('utf-8'))
    for data in ['小萌', '小智', '小强']:
        # 发送数据
        s.send(data.encode('utf-8'))
        print(s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    s.close()

def main():
    socket_client()

if __name__ == '__main__':
    main()

服务器和客户端执行结果如图1和2所示。


服务器输出信息
2 客户端输出信息

UDP编程

TCP用于建立可靠连接,并且通信双方可以以流的形式发送数据。相对于TCP, UDP面向无连接的协议。
使用UDP协议时不需要建立连接,只需要知道对方的IP地址和端口号就可以直接发数据包。但是发送的数据包是否能到达就不知道了。
虽然用UDP传输数据不可靠,但是优点是速度快。对于不要求可靠到达的数据可以使用UDP协议。
下面来看如何通过UDP协议传输数据。和TCP类似,使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口,操作如下:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 9999
# 绑定端口
s.bind((host, port))

创建Socket时,SOCK_DGRAM指定了Socket的类型是UDP。绑定端口和TCP一样,不过不需要调用listen()方法,而是直接接收来自任何客户端的数据,操作如下:

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

recvfrom()方法返回数据和客户端的地址与端口。这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。
客户端使用UDP时,首先仍然是创建基于UDP的Socket,然后不需要调用connect(),直接通过sendto()给服务器发数据,操作如下:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 发送数据
    s.sendto(data, ('127.0.0.1', 9999))
    # 接收数据
    print(s.recv(1024).decode('utf-8'))
s.close()

下面是以上功能的完整代码。
服务器端:

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

import socket

def socket_udp_server():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = socket.gethostname()
    port = 9999
    # 绑定端口
    s.bind((host, port))

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

def main():
    socket_udp_server()

if __name__ == "__main__":
    main()

客户端:

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

import socket

def socket_udp_client():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    for data in ['小萌', '小智']:
         host = socket.gethostname()
         port = 9999
         # 发送数据
         s.sendto(data.encode('utf-8'), (host, port))
         # 接收数据
         print(s.recv(1024).decode('utf-8'))
    s.close()

def main():
    socket_udp_client()

if __name__ == '__main__':
    main()

服务器和客户端执行结果如图3和4所示。
3 服务器输出信息
4 客户端输出信息

urllib模块

在Python中,能使用的各种网络工作库中,功能最强大的是urllib。urllib能够通过网络访问文件,就像这些文件在我们电脑上一样。通过一个简单的函数调用,几乎可以把任何URL指向的事物用做程序输入。
urllib提供了一系列用于操作URL的功能,其中最常用的请求是GET和POST。下面简单介绍一下在Python中使用GET和POST请求。

1 GET请求

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定页面,然后返回HTTP响应,示例如下:

#! /usr/bin/python3
# -*- coding:UTF-8 -*-

from urllib import request

def get_request():
    with request.urlopen('http://www.baidu.com') as f:
         data = f.read()
         print('Status:', f.status, f.reason)
         for k, v in f.getheaders():
             print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8'))

def main():
    get_request()

if __name__ == "__main__":
    main()

运行程序,得到HTTP响应的头和JSON数据,代码如下:

     Status: 200 OK
     Content-Type: text/html
     Content-Length: 6234
     Data: 百度一下,你
就知道
</code></pre> 
 <p>如果想模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头可以把请求伪装成浏览器。</p> 
 <h3>2 POST请求</h3> 
 <p>如果要以POST发送一个请求,就要把参数data以bytes形式传入。<br> 模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn登录页的格式以username=xxx&password=xxx的编码传入,代码实现如下:</p> 
 <pre><code>#! /usr/bin/python3
# -*- coding:UTF-8 -*-

from urllib import request, parse

def login_post():
    print('Login to weibo.cn...')
    email = input('Email: ')
    passwd = input('Password: ')
    login_data = parse.urlencode([
         ('username', email),
         ('password', passwd),
         ('entry', 'mweibo'),
         ('client_id', ''),
         ('savestate', '1'),
         ('ec', ''),
         ('pagerefer',
          'https://passport.weibo.cn/signin/welcome?'
          'entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
    ])

    req = request.Request('https://passport.weibo.cn/sso/login')
    req.add_header('Origin', 'https://passport.weibo.cn')
    req.add_header('User-Agent',
                     'Mozilla/6.0 AppleWebKit/536.26 '
                     '(KHTML, like Gecko) Version/8.0'
                     ' Safari/8536.25')
    req.add_header('Referer',
                     'https://passport.weibo.cn/signin/login?'
                     'entry=mweibo&res=wel&wm=3349'
                     '&r=http%3A%2F%2Fm.weibo.cn%2F')

    with request.urlopen(req, data=login_data.encode('utf-8')) as f:
         print('Status:', f.status, f.reason)
         for k, v in f.getheaders():
             print('%s: %s' % (k, v))
         print('Data:', f.read().decode('utf-8'))

def main():
    login_post()

if __name__ == "__main__":
    main()
</code></pre> 
 <p>执行该程序,并输入对应的email和password,若账户存在,则得到如下结果:</p> 
 <pre><code>Status: 200 OK
Server: nginx/1.2.0
Date: Sat, 22 Oct 2016 08:38:37 GMT
......
Set-Cookie: SSOLoginState=1477125517; path=/; domain=weibo.cn
......
Data: {"retcode":20000000,"msg":"","data":{...,"uid":"3538172252"}}
</code></pre> 
 <p>若登录失败,则得到如下输出结果:</p> 
 <pre><code>     Status: 200 OK
     Server: nginx/1.2.0
     Date: Sat, 22 Oct 2016 08:46:04 GMT
     ......
     Data:
{"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"test@ali
yun.com","errline":634}}
</code></pre> 
 <p>urllib提供的功能是利用程序执行各种HTTP请求。如果要模拟浏览器完成特定功能,就要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头进行伪装,User-Agent头就是用来标识浏览器的。</p> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1751291578464354304"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(22 Python网络编程)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1946785229444280320.htm"
                           title="2021,从“心”出发--稻盛和夫《心》读后感-2" target="_blank">2021,从“心”出发--稻盛和夫《心》读后感-2</a>
                        <span class="text-muted">一心二艺</span>

                        <div>2021.01.01#日更#day22/2555我个人一直认为,信心只有两种状态,100%有信心的笃定,以及没有信心。信心不存在中间状态。所谓的90%的信心,或者60%的信心,其实就是没有信心。我的这种想法在稻盛和夫的《心》中也得到了印证、稻盛说成功人士和非成功人士的差距,关键在于,当遭遇前所未见的巨大障碍时,能不能对自己说”一定能跨越“。每当被问到’产品研发的成功率时多少时‘时,稻盛和夫都会毫不</div>
                    </li>
                    <li><a href="/article/1946771993290403840.htm"
                           title="2023-10-26" target="_blank">2023-10-26</a>
                        <span class="text-muted">栈道村</span>

                        <div>在守正创新中赓续历史文脉据人民网报导,“心相约,梦闪耀”。10月22日晚,第四届亚洲残疾人运动会开幕式在浙江杭州奥体中心体育场隆重举行。用“金桂花冠”向每一名运动员传递“逐梦折桂、舍我其谁”的美好寓意,以“金石篆刻”的艺术化表现诠释残疾运动员“精诚所至,金石为开”的拼搏精神,运动员入场时不同季节、不同风格的西湖十景借助地屏和网幕惊艶亮相……杭州亚残运会开幕式上,充满东方美学的艺术构思,传递诗情画意</div>
                    </li>
                    <li><a href="/article/1946762689556574208.htm"
                           title="2020-11-22" target="_blank">2020-11-22</a>
                        <span class="text-muted">池鱼20774</span>

                        <div>《小王子》读后感《小王子》这本书的作者是法国的安东尼·德·圣·埃克苏佩里。主要讲了小王子住在一个叫“B612号小行星”,那颗行星比小王子大不了多少,他趁候鸟迁徙时出走。先后拜访了六个星球,他拜访的第七个星球是地球。那儿有一百一十一位国王、七千位地理学家、九十万个商人、七百五十万个酒鬼、三亿一千一百万个爱慕虚荣的人。后来,他遇见了一只狐狸,在它的不断请求下,小王子终于驯服了狐狸。小王子要回到降落点—</div>
                    </li>
                    <li><a href="/article/1946739406933127168.htm"
                           title="2023-5-7晨间日记" target="_blank">2023-5-7晨间日记</a>
                        <span class="text-muted">心花_怒放</span>

                        <div>今天是什么日子起床:5:20就寝:22:40天气:多云心情:不美丽纪念日:无任务清单昨日完成的任务,最重要的三件事:很平常的一天工作改进:要做任务清单习惯养成:每天晨间日记周目标·完成进度暂无学习·信息·阅读《好好学习》健康·饮食·锻炼跳绳人际·家人·朋友一切如常工作·思考有了一个做细工作的计划最美好的三件事1.晚饭后娃们陪我去跳绳2.小儿子给自己买项链找了一个很好的理由,长得帅才要买3.小儿子就</div>
                    </li>
                    <li><a href="/article/1946728845109424128.htm"
                           title="日更第22天——改革开放40年" target="_blank">日更第22天——改革开放40年</a>
                        <span class="text-muted">晗梦</span>

                        <div>今天上午庆祝改革开放40周年大会在人民大会堂召开,公司组织领导们集中观看,也要求在岗的员工在网上观看直播。1978至2018年正好是40年,我是1982年出生的,基本上是赶在了改革开放最初的时候,但是我们是生活在小乡村的,对于传说的改革开放的传奇基本上是没啥感觉的,最直接的惠利就是那时候实行了家庭联产承包责任制,最起码不会挨饿了。印象深刻的是小时候每年秋季丰收之后,爸妈都要抓紧时间去交公粮,赶着我</div>
                    </li>
                    <li><a href="/article/1946716221307154432.htm"
                           title="22-C#的委托简单使用-2" target="_blank">22-C#的委托简单使用-2</a>
                        <span class="text-muted">水果里面有苹果</span>
<a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>C#的委托简单使用-2namespaceWindowsFormsApp1{publicdelegatevoidmydele(intx);//定义一个委托publicpartialclassForm1:Form{mydelemydele1;publicForm1(){InitializeComponent();mydele1=newmydele(run1);//委托实例化mydele1+=run2;</div>
                    </li>
                    <li><a href="/article/1946714854001799168.htm"
                           title="《啊呜一口,吃掉烦恼》:“蛋”愿没烦恼" target="_blank">《啊呜一口,吃掉烦恼》:“蛋”愿没烦恼</a>
                        <span class="text-muted">慕闲</span>

                        <div>你能想象食物们也有思维,也有喜怒哀乐吗?“蛋黄国外交大使Yolk”的暖心绘本《啊呜一口,吃掉烦恼》以22个食物小故事,专治不开心,为你带走烦恼。食物故事的背后,照见的是我们的内心,希望正在看这本书的我们都能,“蛋”愿没烦恼。一、有没有意义自己说了才算周末睡懒觉就是浪费时间?刷剧吃瓜就是浪费时间?无所事事就是浪费时间?我们被太多定义限制,一点点放松似乎都是罪大恶极。在忙碌中,不断要求自己积极向上,却</div>
                    </li>
                    <li><a href="/article/1946714346671370240.htm"
                           title="李商隐和他的诗" target="_blank">李商隐和他的诗</a>
                        <span class="text-muted">胡桃木_f625</span>

                        <div>图片发自App834年,大唐帝国爆发“甘露之变。”宫廷中的太监带着禁卫军,关起门来把大臣们杀的七零八落,朝廷很多岗位都空出来,却找不到人来上班。那时的大臣都很佛系,一杯茶、一张报纸就能熬一天,遇到事情也总是打哈哈:“以后再说,以后再说啊。”22岁的李商隐一摸胸口,感觉拔凉拔凉的。他有点接受不了突如其来的变故,于是就来到河南“灵都观”,打算安抚一下受伤的小心灵。这座道观是李隆基专门拨款修建的,只为给</div>
                    </li>
                    <li><a href="/article/1946701352566583296.htm"
                           title="2021-03-22" target="_blank">2021-03-22</a>
                        <span class="text-muted">木一的成长日记</span>

                        <div>角色转换。你不在了,但你来过,在我生命里留下痕迹,有一天我扮演着你的角色,去体会曾经的你是怎样的心情。替你去生活的同时,我也成为了喜欢的自己。努力读书是为了和别人好好说话,努力强身是为了让别人好好说话。想让世界对你温柔以待,首先你要值得被爱。想让别人对你好言相向,首先你要值得尊重或者让人不敢轻视。我记得那一次他走出校门时,因为没有立刻看到我显得惊慌失措。他犹如遭受突然一击似的呆立在那里,失望和不安</div>
                    </li>
                    <li><a href="/article/1946692567009652736.htm"
                           title="2022年4月22日《纪律教育》培训总结—梁晓燕+春蕾五幼" target="_blank">2022年4月22日《纪律教育》培训总结—梁晓燕+春蕾五幼</a>
                        <span class="text-muted">bf1938403052</span>

                        <div>一、感受相信很多人对行为主义教育体会都很深刻吧,但这种教育并不理想,并没有达到期望的效果。反而会激化问题,使得当事人更加厌恶去学,抵触学,甚至想尽办法逃离学习,丧失学习兴趣。适合的方式会事半功倍,不当的方式会难上加难。二、收获孩子的成长都是阶段性,不同阶段有不同的表现,我们也有不同的教育方式,静下心,耐心陪孩子,了解孩子。对孩子相应年龄抱与其年龄相仿的期望值,不要有太高的期望值,不要以“爱”的名义</div>
                    </li>
                    <li><a href="/article/1946690278739996672.htm"
                           title="思考笔记1392/2023-10-22" target="_blank">思考笔记1392/2023-10-22</a>
                        <span class="text-muted">农N代fun</span>

                        <div>黄奇帆老师的一篇文章《当下中国的发展,很多看起来是问题,实际上是成果。》其中一段关于数字经济的内容学习,因为作为数字化、智能化这个行业一线搬砖工人,对这一方面知识还是相当有感触,特别是今天读到这一段落,以黄奇帆老师的身份一定程度上也算是代表着国家级对这个行业顶层计划阐明发展方向了。(节选一)制造业数字化,就是要推进产业互联网、工业互联网。推进产业互联网将大大促进数字经济发展。我国曾提出数字经济三大</div>
                    </li>
                    <li><a href="/article/1946685702049689600.htm"
                           title="2019-1-2晨间日记" target="_blank">2019-1-2晨间日记</a>
                        <span class="text-muted">薄小仨</span>

                        <div>今天是什么日子起床:07:40就寝:22:30天气:晴心情:良好纪念日:无任务清单昨日完成的任务,最重要的三件事:1、系统升级完成2、阅读文章3、支持的系统问题修改改进:阅读速度慢并且看后记住的东西少,需要慢慢改正习惯养成:每天阅读周目标·完成进度1、每天阅读六篇文章2、每天早睡(10:30之前)3、每天跑3公里4、每天仰卧起坐1005、每天俯卧撑2006、坚持每天打卡学习·信息·阅读1、主要阅读</div>
                    </li>
                    <li><a href="/article/1946656592367775744.htm"
                           title="2025-04-22| Docker: --privileged参数详解" target="_blank">2025-04-22| Docker: --privileged参数详解</a>
                        <span class="text-muted"></span>

                        <div>在Docker中,--privileged是一个运行容器时的标志,它赋予容器特权模式,大幅提升容器对宿主机资源的访问权限。以下是--privileged的作用和相关细节:作用完全访问宿主机的设备:容器可以访问宿主机的所有设备(如/dev下的设备文件,包括GPU、USB设备等)。例如,容器可以直接操作宿主机的磁盘、分区或硬件设备。绕过权限限制:容器内的进程以接近宿主机root用户的权限运行,忽略许多</div>
                    </li>
                    <li><a href="/article/1946650830425878528.htm"
                           title="从农村到城市" target="_blank">从农村到城市</a>
                        <span class="text-muted">新秀飞羽</span>

                        <div>序当你想写些东西的时候,却无从下笔,这是为什么?是没有东西写还是不知从何写起,我想应该是没有值得写的东西吧!很久以前就想写些自己的经历,但是,总是感觉没有什么好写的,最近仔细想想,写出来就算是自己的回忆,到老了如果得了健忘症也可以拿出来看看,也算是对自己的一种安慰吧。正文1971年的中国还处在刚刚建国22年的非常时期,内忧外患使得全国各地的粮食非常紧缺,就在这一年的春三月,在豫北太行山东麓的一个小</div>
                    </li>
                    <li><a href="/article/1946638879075397632.htm"
                           title="2019-11-13晨间日记" target="_blank">2019-11-13晨间日记</a>
                        <span class="text-muted">ZYHJ</span>

                        <div>今天是什么日子起床:清晨6::00就寝:夜晚:22:30天气:风和日丽心情:愉快纪念日:任务清单昨日完成的任务,最重要的三件事:改进:习惯养成:生活规律周目标·完成进度学习·信息·阅读早读英语健康·饮食·锻炼晚餐散步人际·家人·朋友陪伴家人工作·思考继续努力最美好的三件事1.每天都有小进步2.3.思考·创意·未来保持原有节奏,继续努力</div>
                    </li>
                    <li><a href="/article/1946638244657557504.htm"
                           title="在疫情中遇上暴雨" target="_blank">在疫情中遇上暴雨</a>
                        <span class="text-muted">卉羽_57ad</span>

                        <div>2021年7月,新冠肺炎疫情犹如黑色的风暴再次袭击中国。它像一把无形的利剑悬在人们的头上,令人们终日惶恐不安。可如果仅仅是疫情,人们则可以躲在家里不出门,不与外界高危人群接触,注意卫生,那倒也安全。但是如果天气预报再告诉你:“2021年8月21至22日,我市将有一次强降雨天气过程。22日东北风四到五级,阵风七到九级。此次降水过程降水量和雨强较大。需加强灾害隐患点巡查排险,防范强降水引发的中小河流洪</div>
                    </li>
                    <li><a href="/article/1946636721819021312.htm"
                           title="22年4月23日《儿童纪律教育》培训感悟" target="_blank">22年4月23日《儿童纪律教育》培训感悟</a>
                        <span class="text-muted">正面管教王珊</span>

                        <div>王珊-春蕾八幼今天第二章的内容培训完了,越听感觉越吸引我,马老师讲的理论和实际案例让我很受益。一、气质类型没有好坏之分。之前我觉得外向性格的孩子好,又爱说、又主动,而内向的孩子觉得问问题也不回答,又不会心主动给人打招呼,听马老师说完,我才知道,不管是火象的孩子还是水象的孩子,不管是哪种气质类型,没有好坏之分,我们要用一双发现美的眼睛,看到孩子的优点。二、埃里克森发展阶段之信任信任在婴幼儿时期建立很</div>
                    </li>
                    <li><a href="/article/1946636591946592256.htm"
                           title="38-12.23 要化压力为动力" target="_blank">38-12.23 要化压力为动力</a>
                        <span class="text-muted">周芸15</span>

                        <div>感觉自己这两天心情不是太好,自己跟夹心面包一样,压抑、烦躁、委屈、心累……各种负面情绪,我不能这样,我要强大,我要做家里的定海神针。感赏女儿第一次炒菜,从买到切配到下锅再到出锅,轻轻松松搞定,色香味都可以。感赏女儿昨晚22点睡觉,比平时提前了一个小时左右。感赏女儿今天素描课,没有跟她打招呼,表舅去接的,没有情绪,跟着表舅回表舅家。感赏女儿中午在表舅家吃面条就榨菜,没有情绪(在家肯定不愿意的)感赏女</div>
                    </li>
                    <li><a href="/article/1946634687795490816.htm"
                           title="Lan的ScalersTalk第四轮新概念朗读持续力训练Day 288 20190722" target="_blank">Lan的ScalersTalk第四轮新概念朗读持续力训练Day 288 20190722</a>
                        <span class="text-muted">孙岚_9ff8</span>

                        <div>练习材料:[Day17602019-07-22]Lesson24-2BeautyThereisnoskyinJunesobluethatitdoesnotpointforwardtoabluer,nosunsetsobeautifulthatitdoesnotwakenthevisionofagreaterbeauty,avisionwhichpassesbeforeitisfullyglimps</div>
                    </li>
                    <li><a href="/article/1946615374942367744.htm"
                           title="2021-10-22" target="_blank">2021-10-22</a>
                        <span class="text-muted">和力</span>

                        <div>车祸今天中午,回来的路上,拐进市里的最后一个红绿灯,南边路口横竖的停着两辆车。黑色车的后备箱敞开着,灰色轿车插进了便道,车身上的零固件,散落在了整个路口。两个司机在路边,交谈商量着什么。我不算老司机,只开了三四年的车,车技也不算好。不过事故,除了刚开车时候的两起,到现在再也没有过。讲老实话,我有时候也挺猛的。我出的两起事故,一起是我撞别人,另一起是别人撞我。快速路上,洒水车刚刚走过,湿润的路面更加</div>
                    </li>
                    <li><a href="/article/1946599855459725312.htm"
                           title="20190309易效能5.0践行第三周总结" target="_blank">20190309易效能5.0践行第三周总结</a>
                        <span class="text-muted">小梨子_59bd</span>

                        <div>一、我的三个标签:1.两个孩子的母亲,父母的高度决定孩子的高度,不断学习,更好的陪伴,做孩子的榜样。2.财务工作者,目前在公司里负责财务管理工作。3.广东狮子会会员狮子会是一个公益慈善服务组织,出钱、出力、出心、出席,加入狮子会参加各项服务活动让我和我的家人更好的成长,收获更多的爱。让付出成为习惯。二、【90天大目标】(具体化,可衡量)1、运动:每周至少三次2、阅读:亲子阅读和自己阅读3、早睡22</div>
                    </li>
                    <li><a href="/article/1946591089074958336.htm"
                           title="2022-04-22" target="_blank">2022-04-22</a>
                        <span class="text-muted">曲奇珊</span>

                        <div>慢慢来,比较快。真正好的事物都需要长时间的积累和沉淀。放下对结果的执着,享受过程里的点滴收获。每一次练习都是对自我耐性的磨炼;每一次尝试都是对自我勇气的提升。把注意力拉回到当下,当下你能做到的事情上。慢一点,稳一点,看到的风景就更丰富一点。最大的收获永远在过程中。一点一滴地创造你唯一一次的人生——要精雕细琢,不随便,不将就。</div>
                    </li>
                    <li><a href="/article/1946571118496247808.htm"
                           title="人格魅力打磨之90天好习惯养成第3周总结" target="_blank">人格魅力打磨之90天好习惯养成第3周总结</a>
                        <span class="text-muted">Alice_abdb</span>

                        <div>1.早起5:00打卡7次,计划达成率100%.2.早睡22:20打卡7次,计划达成率100%.3.运动:累计跑量11公里,累计用时2小时,计划达成率100%.4.学习学习音频3.5小时,看书3.5小时,达成率100%.5.学习感悟本周学习叶武滨时间管理第13~19课程中讲到:时间管理的基础是精力管理。精力就是你的能量,这里面就包括了我们的体能、情绪、精神、情感……一次只养成一个习惯。人的自控力有限</div>
                    </li>
                    <li><a href="/article/1946567804421468160.htm"
                           title="2021-03-22" target="_blank">2021-03-22</a>
                        <span class="text-muted">爱咋咋地_134d</span>

                        <div>京心❤️达五店:卞颖2021年3月22落地真经严格就是爱,放纵既是害油卡目标:7张、完成2今天去百援学习,了解了火花塞的作用及危害,和怎么去和客户沟通,销售火花塞和其他产品。学习过程中老师讲的通俗易懂,很容易接受,当我们和客户沟通时也是一样道理,不需要太多的专业知识,通过沟通方式方法也一样可以让客户接受,下一步就是锻炼自己,勇敢的心张嘴去说,相信自己一定可以的。</div>
                    </li>
                    <li><a href="/article/1946567424358805504.htm"
                           title="2021-03-22 每日打卡" target="_blank">2021-03-22 每日打卡</a>
                        <span class="text-muted">来多喜</span>

                        <div>昨日完成情况:1.完成了3k跑,太久没锻炼体力跟不上,没力气做帕梅拉了。2.MathematicsforMachineLearning:LinearAlgebra学完了week3和week4,week5还剩大概一个小时学完,没有开始做思维导图。早上跑步回来后看《你是我的城池堡垒》看了两个小时,虽然一边看一边洗碗,洗完碗一边看一边吃饭,但是从三点多才开始学习。重要的事情要先做!3.没有时间做Pyth</div>
                    </li>
                    <li><a href="/article/1946567042198990848.htm"
                           title="程序员35岁失业,为什么还那么多人建议学计算机?" target="_blank">程序员35岁失业,为什么还那么多人建议学计算机?</a>
                        <span class="text-muted">大方老师讲单片机</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA%E5%AD%A6%E4%B9%A0/1.htm">单片机学习</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6/1.htm">硬件</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/scrum/1.htm">scrum</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a>
                        <div>35岁危机和996只存在于程序员、存在于互联网行业。生化环材嘛,只有22岁危机,毕业即失业或转行,也没有996倒是有7116。机械土木嘛,没什么危机,只不过只能拿计算机专业1/3的工资。医生教师嘛,是越老越吃香,可年轻的时候却只能吃土。讲真,计算机行业真的是底层劳动人民子女逆袭的最好专业,没有之一。这两天也有很多读者私聊我关于报志愿的问题,尤其是关于要不要报计算机专业的问题:对于要不要学计算机专业</div>
                    </li>
                    <li><a href="/article/1946564521988517888.htm"
                           title="【实操】信息安全工程师系列-第22关 网站安全需求分析与安全保护工程" target="_blank">【实操】信息安全工程师系列-第22关 网站安全需求分析与安全保护工程</a>
                        <span class="text-muted">披荆斩棘的GG</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>【实操】信息安全工程师系列-第22关网站安全需求分析与安全保护工程********永远不要信任用户输入。—安全编程格言一、网站安全基础概念与威胁分(一)核心定义**网站安全目标:**保障机密性(数据不泄露)、完整性(数据不被篡改)、可用性(服务不中断)和可控性(管理可控制)。**技术架构:**基于B/S架构,涉及网络通信、操作系统、数据库、Web服务器(如Apache、IIS)、Web应用及相关协</div>
                    </li>
                    <li><a href="/article/1946560276073607168.htm"
                           title="记录7" target="_blank">记录7</a>
                        <span class="text-muted">酸碱甜苦树辣</span>

                        <div>一切都结束了(9月29日)风和日丽,所以的人和事都很祥和,有点不适应。(9月26日)太阳依旧毒辣,丝毫不让秋天到来。(9月25日)今天站岗,脚痛!(9月24日)有点尴尬,今天才是中秋节!节日快乐!(9月22日)中秋节到了,给大家说声中秋节快乐!(9月21日)最好的状态就是你只管努力、保持认真、持续恬淡,一步一步向自己喜欢的事物慢慢靠近!(9月20日)</div>
                    </li>
                    <li><a href="/article/1946547173076299776.htm"
                           title="【启航班航海日志】 1今天阅读《草房子》10万字" target="_blank">【启航班航海日志】 1今天阅读《草房子》10万字</a>
                        <span class="text-muted">0e2ea6c34a3f</span>

                        <div>2这两天上课的时候,不是上英语就是上数学语文,很混乱,数学一般的写卷子,语文就是读一些课文和默写词语,英语就更简单了,背背背读一读就完了。3,每次我们都要午休,午休的时候老师给我们开空调,温度很低,22度,我们都要盖被子,起床的时候就是直接吃饭,每次吃饭的时候都很挤,都要往边上挪一挪,才能坐下,那个班里有好多人,所以都要挪一挪分两桌才可以坐下,有一部分中午就回家了,可是还有一大部分在那里睡觉,宿舍</div>
                    </li>
                    <li><a href="/article/1946531551235862528.htm"
                           title="袁爷爷一路走好" target="_blank">袁爷爷一路走好</a>
                        <span class="text-muted">木青MQ</span>

                        <div>#袁隆平逝世#据新华社报道,“杂交水稻之父”获得者袁隆平,5月22日13点07分在湖南长沙逝世,享年91岁。袁隆平是我国研究与发展杂交水稻的开创者,也是世界上第一个成功利用水稻杂种优势的科学家,被誉为“杂交水稻之父”。惊闻噩耗,至今还不敢相信,希望袁老一路走好!有些人虽然走了,但他一直活在我们心中!饮水思源,解决了这么多人吃饭问题的人将一直被历史铭记!!</div>
                    </li>
                                <li><a href="/article/30.htm"
                                       title="Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor" target="_blank">Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor</a>
                                    <span class="text-muted">yangshangchuan</span>
<a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E6%8A%BD%E5%8F%96/1.htm">信息抽取</a><a class="tag" taget="_blank" href="/search/HtmlExtractor/1.htm">HtmlExtractor</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E5%87%86%E6%8A%BD%E5%8F%96/1.htm">精准抽取</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E9%87%87%E9%9B%86/1.htm">信息采集</a>
                                    <div>HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。 
   
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。 
如</div>
                                </li>
                                <li><a href="/article/157.htm"
                                       title="java编程思想 -- 多态" target="_blank">java编程思想 -- 多态</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E6%80%81%E8%AF%A6%E8%A7%A3/1.htm">多态详解</a>
                                    <div>一: 向上转型和向下转型 
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人    子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =</div>
                                </li>
                                <li><a href="/article/284.htm"
                                       title="[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系" target="_blank">[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/dp/1.htm">dp</a>
                                    <div> 
      对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长.... 
 
      首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的</div>
                                </li>
                                <li><a href="/article/411.htm"
                                       title="storm 自定义 日志文件" target="_blank">storm 自定义 日志文件</a>
                                    <span class="text-muted">商人shang</span>
<a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/cluster/1.htm">cluster</a><a class="tag" taget="_blank" href="/search/logback/1.htm">logback</a>
                                    <div>Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现: 
1. 想要进行一些调试信息的输出 
2. 调试信息或者业务日志信息想要输出到一些固定的文件中 
  
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输</div>
                                </li>
                                <li><a href="/article/538.htm"
                                       title="Extjs3 SpringMVC使用 @RequestBody 标签问题记录" target="_blank">Extjs3 SpringMVC使用 @RequestBody 标签问题记录</a>
                                    <span class="text-muted">21jhf</span>

                                    <div>springMVC使用 @RequestBody(required = false) UserVO userInfo 
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下: 
(由于使用了父类aaa</div>
                                </li>
                                <li><a href="/article/665.htm"
                                       title="一些排错方法" target="_blank">一些排错方法</a>
                                    <span class="text-muted">文强chu</span>
<a class="tag" taget="_blank" href="/search/%E6%96%B9%E6%B3%95/1.htm">方法</a>
                                    <div>1、java.lang.IllegalStateException: Class invariant violation 
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228) 
at o</div>
                                </li>
                                <li><a href="/article/792.htm"
                                       title="Swing中文件恢复我觉得很难" target="_blank">Swing中文件恢复我觉得很难</a>
                                    <span class="text-muted">小桔子</span>
<a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a>
                                    <div>       我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间! 
       用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,</div>
                                </li>
                                <li><a href="/article/919.htm"
                                       title="php 文件操作" target="_blank">php 文件操作</a>
                                    <span class="text-muted">aichenglong</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6/1.htm">读取文件</a><a class="tag" taget="_blank" href="/search/%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6/1.htm">写入文件</a>
                                    <div>1 写入文件 
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab"); 
if(!$fp){ 
 echo "open file error" ; 
 
exit; 
} 
$outputstring="date:"." \t tire:".$tire."</div>
                                </li>
                                <li><a href="/article/1046.htm"
                                       title="MySQL的btree索引和hash索引的区别" target="_blank">MySQL的btree索引和hash索引的区别</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                                    <div>Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。           
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢</div>
                                </li>
                                <li><a href="/article/1173.htm"
                                       title="JAVA的抽象--- 接口 --实现" target="_blank">JAVA的抽象--- 接口 --实现</a>
                                    <span class="text-muted">百合不是茶</span>

                                    <div>抽象 接口 实现接口 
  
//抽象 类 ,方法 
  
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体 
抽象的定义使用abstract 
  
abstract class A 定义一个抽象类 例如: 
//定义一个基类
public abstract class A{ 
  
  
//抽象类不能用来实例化,只能用来继承 
//</div>
                                </li>
                                <li><a href="/article/1300.htm"
                                       title="JS变量作用域实例" target="_blank">JS变量作用域实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E4%BD%9C%E7%94%A8%E5%9F%9F/1.htm">作用域</a>
                                    <div><script> 
    var scope='hello'; 
    function a(){ 
       console.log(scope);   //undefined 
       var scope='world'; 
       console.log(scope);   //world 
       console.log(b);      </div>
                                </li>
                                <li><a href="/article/1427.htm"
                                       title="TDD实践(二)" target="_blank">TDD实践(二)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a>
                                    <div>实践题目:分解质因数 
Step1: 
单元测试: 
package com.bijian.study.factor.test;

import java.util.Arrays;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import com.bijian.</div>
                                </li>
                                <li><a href="/article/1554.htm"
                                       title="[MongoDB学习笔记一]MongoDB主从复制" target="_blank">[MongoDB学习笔记一]MongoDB主从复制</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。 
  事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。   本文介绍MongoDB的主从复制模式,需要指明</div>
                                </li>
                                <li><a href="/article/1681.htm"
                                       title="【HBase五】Java API操作HBase" target="_blank">【HBase五】Java API操作HBase</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a>
                                    <div>import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha</div>
                                </li>
                                <li><a href="/article/1808.htm"
                                       title="python调用zabbix api接口实时展示数据" target="_blank">python调用zabbix api接口实时展示数据</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>zabbix api接口来进行展示。经过思考之后,计划获取如下内容:     1、  获得认证密钥     2、  获取zabbix所有的主机组     3、  获取单个组下的所有主机     4、  获取某个主机下的所有监控项  </div>
                                </li>
                                <li><a href="/article/1935.htm"
                                       title="jsp取得绝对路径" target="_blank">jsp取得绝对路径</a>
                                    <span class="text-muted">byalias</span>
<a class="tag" taget="_blank" href="/search/%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84/1.htm">绝对路径</a>
                                    <div>在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下: 
 
一、使用${pageContext.request.contextPath} 
 
  代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。 
 
</div>
                                </li>
                                <li><a href="/article/2062.htm"
                                       title="Java定时任务调度:用ExecutorService取代Timer" target="_blank">Java定时任务调度:用ExecutorService取代Timer</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是: 
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被</div>
                                </li>
                                <li><a href="/article/2189.htm"
                                       title="SQL 优化原则" target="_blank">SQL 优化原则</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a>
                                    <div>  
一、问题的提出 
 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统</div>
                                </li>
                                <li><a href="/article/2316.htm"
                                       title="java 线程弹球小游戏" target="_blank">java 线程弹球小游戏</a>
                                    <span class="text-muted">CrazyMizzz</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a>
                                    <div>最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善 
 
 这里是提纲 
 1.线程弹球游戏实现 
 1.实现界面需要使用哪些API类 
 JFrame 
 JPanel 
 JButton 
 FlowLayout 
 Graphics2D 
 Thread 
 Color 
 ActionListener 
 ActionEvent 
 MouseListener 
 Mouse</div>
                                </li>
                                <li><a href="/article/2443.htm"
                                       title="hadoop jps出现process information unavailable提示解决办法" target="_blank">hadoop jps出现process information unavailable提示解决办法</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/jps/1.htm">jps</a>
                                    <div>hadoop jps出现process information unavailable提示解决办法       
jps时出现如下信息: 
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 -- </div>
                                </li>
                                <li><a href="/article/2570.htm"
                                       title="PHP图片水印缩放类实现" target="_blank">PHP图片水印缩放类实现</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>  
<?php
class Image{

	private $path;


	function __construct($path='./'){
		$this->path=rtrim($path,'/').'/';
	}

	//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度

	public function water($b,$l,$pos</div>
                                </li>
                                <li><a href="/article/2697.htm"
                                       title="IOS控件学习:UILabel常用属性与用法" target="_blank">IOS控件学习:UILabel常用属性与用法</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/UILabel/1.htm">UILabel</a>
                                    <div>参考网站: 
http://shijue.me/show_text/521c396a8ddf876566000007 
http://www.tuicool.com/articles/zquENb 
http://blog.csdn.net/a451493485/article/details/9454695 
http://wiki.eoe.cn/page/iOS_pptl_artile_281</div>
                                </li>
                                <li><a href="/article/2824.htm"
                                       title="完全手动建立maven骨架" target="_blank">完全手动建立maven骨架</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>建一个 JAVA 项目 : 
mvn archetype:create 
-DgroupId=com.demo 
-DartifactId=App 
[-Dversion=0.0.1-SNAPSHOT] 
[-Dpackaging=jar] 
 
 
建一个 web 项目 : 
mvn archetype:create 
-DgroupId=com.demo 
-DartifactId=web-a</div>
                                </li>
                                <li><a href="/article/2951.htm"
                                       title="配置清单" target="_blank">配置清单</a>
                                    <span class="text-muted">gengzg</span>
<a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a>
                                    <div>1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1

拷贝mt7601Usta.ko到/lib文件夹

拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹

拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm</div>
                                </li>
                                <li><a href="/article/3078.htm"
                                       title="Windows端口被占用处理方法" target="_blank">Windows端口被占用处理方法</a>
                                    <span class="text-muted">huqiji</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a>
                                    <div>以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等.        这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&</div>
                                </li>
                                <li><a href="/article/3205.htm"
                                       title="开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !" target="_blank">开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !</a>
                                    <span class="text-muted">天梯梦</span>
<a class="tag" taget="_blank" href="/search/mobile/1.htm">mobile</a>
                                    <div>CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,</div>
                                </li>
                                <li><a href="/article/3332.htm"
                                       title="简单工厂设计模式" target="_blank">简单工厂设计模式</a>
                                    <span class="text-muted">hm4123660</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%8E%82%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">工厂设计模式</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/1.htm">简单工厂模式</a>
                                    <div>       简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 </div>
                                </li>
                                <li><a href="/article/3459.htm"
                                       title="maven笔记" target="_blank">maven笔记</a>
                                    <span class="text-muted">zhb8015</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                                    <div>跳过测试阶段: 
mvn package -DskipTests 
临时性跳过测试代码的编译: 
mvn package -Dmaven.test.skip=true 
  
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。 
  
指定测试类 
mvn test</div>
                                </li>
                                <li><a href="/article/3586.htm"
                                       title="非mapreduce生成Hfile,然后导入hbase当中" target="_blank">非mapreduce生成Hfile,然后导入hbase当中</a>
                                    <span class="text-muted">Stark_Summer</span>
<a class="tag" taget="_blank" href="/search/map/1.htm">map</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a><a class="tag" taget="_blank" href="/search/reduce/1.htm">reduce</a><a class="tag" taget="_blank" href="/search/Hfile/1.htm">Hfile</a><a class="tag" taget="_blank" href="/search/path%E5%AE%9E%E4%BE%8B/1.htm">path实例</a>
                                    <div>最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile</div>
                                </li>
                                <li><a href="/article/3713.htm"
                                       title="jsp web tomcat 编码问题" target="_blank">jsp web tomcat 编码问题</a>
                                    <span class="text-muted">王新春</span>
<a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/pageEncode/1.htm">pageEncode</a>
                                    <div>今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性: 
 
 

      <Connector port="8080" protocol="HTTP/1.1" 
               connectionTi</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>