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/1943985461995302912.htm"
                           title="22、文档:Google Docs的强大与易用性" target="_blank">22、文档:Google Docs的强大与易用性</a>
                        <span class="text-muted">pear55</span>
<a class="tag" taget="_blank" href="/search/%E6%8E%A2%E7%B4%A2%E4%BA%91%E6%8A%80%E6%9C%AF%E7%9A%84%E6%97%A0%E9%99%90%E5%8F%AF%E8%83%BD/1.htm">探索云技术的无限可能</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/Docs/1.htm">Docs</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E7%AB%AF%E6%96%87%E6%A1%A3/1.htm">云端文档</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/1.htm">语音输入</a>
                        <div>文档:GoogleDocs的强大与易用性1.GoogleDocs简介GoogleDocs是Google提供的在线办公套件的一部分,它是一个基于云端的文字处</div>
                    </li>
                    <li><a href="/article/1943802516584067072.htm"
                           title="BOOT_KEY按键(学习笔记)" target="_blank">BOOT_KEY按键(学习笔记)</a>
                        <span class="text-muted">小高Baby@</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>先来让我们了解一下GPIO是什么吧,它在单片机中也有很重要的作用,接下来我们来看看吧。esp32C3是QFN32封装(一种集成电路(IC)封装类型),GPIO引脚一共有22个,从GPIO-0到GPIO-21。从理论上来说,所有的IO引脚都可以复用为任何外设功能,但有些引脚用作连接芯片内部FLASH或者外部FLASH功能时,官方不建议用作其它用途。esp32c3的GPIO,可以用作输入、输出,可以配</div>
                    </li>
                    <li><a href="/article/1943740250392162304.htm"
                           title="jetson agx orin 刷机、cuda、pytorch配置指南【亲测有效】" target="_blank">jetson agx orin 刷机、cuda、pytorch配置指南【亲测有效】</a>
                        <span class="text-muted"></span>

                        <div>jetsonagxorin刷机指南注意事项刷机具体指南cuda环境配置指南Anconda、Pytorch配置注意事项1.使用设备自带usbtoc的传输线时,注意c口插到orin左侧的口,右侧的口不支持数据传输;2.刷机时需准备ubuntu系统,可以是虚拟机,注意安装SDKManager刷机时,JetPack版本要选对,JetPack6.0的对应ubuntu22,cuda12版本,对应pytorch</div>
                    </li>
                    <li><a href="/article/1943666760947396608.htm"
                           title="Xshell连接上服务器" target="_blank">Xshell连接上服务器</a>
                        <span class="text-muted">知还215</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>1.首先打开Xshell2.点击左上角的新建如下图3.设置名称,服务器公网协议选SSH,端口号默认22即可主机就是服务器的公网4.点击左边用户身份验证用户名是服务器的用户名(默认root)密码是服务器的密码方法如图选择即可5.点击右上角的确定即可6.出现:Welcomto...即代表连接成功</div>
                    </li>
                    <li><a href="/article/1943641927689760768.htm"
                           title="小诗《苦》赏析(“诗人”我/智普清言/DeepSeek)" target="_blank">小诗《苦》赏析(“诗人”我/智普清言/DeepSeek)</a>
                        <span class="text-muted">梦幻精灵_cq</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>苦有万千分好坏,人成百样须努力。  笔记模板由python脚本于2025-07-1107:22:06创建,本篇笔记适合喜欢中文诗的coder翻阅。学习的细节是欢悦的历程  博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。Python官网:  这里,才python前沿。英文原版,原汁原味,才是寻根溯源的正统。地址:https://www.python.org/Free:  大咖免费“圣</div>
                    </li>
                    <li><a href="/article/1943604234612174848.htm"
                           title="【2025/07/10】GitHub 今日热门项目" target="_blank">【2025/07/10】GitHub 今日热门项目</a>
                        <span class="text-muted">Albert_Lsk</span>
<a class="tag" taget="_blank" href="/search/Github%E6%8E%A8%E8%8D%90/1.htm">Github推荐</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E5%8D%8F%E8%AE%AE/1.htm">开源协议</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a>
                        <div>GitHub今日热门项目每日精选优质开源项目|发现优质开源项目,跟上技术发展趋势报告概览统计项数值说明报告日期2025-07-10(周四)GitHubTrending每日快照数据时间22:35:44实时生成项目总数16个精选热门开源项目⭐总星数248.8K社区认可度指标今日热度+3.5K24小时新增关注数据洞察核心指标项目总览16个精选项目⭐社区认可248.8K总星标数今日热度3.5K新增关注平均</div>
                    </li>
                    <li><a href="/article/1943483449176289280.htm"
                           title="【氮化镓】低剂量率对GaN HEMT栅极漏电的影响" target="_blank">【氮化镓】低剂量率对GaN HEMT栅极漏电的影响</a>
                        <span class="text-muted">北行黄金橘</span>
<a class="tag" taget="_blank" href="/search/%E6%B0%AE%E5%8C%96%E9%95%93%E5%99%A8%E4%BB%B6%E5%8F%AF%E9%9D%A0%E6%80%A7/1.htm">氮化镓器件可靠性</a><a class="tag" taget="_blank" href="/search/GaN/1.htm">GaN</a><a class="tag" taget="_blank" href="/search/HEMT/1.htm">HEMT</a><a class="tag" taget="_blank" href="/search/%E6%B0%AE%E5%8C%96%E9%95%93/1.htm">氮化镓</a><a class="tag" taget="_blank" href="/search/%E5%8F%AF%E9%9D%A0%E6%80%A7/1.htm">可靠性</a><a class="tag" taget="_blank" href="/search/%E8%BE%90%E7%85%A7/1.htm">辐照</a><a class="tag" taget="_blank" href="/search/%E6%A0%85%E6%9E%81%E6%BC%8F%E7%94%B5/1.htm">栅极漏电</a><a class="tag" taget="_blank" href="/search/%CE%B3%E5%B0%84%E7%BA%BF/1.htm">γ射线</a><a class="tag" taget="_blank" href="/search/%E8%BE%90%E7%85%A7%E6%8D%9F%E4%BC%A4/1.htm">辐照损伤</a>
                        <div>2024年2月22日,中国科学院新疆理化技术研究所的Li等人在《IEEEACCESS》期刊发表了题为《DegradationMechanismsofGateLeakageinGaN-BasedHEMTsatLowDoseRateIrradiation》的文章,基于实验分析和TCAD仿真,研究了低剂量率辐照下基于GaN的p型栅高电子迁移率晶体管(HEMTs)的栅漏电退化机制。实验采用60Coγ射线源</div>
                    </li>
                    <li><a href="/article/1943476387474108416.htm"
                           title="简说scp命令" target="_blank">简说scp命令</a>
                        <span class="text-muted">伊成</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B6%E5%AE%83/1.htm">其它</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>简单介绍scp的全称是:SecureCopyProtocol(安全复制协议),是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议,用于在本地服务器和远程服务器之间,或者两台远程服务器之间复制文件或目录。scp基本语法格式如下:scp[选项]源路径目标路径常用选项说明:-r:递归复制整个目录。-P:指定非默认的SSH端口号,默认为22。这里注意为大写的P。-C:启用压缩,提高传输效</div>
                    </li>
                    <li><a href="/article/1943467560024469504.htm"
                           title="新手向:Python网络编程,搭建简易HTTP服务器" target="_blank">新手向:Python网络编程,搭建简易HTTP服务器</a>
                        <span class="text-muted"></span>

                        <div>本文将从零开始,通过一个简单的PythonHTTP服务器示例,带你走进网络编程的世界。一、准备工作:理解基本概念1.1什么是网络编程?网络编程简单来说就是让不同计算机上的程序能够相互通信。就像人与人之间通过语言交流一样,计算机之间也有自己的"语言"——网络协议。1.2HTTP协议简介HTTP(HyperTextTransferProtocol)是万维网的基础协议,我们每天浏览网页时都在使用它。它采</div>
                    </li>
                    <li><a href="/article/1943221129145544704.htm"
                           title="Docker 镜像源不再难求!国内可用镜像源汇总!(解决docker无法拉取镜像拉取镜像缓慢等问题,国内可用镜像源汇总)" target="_blank">Docker 镜像源不再难求!国内可用镜像源汇总!(解决docker无法拉取镜像拉取镜像缓慢等问题,国内可用镜像源汇总)</a>
                        <span class="text-muted">xiaoqiangclub</span>
<a class="tag" taget="_blank" href="/search/%E9%9A%8F%E8%AE%B0%C2%B72025%E2%9C%8D%EF%B8%8F/1.htm">随记·2025✍️</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E9%95%9C%E5%83%8F%E6%BA%90/1.htm">镜像源</a>
                        <div>文章目录介绍演示环境国内Docker镜像源汇总可用Docker镜像源汇总(22个)⚓️相关链接⚓️介绍由于某些原因,现在国内Docker镜像源的访问速度常常让人抓狂。你是否曾在拉取镜像时遇到超长时间的等待,甚至是直接失败的情况?特别是对于开发者来说,拉取镜像这一基本操作本应是快速且稳定的,但国内访问Docker官方镜像仓库经常因为网络问题或者限制,导致镜像拉取困难,给日常工作带来不小的麻烦。幸运的</div>
                    </li>
                    <li><a href="/article/1943155065854423040.htm"
                           title="DIDCTF-22蓝帽杯初赛" target="_blank">DIDCTF-22蓝帽杯初赛</a>
                        <span class="text-muted">小丑001.</span>
<a class="tag" taget="_blank" href="/search/DIDCTF/1.htm">DIDCTF</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a>
                        <div>手机取证_1题目描述现对一个苹果手机进行取证,请您对以下问题进行分析解答。627604C2-C586-48C1-AA16-FF33C3022159.PNG图片的分辨率是?(答案参考格式:1920×1080)注意:中间为乘号×,不是字母xflag:360×360手机取证_2题目描述姜总的快递单号是多少?(答案参考格式:abcABC123)flag:SF1142358694796网站取证_1题目描述据</div>
                    </li>
                    <li><a href="/article/1943091412681682944.htm"
                           title="青少年编程与数学 02-022 专业应用软件简介 22 电子签名和合同管理平台:法大大" target="_blank">青少年编程与数学 02-022 专业应用软件简介 22 电子签名和合同管理平台:法大大</a>
                        <span class="text-muted">明月看潮生</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B8%8E%E6%95%B0%E5%AD%A6/1.htm">编程与数学</a><a class="tag" taget="_blank" href="/search/%E7%AC%AC02%E9%98%B6%E6%AE%B5/1.htm">第02阶段</a><a class="tag" taget="_blank" href="/search/%E9%9D%92%E5%B0%91%E5%B9%B4%E7%BC%96%E7%A8%8B/1.htm">青少年编程</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E8%BD%AF%E4%BB%B6/1.htm">应用软件</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B8%8E%E6%95%B0%E5%AD%A6/1.htm">编程与数学</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E7%AD%BE%E5%90%8D/1.htm">电子签名</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%90%8C%E7%AE%A1%E7%90%86/1.htm">合同管理</a>
                        <div>青少年编程与数学02-022专业应用软件简介22电子签名和合同管理平台:法大大引言一、法大大的背景与发展历程1.1公司概述1.2发展历程二、产品功能详解2.1核心功能介绍2.2特色功能展示三、应用场景案例分析3.1行业应用实例3.2成功案例分享四、技术安全保障措施4.1数据加密技术4.2风险控制体系4.3合规性审查五、市场地位与未来展望5.1市场份额与影响力5.2未来发展计划摘要:法大大是中国领先</div>
                    </li>
                    <li><a href="/article/1943080328386113536.htm"
                           title="408考研逐题详解:2010年第22题——显存带宽" target="_blank">408考研逐题详解:2010年第22题——显存带宽</a>
                        <span class="text-muted">CS创新实验室</span>
<a class="tag" taget="_blank" href="/search/%E8%80%83%E7%A0%94%E5%A4%8D%E4%B9%A0408/1.htm">考研复习408</a><a class="tag" taget="_blank" href="/search/%E8%80%83%E7%A0%94/1.htm">考研</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%80%83%E7%A0%94/1.htm">计算机考研</a><a class="tag" taget="_blank" href="/search/408/1.htm">408</a><a class="tag" taget="_blank" href="/search/%E7%9C%9F%E9%A2%98%E8%A7%A3%E6%9E%90/1.htm">真题解析</a>
                        <div>2010年第22题假定一台计算机的显示存储器用DRAM芯片实现,若要求显示分辨率为1600×1200,颜色深度为24位,帧频为85Hz,显存总带宽的50%用来刷新屏幕,则需要的显存总带宽至少约为()A.245Mbps\qquadB.979Mbps\qquadC.1958Mbps\qquadD.7834Mbps解析本题主要考查显存总带宽的计算方法,涉及计算机显示系统的基本参数,包括分辨率、颜色深度、</div>
                    </li>
                    <li><a href="/article/1943058004467314688.htm"
                           title="InVision:InVisionStudio全面指南_2024-07-22_04-13-13.Tex" target="_blank">InVision:InVisionStudio全面指南_2024-07-22_04-13-13.Tex</a>
                        <span class="text-muted">chenjj4003</span>
<a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/1.htm">游戏开发</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/figma/1.htm">figma</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E4%BA%92/1.htm">交互</a>
                        <div>InVision:InVisionStudio全面指南InVisionStudio简介InVisionStudio的功能与优势InVisionStudio是一款强大的设计工具,它不仅提供了丰富的设计功能,还集成了原型制作、协作和反馈收集的能力,使得从设计到产品开发的整个流程更加流畅和高效。以下是InVisionStudio的一些关键功能和优势:设计功能:InVisionStudio支持矢量编辑、图</div>
                    </li>
                    <li><a href="/article/1942863633277054976.htm"
                           title="APP测试手册" target="_blank">APP测试手册</a>
                        <span class="text-muted"></span>

                        <div>目录一、APP测试流程二、APP测试点1.功能测试2.UI测试3.软件权限4.数据安全性5.安装/卸载6.免登录7.运行8.APP更新9.数据更新10.离线浏览11.前后台切换12.用户体验测试13.图形测试14.交叉事件测试15.时间测试16.定位、照相机服务17.消息、通知测试18.异常测试19.兼容性测试20.适配性测试21.PUSH测试22.硬件环境测试23.网络环境24.性能测试25.安</div>
                    </li>
                    <li><a href="/article/1942781942852284416.htm"
                           title="22、鸿蒙学习——ArkTS中什么是对象字面量" target="_blank">22、鸿蒙学习——ArkTS中什么是对象字面量</a>
                        <span class="text-muted">青春路上的小蜜蜂</span>
<a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a>
                        <div>在ArkTS中,对象字面量(ObjectLiteral)是一种通过简洁的语法直接创建类实例并初始化属性的方式,无需使用new关键字。1、基本概念与语法对象字面量通过花括号{}包裹属性名和值的键值对来创建对象,适用于需要快速初始化类实例的场景。例如:classPerson{name:string='';age:number=0;}//使用对象字面量创建实例letperson:Person={name</div>
                    </li>
                    <li><a href="/article/1942773873414041600.htm"
                           title="SIGMOD论文解读|在自下而上优化中添加布隆过滤器" target="_blank">SIGMOD论文解读|在自下而上优化中添加布隆过滤器</a>
                        <span class="text-muted">Gauss松鼠会</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E4%BA%A4%E6%B5%81/1.htm">技术交流</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/gaussdb/1.htm">gaussdb</a><a class="tag" taget="_blank" href="/search/database/1.htm">database</a>
                        <div>6月22日至27日,2025ACMSIGMOD/PODS国际学术会议在德国柏林举行。25日,华为多伦多分布式调度和数据引擎实验室主任工程师TimothyZeyl受邀出席,就入选的《IncludingBloomFiltersinBottom-upOptimization》论文进行了解读该论文创新性地首次提出了在自下而上的优化器的基于成本的优化过程中添加布隆过滤器(BloomFilter)的技术。该技</div>
                    </li>
                    <li><a href="/article/1942706037631021056.htm"
                           title="leetcode 202. 快乐数" target="_blank">leetcode 202. 快乐数</a>
                        <span class="text-muted">∮∞</span>
<a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E5%88%B7%E9%A2%98/1.htm">刷题</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</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>编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为1,那么这个数就是快乐数。如果n是快乐数就返回true;不是,则返回false。示例1:输入:n=19输出:true解释:12+92=8282+22=6862+82=10012+02+02=1示例</div>
                    </li>
                    <li><a href="/article/1942703264197832704.htm"
                           title="剑指 Offer 04. 二维数组中的查找" target="_blank">剑指 Offer 04. 二维数组中的查找</a>
                        <span class="text-muted">菜菜今天学习了吗</span>
<a class="tag" taget="_blank" href="/search/leetcode%E5%88%B7%E9%A2%98/1.htm">leetcode刷题</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                        <div>在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵matrix如下:[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]]给定target=5,返回true</div>
                    </li>
                    <li><a href="/article/1942538399269318656.htm"
                           title="【51单片机独立按键控制led位移】2022-7-22" target="_blank">【51单片机独立按键控制led位移】2022-7-22</a>
                        <span class="text-muted">智者知已应修善业</span>
<a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/51%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">51单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a>
                        <div>缘由51单片机独立按键控制led位移-24小时必答区按下按键1,使左边第一个LED亮起。按下一次按键2,第一个LED向右移动一个位置,再按下按键1,左边第一个LED再次亮起,再次按下一次按键2,使亮着的两个灯能够一起向右移动一个位置#include"reg52.h"sbitk1=P1^0;sbitk2=P1^1;sbitk3=P1^2;sbitk4=P1^3;voidmain(){unsigned</div>
                    </li>
                    <li><a href="/article/1942424069156696064.htm"
                           title="AI办公Agent之Skywork Super Agents" target="_blank">AI办公Agent之Skywork Super Agents</a>
                        <span class="text-muted">NeilNiu</span>
<a class="tag" taget="_blank" href="/search/AI%2B%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">AI+开源项目</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>5月22日,昆仑万维科技股份有限公司(以下简称“昆仑万维”)面向全球市场同步发布天工超级智能体(SkyworkSuperAgents)。官网地址:https://www.tiangong.cn/这个工具主要采用了AIagent架构和DeepResearch技术,一站式生成文档、PPT、表格(excel)、网页、播客和音视频多模态内容。它具有强大的DeepResearch能力,在GAIA榜单排名全球</div>
                    </li>
                    <li><a href="/article/1942384590396125184.htm"
                           title="PyTorch深度学习快速入门教程【小土堆】详细学习笔记(第1-11个视频笔记)" target="_blank">PyTorch深度学习快速入门教程【小土堆】详细学习笔记(第1-11个视频笔记)</a>
                        <span class="text-muted">胡说八道的Dr. Zhu</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>本学习笔记源自于B站up主【我是土堆】的视频教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】本博客是该视频教程中第1-11个视频的详细学习笔记,第12-22个视频、第23-33个视频的详细学习笔记链接如下:PyTorch深度学习快速入门教程【小土堆】详细学习笔记(第12-22个视频笔记)PyTorch深度学习快速入门教程【小土堆】详细学习笔记(第23-33个视频笔记)目录1、P</div>
                    </li>
                    <li><a href="/article/1942237053425086464.htm"
                           title="基于springboot的社区生鲜团购系统" target="_blank">基于springboot的社区生鲜团购系统</a>
                        <span class="text-muted">优创学社2</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录摘要IAbstractII1绪论11.1研究背景11.2课题意义22开发技术论述22.1Springboot框架32.2Vue框架32.3Tomcat服务器42.4MySQL数据库53需求分析63.1系统的可行性分析73.2功能需求分析73.3项目设计目标83.3.1关于系统的基本要求83.3.2开发目标94系统设计104.1系统功能模块设计114.2系统功能流程设计124.3数据库设计134</div>
                    </li>
                    <li><a href="/article/1942031805133680640.htm"
                           title="Vue3+Vite+TypeScript+Element Plus开发-22.客制Table组件" target="_blank">Vue3+Vite+TypeScript+Element Plus开发-22.客制Table组件</a>
                        <span class="text-muted">秋之猫</span>
<a class="tag" taget="_blank" href="/search/Plus%E5%BC%80%E5%8F%91/1.htm">Plus开发</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E6%8C%89%E9%92%AE%E7%BB%84%E4%BB%B6/1.htm">按钮组件</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E7%BB%84%E4%BB%B6/1.htm">表组件</a><a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vite/1.htm">vite</a><a class="tag" taget="_blank" href="/search/element/1.htm">element</a><a class="tag" taget="_blank" href="/search/plus/1.htm">plus</a>
                        <div>系列文档目录Vue3+Vite+TypeScript安装ElementPlus安装与配置主页设计与router配置静态菜单设计Pinia引入Header响应式菜单缩展Mockjs引用与Axios封装登录设计登录成功跳转主页多用户动态加载菜单Pinia持久化动态路由-动态增加路由动态路由-动态删除路由路由守卫-无路由跳转404路由守卫-未登录跳转登录界面登录退出Tags-组件构建Tags-与菜单联动</div>
                    </li>
                    <li><a href="/article/1941941051786850304.htm"
                           title="oracle快照点,oracle 快照(snapshot) 管理" target="_blank">oracle快照点,oracle 快照(snapshot) 管理</a>
                        <span class="text-muted">皮皮波</span>
<a class="tag" taget="_blank" href="/search/oracle%E5%BF%AB%E7%85%A7%E7%82%B9/1.htm">oracle快照点</a>
                        <div>----手工创建oracle快照BEGINDBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();END;/---删除快照具体快照信息可以查看视图DBA_HIST_SNAPSHOTBEGINDBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id=>22,high_snap_id=>32,dbid=>3310</div>
                    </li>
                    <li><a href="/article/1941699649534488576.htm"
                           title="在 .docx 中键入正确的数学符号" target="_blank">在 .docx 中键入正确的数学符号</a>
                        <span class="text-muted"></span>

                        <div>文章目录\not\perp...做项目需要使用.docx写复杂的数学公式。虽然Word和WPS都已经支持LaTex代码,但是支持的很差劲(╬ ̄皿 ̄),许多符号无法生成。\not\perp为了输入⊥̸\not\perp⊥符号,需要依次执行:插入-符号字体:CambriaMath插入Unicode+22A5(⊥\perp⊥符号)插入Unicode+0338(⋅̸\not\sdot⋅组合符号)…</div>
                    </li>
                    <li><a href="/article/1941661708095385600.htm"
                           title="YOLOv11深度解析:Ultralytics新一代目标检测架构创新与实战指南" target="_blank">YOLOv11深度解析:Ultralytics新一代目标检测架构创新与实战指南</a>
                        <span class="text-muted">芯作者</span>
<a class="tag" taget="_blank" href="/search/D2%3A/1.htm">D2:</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/1.htm">神经网络</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a>
                        <div>2024年Ultralytics重磅推出YOLOv11**:在精度与速度的平衡木上再进一步,参数减少22%,推理速度提升2%,多任务支持全面升级!一、YOLOv11核心创新:轻量化与注意力机制的完美融合YOLOv11并非颠覆性重构,而是通过模块级优化实现“少参数、高精度、快推理”的目标。其三大创新点如下:1.1C3k2模块:动态卷积核的灵活设计取代YOLOv8的C2f模块,C3k2通过参数c3k动</div>
                    </li>
                    <li><a href="/article/1941530365462114304.htm"
                           title="【数据结构】考点十九:时间复杂度与空间复杂度" target="_blank">【数据结构】考点十九:时间复杂度与空间复杂度</a>
                        <span class="text-muted">超越超</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%80%83%E8%AF%95%E3%80%90%E4%B8%B4%E6%97%B6%E6%8A%B1%E4%BD%9B%E8%84%9A%E3%80%91/1.htm">数据结构考试【临时抱佛脚】</a><a class="tag" taget="_blank" href="/search/%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/1.htm">结构算法</a><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/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/1.htm">排序算法</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/1.htm">时间复杂度</a><a class="tag" taget="_blank" href="/search/%E7%A9%BA%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/1.htm">空间复杂度</a>
                        <div>【考试临时抱佛脚】系列文章针对于、、的考生打造。无论你是、还是这个专栏都适合你,Let’sgo!一、方法1)时间复杂性大小顺序:O(1)<O(log₂n)<O(n)<O(nlog₂n)<O(n²)<O(n³)有效:对数、幂、乘积无效:指数大于等于22)分类及简称总结:①快希归堆:快(快速排序)、希(希尔排序)、归(归并排序)、堆(堆排序)②快希选堆:快(快速排序)、希(希尔排序)、选(选择排序)、</div>
                    </li>
                    <li><a href="/article/1941432276214673408.htm"
                           title="【零基础学AI】第22讲:PyTorch入门 - 动态图计算与图像分类器实战" target="_blank">【零基础学AI】第22讲:PyTorch入门 - 动态图计算与图像分类器实战</a>
                        <span class="text-muted">1989</span>
<a class="tag" taget="_blank" href="/search/0%E5%9F%BA%E7%A1%80%E5%AD%A6AI/1.htm">0基础学AI</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/sklearn/1.htm">sklearn</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a>
                        <div>本节课你将学到理解PyTorch的核心概念和优势掌握张量(Tensor)的基本操作学会使用动态计算图构建神经网络实现一个完整的图像分类器项目训练模型并进行预测开始之前环境要求Python3.8+建议使用GPU(可选,CPU也能运行)内存:至少4GB需要安装的包#CPU版本(推荐新手)pipinstalltorchtorchvisionmatplotlibpillow#GPU版本(如果有NVIDIA</div>
                    </li>
                    <li><a href="/article/1941316146955350016.htm"
                           title="Linux基本操作——端口占用查看和进程查询" target="_blank">Linux基本操作——端口占用查看和进程查询</a>
                        <span class="text-muted">TY-2025</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>7.端口占用查看和进程查询(1)端口a.基本概念概念:端口是设备与外界通讯交流的出入口,可以分为物理端口和虚拟端口物理端口:又称接口,是可见的硬件端口,如USB接口、RJ45网口、HDMI端口等虚拟端口:计算机内部不可见的逻辑端口,用于操作系统与外部交互,如SSH服务的22端口功能类比:IP地址相当于小区地址,端口相当于门牌号,通过端口可以锁定计算机上的具体程序通信原理:计算机A通过IP地址找到计</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>