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/1950232190038110208.htm"
                           title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a>
                        <span class="text-muted">universe_01</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div>
                    </li>
                    <li><a href="/article/1950225530758426624.htm"
                           title="2021-会说话的人运气都不会太差-会说话的人更善于倾听(5)沉默、留白" target="_blank">2021-会说话的人运气都不会太差-会说话的人更善于倾听(5)沉默、留白</a>
                        <span class="text-muted">12_德德</span>

                        <div>21、说话时,如想强调某一部分,一个有效方法是,以沉默留出空白。留出多大空白才好呢?7秒。22、沉默所营造的“空白”长度,说的人感觉到的,是实际长度的3倍,而听的人感觉到的,则只有实际长度的1/3。23、只要善于用“一直”来表达,就不会给人以不过是一时任性之感。能说“一直”的人,会得到周围的支持,在合适的时候想到你。24、要得到“是把好手”的高度评价,就要展示你对公司的热爱。特别是,如能对上司或公</div>
                    </li>
                    <li><a href="/article/1950218653983109120.htm"
                           title="刻意忽视孩子的成功,会让孩子迷失存在价值" target="_blank">刻意忽视孩子的成功,会让孩子迷失存在价值</a>
                        <span class="text-muted">草原野狼战队</span>

                        <div>2020年5月22日星期五晴亲子日记2014级7班马驰翔爸爸893苏珊·福沃德在《中毒的父母》一书中提到:小孩子不会区分事实和笑话,他们会相信父母说的有关自己的话,并将其变为自己的观点。中国式的父母总是习惯用对比式的教育方式去“刺激”孩子,过分关注别人家的孩子,这种看似微不足道的习惯,却给孩子的未来造成着巨大的影响,其中最严重的一点就是用生命去证明自己存在的价值。在我身边有一个非常鲜活却让人痛心的</div>
                    </li>
                    <li><a href="/article/1950216926445760512.htm"
                           title="Matrix-Breakout 2 Morpheus靶场解题过程" target="_blank">Matrix-Breakout 2 Morpheus靶场解题过程</a>
                        <span class="text-muted"></span>

                        <div>信息收集目标探测靶机目标很明显就是61.139.2.141了扫描开放端口发现22、80、81访问端口主机访问80翻译一下,并没有发现什么审查源代码发现里面有一张图片,下载下来看看是否有图片的隐写wgethttp://61.139.2.141/trinity.jpegstegoveritas-itrinity.jpeg-o/home/kali/Desktop/11分解后发现什么都没有,里面的keep</div>
                    </li>
                    <li><a href="/article/1950212283061825536.htm"
                           title="女生必备技能:如何一眼辨别渣男?" target="_blank">女生必备技能:如何一眼辨别渣男?</a>
                        <span class="text-muted">艾零的奇异世界</span>

                        <div>我相信女孩子都不喜欢渣男,虽然也很喜欢看那些渣男出现的奇葩事,而且看完还得自己思考一下人生,这癖好我懂我懂!不过最近渣男出现的频率极高,甚至有点儿惊悚。3月28日芜湖市新市口,红色路虎车上烧死两人。只因男子苦追女子被拒。结果呢,男子想着呀,那就一起命送黄泉!可怜的女孩子死都没法摆脱渣男。4月12日,22岁女孩带着肚子里的孩子自杀,而渣男是准备继承皇位的花花公子。女孩3个月内打胎2次,自杀后还被键盘</div>
                    </li>
                    <li><a href="/article/1950207072004009984.htm"
                           title="【备孕故事】她一直想做个大差不离的人,没想到在这件事上拔了尖儿" target="_blank">【备孕故事】她一直想做个大差不离的人,没想到在这件事上拔了尖儿</a>
                        <span class="text-muted">宜嘉阿姨</span>

                        <div>图片发自App杨婷说从小到大自己就是个中规中矩的人,不出格,不落单,一直随着大流。学业上从未出类拔萃,却也跟着大部队一起考上了一本;做事从不冒尖,搞个大差不离就行,因此,这么多年以来,差不多就行成了她对自己人生的要求。22岁大学毕业进了一家国企,外型不出挑但文静可人的她也遇上了两位追求者,简单的观察和交往后,她从中选了李广作为自己的婚恋对象。25岁那年,在父母亲朋的祝福声中杨婷和李广步入了婚姻。婚</div>
                    </li>
                    <li><a href="/article/1950195246310682624.htm"
                           title="【日更挑战】本季联盟50大球星(46-44)" target="_blank">【日更挑战】本季联盟50大球星(46-44)</a>
                        <span class="text-muted">扁圆柱体</span>

                        <div>日更挑战当前排名:第153天,第2269名,较昨日前进10名。46.KrisLetang,后卫,匹兹堡企鹅上赛季,Letang在55场比赛中得到45分(7球,38助攻),在所有后卫中,和闪电的VictorHedman并列第三,他在同等人数下的净胜球是+20,位列全队第一。而这个成绩在联盟自2009-10赛季统计该项指标后,是个人第二好成绩(+22,2011-12赛季)。Letang平均每场有24分</div>
                    </li>
                    <li><a href="/article/1950191461337198592.htm"
                           title="算法刷题-动态规划之背包问题" target="_blank">算法刷题-动态规划之背包问题</a>
                        <span class="text-muted"></span>

                        <div>1.背包问题之01(4.30)题目描述小明有一个容量为VV的背包。这天他去商场购物,商场一共有NN件物品,第ii件物品的体积为wiwi,价值为vivi。小明想知道在购买的物品总体积不超过VV的情况下所能获得的最大价值为多少,请你帮他算算。输入描述输入第11行包含两个正整数N,VN,V,表示商场物品的数量和小明的背包容量。第2∼N+12∼N+1行包含22个正整数w,vw,v,表示物品的体积和价值。1</div>
                    </li>
                    <li><a href="/article/1950185186775855104.htm"
                           title="August 22,Thursday & Jeudi 转院康复第三天" target="_blank">August 22,Thursday & Jeudi 转院康复第三天</a>
                        <span class="text-muted">emmanuelleZHAO</span>

                        <div>今天是转院康复第三天,已经三天没有做肢体康复了。昨天下午是医生忘记了,今天是我哥忘记了。陪床这十几天,感觉最累的是家人对治病的意见不一致。比如今天,我哥就要出院,才来三天就要出院,开玩笑吧……妈妈现在失语比较厉害,所以练习吞咽的同时还需要练习语言功能。这是一个慢慢恢复的过程,而且即使恢复了,也不会恢复到生病之前到状态。需要有这个心里准备…我这里比较麻烦的事.人在北京,。9月中旬前还可以,9月中旬后</div>
                    </li>
                    <li><a href="/article/1950183899388768256.htm"
                           title="修改CentOS的SSH登录端口(22端口)" target="_blank">修改CentOS的SSH登录端口(22端口)</a>
                        <span class="text-muted">❀͜͡傀儡师</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>要修改CentOS系统的SSH服务默认端口(22端口),请按照以下步骤操作:备份SSH配置文件sudocp/etc/ssh/sshd_config/etc/ssh/sshd_config.bak编辑SSH配置文件sudovi/etc/ssh/sshd_config查找并修改端口设置找到以下行(大约在第13行左右):#Port22取消注释并添加新端口(例如使用56001):#Port22Port56</div>
                    </li>
                    <li><a href="/article/1950168017585369088.htm"
                           title="2020-02-22" target="_blank">2020-02-22</a>
                        <span class="text-muted">牵手觉醒</span>

                        <div>100天自我成长穿越故事分享第44天幸福之家~~学梅幸福之家~~家风:幸福人生,由我做主幸福之家~~家规:每天一份看见,三条感恩使命:自我觉醒,引领家族,利人利己愿景:国泰民安,宜室宜家,举案齐眉,父慈女孝,其乐融融身份:我是一位智慧的母亲,是一位传递爱与温暖的心理教练。朋友昨天晚上和家人闹别扭,到今早还是闹的不可开交,朋友的孩子从昨晚就怕的给我打电话,可奈何爱人值班,我不能前往。今天我去到朋友家</div>
                    </li>
                    <li><a href="/article/1950165742594879488.htm"
                           title="在Ubuntu24.04搭建VLLM, SGLang 和 LangChain环境" target="_blank">在Ubuntu24.04搭建VLLM, SGLang 和 LangChain环境</a>
                        <span class="text-muted">小熊冲!冲!冲!</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a>
                        <div>在Ubuntu24.04搭建VLLM,SGLang和LangChain环境[!NOTE]概述整片文章是笔者的回忆(白天忙碌了一天,晚上进行的总结),所以有些地方的描述可能有误差,本文更多的是大体方向问题,细节步骤不是本文的重点,见谅!!!如何安装Ubuntu24.04制作启动U盘,作者使用的是rufus.exe工具下载Ubuntu24.04的ISO镜像使用rufus.exe工具刷入Ubuntu22</div>
                    </li>
                    <li><a href="/article/1950146206252462080.htm"
                           title="OnJava8-学习分享(附资源)" target="_blank">OnJava8-学习分享(附资源)</a>
                        <span class="text-muted">李超同学</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E4%B9%A6%E7%B1%8D/1.htm">书籍</a><a class="tag" taget="_blank" href="/search/onjava8/1.htm">onjava8</a>
                        <div>本书是布鲁斯•埃克尔时隔15年,继ThinkinginJava之后又一力作,基于Java的3个长期支持版(Java8、11、17),讲解Java核心语法,并对Java的核心变化进行详述。全书内容通俗易懂,配合示例讲解逐步深入,并结合实际开发需要,从语言底层设计出发,有效帮读者规避一些常见的开发陷阱。主体部分共22章,内容包含对象、操作符、控制流、初始化和清理、复用、多态、接口、内部类、集合、函数式</div>
                    </li>
                    <li><a href="/article/1950137877904027648.htm"
                           title="Docker部署Minio" target="_blank">Docker部署Minio</a>
                        <span class="text-muted">YiShuoChen666</span>
<a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/minio/1.htm">minio</a>
                        <div>一、拉取镜像dockerpullminio/minio:RELEASE.2025-04-22T22-12-26Z注:这里使用的版本是RELEASE.2025-04-22T22-12-26Z,最新的版本Web-UI界面没有管理bucket和其它的操作按钮,需要通过mc命令来实现,这对于新手很不友好二、创建目录,来存放minio的配置和将来放的文件mkdir-p/home/minio/configmk</div>
                    </li>
                    <li><a href="/article/1950134036592652288.htm"
                           title="海外社交媒体对企业的22大好处" target="_blank">海外社交媒体对企业的22大好处</a>
                        <span class="text-muted">涉途点思</span>

                        <div>使用社交媒体进行业务活动有什么好处?考虑到现在全球有超过42亿活跃的社交媒体用户。如果您没有在数字营销策略中利用社交,那么您将错过一种快速,廉价且有效的方式来覆盖世界上近一半的人口。让我们来看看社交媒体可以帮助您与目标受众建立联系,与客户互动并发展业务的多种方式。社交媒体对品牌建设的好处1.提高品牌知名度全球超过一半的人口使用社交媒体,Facebook,Instagram或Twitter等平台是吸</div>
                    </li>
                    <li><a href="/article/1950129432928776192.htm"
                           title="厂商文件曝光!揭露低价公模机成本秘密(二)" target="_blank">厂商文件曝光!揭露低价公模机成本秘密(二)</a>
                        <span class="text-muted">weixin_34082695</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>厂商文件曝光!揭露低价公模机成本秘密(二)2007-10-0920:22:36来源:iMP3.net网友评论0条进入论坛七、细节的一些对比:1、机器正面,背面外壳的保护膜。YOTO所有机器的保护模都是单独订制,保护模分正面显屏的贴膜和背壳的贴膜。T52正面的保护膜和背壳的保护膜MVP800正面的保护膜另外每台机器出货的时候都会被擦试得非常干净,显屏内不会出现灰尘。贴膜和擦拭专门有4人进行擦拭,这也</div>
                    </li>
                    <li><a href="/article/1950106242563239936.htm"
                           title="我的ThinkPHP5框架开发22讲:从入门到实践的探索之旅" target="_blank">我的ThinkPHP5框架开发22讲:从入门到实践的探索之旅</a>
                        <span class="text-muted">a1237567892</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>我的ThinkPHP5框架开发22讲:从入门到实践的探索之旅在编程的世界里,框架就像是一座座灯塔,照亮着开发者前行的道路。而当我第一次接触到ThinkPHP5这个PHP框架时,它就像是我探索路上的那颗最亮的星。今天,我想和大家分享我的ThinkPHP5框架开发22讲,这是我从一个初学者到逐渐熟练的实践过程。第1讲:初识ThinkPHP5记得那是一个阳光明媚的周末,我在网上浏览PHP框架的资料时,偶</div>
                    </li>
                    <li><a href="/article/1950103231434649600.htm"
                           title="2021-10-18晨间日记" target="_blank">2021-10-18晨间日记</a>
                        <span class="text-muted">飞翔_8019</span>

                        <div>今天是什么日子起床:5:45就寝:22:30天气:晴天心情:好纪念日:九月十三叫我起床的不是闹钟是梦想年度目标及关键点:年收入十万本月重要成果:投资理财学习今日三只青蛙/番茄钟1.晨间日记2.读书3.复盘成功日志-记录三五件有收获的事务1.今天早上铃声还没有响起的时候就醒了,说明生物钟起了作用。已经能够形成早上五点起床的习惯了,继续坚持,不能再睡懒觉了。财务检视交电费30元人际的投入无开卷有益-学</div>
                    </li>
                    <li><a href="/article/1950066060795375616.htm"
                           title="2019-05-22" target="_blank">2019-05-22</a>
                        <span class="text-muted">俞巧红</span>

                        <div>【书名】坚毅【作者】卡洛琳﹒亚当斯﹒米勒【页数】266【已读】266一、坚毅的核心构成1.与他人建立积极的关系具有这种品质的人,能对他人产生积极的影响,以积极的方式将我们拉进他们的生活之中。而且他们宽厚包容,从不狭隘排外。他们推动团队协作,将热情带入到对目标的追求之中,这使得他们能够与他人建立深厚的友谊。他们不但爱他人、欣赏他人,也习惯于被他人爱和欣赏。2.心怀希望,乐观豁达尽管拥有这一特质的人在</div>
                    </li>
                    <li><a href="/article/1950061360687673344.htm"
                           title="大三女生未婚生子,因得不到8万彩礼抛弃孩子,男人和孩子太可怜" target="_blank">大三女生未婚生子,因得不到8万彩礼抛弃孩子,男人和孩子太可怜</a>
                        <span class="text-muted">晓角心语</span>

                        <div>孩子是天使,更是一个甜蜜的责任,可一双稚嫩的肩膀很难承担起这份责任。最终,承担这份苦果的却是那个襁褓中的孩子。情感案例:大三女生彭丽和22岁的男孩曾铁钟相恋了,可这份甜蜜的恋情被突如其来的孩子“打断了”。彭丽的妈妈是不同意女儿没毕业、没结婚就生孩子,但婆婆向彭丽承诺只要她生完孩子,就会给她8万元彩礼,让他们结婚。彭丽信以为真,生下了孩子。但婆婆却出尔反尔,不愿出8万彩礼了,还坚决否认自己当初的承诺</div>
                    </li>
                    <li><a href="/article/1950060581377601536.htm"
                           title="周一 2021-05-17 06:29 - 22:00 雨 08h20m" target="_blank">周一 2021-05-17 06:29 - 22:00 雨 08h20m</a>
                        <span class="text-muted">么得感情的日更机器</span>

                        <div>一时间记录二概述早上醒来,看小说,洗漱,吃饭上午论文,吃饭下午小说,午休,总结,打疫苗,吃饭晚上日常任务,小说,洗漱,睡觉三总结(Summary)今天是论文和打疫苗的一天,总体感觉良好,学习感觉没咋学四反思今天收获了什么?哪里做的不好?做得不好的原因是什么?以后怎样避免或改进?4.1今日收获论文4.2今日不足编程学习醒了因为实验室没开门,就不愿意去,这可怎么办</div>
                    </li>
                    <li><a href="/article/1950055488985034752.htm"
                           title="30周年,不忘初心,砥砺前行" target="_blank">30周年,不忘初心,砥砺前行</a>
                        <span class="text-muted">nwcrazysword</span>

                        <div>2018年12月22日,冬至。时隔六年,全公司员工再次聚在一起,举行30周年庆典。出席大佬中有不少曾经的老前辈,如今也是各大互联网公司领军人物,当晚同坐一堂,心里也是蛮激动的。整晚,虽与大奖无缘,可也算是坐在演唱会一般的舞台前,感受视觉盛宴。</div>
                    </li>
                    <li><a href="/article/1950043905902833664.htm"
                           title="《金文成〈正蒙〉日记76。2020-9-22》" target="_blank">《金文成〈正蒙〉日记76。2020-9-22》</a>
                        <span class="text-muted">金吾生</span>

                        <div>《金文成〈正蒙〉日记76。2020-9-22》今天是庚子乙酉戊辰,八月初六,2020年9月22日星期二。今日秋分。至当篇8【〖浩然无害,则天地合德;照无偏系,则日月合明;天地同流,则四时合序;酬酢不倚,则鬼神合吉凶〗。天地合德,日月合明,然后能无方体;能无方体,然后能无我。】船山讲解说,方体,指的是用;我,指的是本体。当方皆为可行之方,当体皆为可立之体,则私意尽而廓然大公,可与天地同化了。无方体,</div>
                    </li>
                    <li><a href="/article/1950042886292697088.htm"
                           title="郑欢洋好习惯践行 16/90天打卡" target="_blank">郑欢洋好习惯践行 16/90天打卡</a>
                        <span class="text-muted">曲蔓地</span>

                        <div>【易效能亲子第二个90天践行】#宣言温柔而坚定;言行一致立规则#孩子第四个30天目标::)番茄土豆炖青蛙:)早睡:8:15睡前准备:)运动家长第四个30天目标:)早睡早起:22:30:)收集、排程、执行:)一周慢跑三次;加油小宝郑欢洋-9岁践行打卡16/90早睡:9:40青蛙:28/60番茄:17/100运动:❎阅读:✅琵琶:✅英语:✅24点:❎朗诵:❎看清单:✅3、今日闪光点给妈妈准备DHA。琵</div>
                    </li>
                    <li><a href="/article/1950037935994761216.htm"
                           title="听“为奥运冠军把脉的名医”段桂华教授讲解“心脏突发症的发生与预防”专题讲座" target="_blank">听“为奥运冠军把脉的名医”段桂华教授讲解“心脏突发症的发生与预防”专题讲座</a>
                        <span class="text-muted">杨姐慢生活</span>

                        <div>为了唤起人们对心血管病及其危险因素的认识,普及心脏病的预防以及突发症的急救知识,在世界心脏日来临之前,由济宁市文化和旅游局主办,济宁市图书馆、济宁市图书馆学会承办,于9月22日上午在济宁市图书馆一楼多功能厅共同举办了“心脏突发症的发生与预防”专题讲座。本次讲座作为济宁市图书馆全新阅读品牌活动“杏坛讲堂”的首次活动,特邀请被誉为“为奥运冠军把脉的名医”段桂华教授为广大市民朋友讲解心脏突发症的发生与预</div>
                    </li>
                    <li><a href="/article/1950037806411739136.htm"
                           title="22晨间日记" target="_blank">22晨间日记</a>
                        <span class="text-muted">讨喜的鱼</span>

                        <div>2018年9月28日,今天五点半的闹钟,压根就没听到。一醒来已经6点半了,不过没事,多睡一个小时是好的。错就错在昨晚太晚睡,以后要保证自己的睡眠时间。睡觉是目前来说,感到幸福的几件事之一,不能压榨它。时间对每个人来说都是一样的,再有钱的人也留不住它。要珍惜时间,所先要做的是让时间有价值。这样一来,时间等于金钱,这个公式才成立。对我来说,能明显感觉到自己的进步。第一是速度明显提高的,一个小时,能写出</div>
                    </li>
                    <li><a href="/article/1950026590045925376.htm"
                           title="2018-12-22" target="_blank">2018-12-22</a>
                        <span class="text-muted">英英_5eb2</span>

                        <div>这么多年了,有一些事情一直还想不通。上班是为了生活。可为什么总因为工作中的一点点小事,一小步的升迁而让自己无限烦恼?如果能放下那一点点小小的执念,也许一切都海阔天空。很多时候,差一个级别又能怎样?人不是为级别而活着的。况且一旦退休,那么什么级别,大家都一样。何苦为了那一点点差距,而让你整个的生活都失去了光芒。人总是很难看清自己现在的处境。但是时过境迁,再回头的时候会发现自己是那么的傻,那么的痴迷。</div>
                    </li>
                    <li><a href="/article/1949988817687605248.htm"
                           title="2018-02-22 新的一天,加油!" target="_blank">2018-02-22 新的一天,加油!</a>
                        <span class="text-muted">紫罗兰Shirley</span>

                        <div>从初四加班到今天,心情复杂!明天就是公司正式开工的日子,这个春节看了一部连续剧《欢乐颂2》,昨晚终于看完,看完之后就删除了视频软件。人生苦短,时间要好好把握。不然,人生真的白活了。</div>
                    </li>
                    <li><a href="/article/1949977653259857920.htm"
                           title="2021-02-22" target="_blank">2021-02-22</a>
                        <span class="text-muted">不存在的真实</span>

                        <div>去想象世间本就没有的事物,就像人类是如何想象出圆形的呢?看着月亮反复的问到为什么人类可以想象出圆?世界上没有完美的圆人类是怎么想象出来的呢?可月亮算吗?太阳呢?人类总是被曲线所吸引。为什么我们的世界这么奇怪:都是那么多的线条?数学连接了心灵感知的抽象世界和完全没有生命的真实的物质世界</div>
                    </li>
                    <li><a href="/article/1949963382513790976.htm"
                           title="Python,C++开发环球旅游之印度APP" target="_blank">Python,C++开发环球旅游之印度APP</a>
                        <span class="text-muted">Geeker-2025</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>以下是针对印度旅游的Python与C++开发环球旅行APP的定制化方案,深度整合印度本土化需求与技术挑战:---###**一、技术架构调整(印度特色适配)**```diff-美国方案调整点:+语言支持:22种官方语言实时切换(集成BhashiniAI)+交通算法:混合交通模式路径规划(突突车/人力车/火车)+离线功能:低带宽优化+本地化数据压缩(SIM卡级区域包)+支付系统:UPI统一支付接口+P</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>