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/1904053897371119616.htm"
                           title="2025年第二届机器学习与神经网络国际学术会议(MLNN 2025)" target="_blank">2025年第二届机器学习与神经网络国际学术会议(MLNN 2025)</a>
                        <span class="text-muted">分享学术科研与论文的禁小默</span>
<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/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/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>
                        <div>重要信息官网:www.icmlnn.org时间:2025年4月22-24日地点:中国-重庆简介2025年第二届机器学习与神经网络国际学术会议(MLNN2025)围绕学习系统与神经网络的核心理论、关键技术和应用展开讨论,涵盖深度学习、计算机视觉、自然语言处理、强化学习等多个子领域,通过特邀报告、主题演讲、海报展示等形式,展示相关领域的最新研究成果和技术创新。征稿主题神经网络机器学习深度学习算法及应用</div>
                    </li>
                    <li><a href="/article/1903916529389465600.htm"
                           title="【技巧分享】开发环境配置Python、R、Stata" target="_blank">【技巧分享】开发环境配置Python、R、Stata</a>
                        <span class="text-muted">A线上仓库</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>自用,看心情更新~版本更新2024-03-131.0版本2024-09-25FIX:1.conda命令ADD:1.python调用r命令2.r系统配置2025-01-22更新VSCode调用Statado文件目录版本更新Python环境配置Cheatsheet基础配置可选:环境配置:conda命令包管理R环境配置基础配置R命令Python调用Method1:`rpy2`Stata环境配置基础配置P</div>
                    </li>
                    <li><a href="/article/1903854968197148672.htm"
                           title="人民日报报道,华为云赋能智能制造助力图扑软件构造数字孪生场景" target="_blank">人民日报报道,华为云赋能智能制造助力图扑软件构造数字孪生场景</a>
                        <span class="text-muted">智慧园区</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/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/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a>
                        <div>2021年12月22日,《人民日报》头版头条刊登了《华为云赋能智能制造,助力图扑软件构造数字孪生场景》一文,聚焦数据可视化建设发展。报道指出,数字经济发展的背后,是大数据时趋势下各地区积极贯彻国家数字经济发展战略的时代精神;高效便捷管控的背后,是云端平台各大企业的互助共赢;高质精准2D、3D数据可视图的背后,是专注于数据可视化Web组态开发的厦门图扑软件科技有限公司。并对厦门图扑软件科技有限公司进</div>
                    </li>
                    <li><a href="/article/1903842733584347136.htm"
                           title="Python UV - 安装、升级、卸载" target="_blank">Python UV - 安装、升级、卸载</a>
                        <span class="text-muted">云客Coder</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/uv/1.htm">uv</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录安装检查升级设置自动补全卸载UV命令官方文档详见:https://docs.astral.sh/uv/getting-started/installation/安装pipinstalluv检查安装后可运行下面命令,查看是否安装成功uv--version%uv--versionuv0.6.3(a0b9f22a22025-02-24)升级uvselfupdate将重新运行安装程序并可能修改您的</div>
                    </li>
                    <li><a href="/article/1903809185712238592.htm"
                           title="Java24的新特性" target="_blank">Java24的新特性</a>
                        <span class="text-muted">hello_ejb3</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</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/java/1.htm">java</a>
                        <div>Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java18的新特性Java19的新特性Java20的新特性Java21的新特性Java22的新特性Java23的新特性Java2</div>
                    </li>
                    <li><a href="/article/1903774251270336512.htm"
                           title="docker gitlab 无法访问及502错误" target="_blank">docker gitlab 无法访问及502错误</a>
                        <span class="text-muted">破解中小学~软硬件Ai(植入数学与物理)</span>
<a class="tag" taget="_blank" href="/search/java%E6%8A%80%E6%9C%AF/1.htm">java技术</a>
                        <div>1、dockergitlab创建dockerrun-d--namegitlab\--restartalways\-p8443:443\-p83:80\-p8822:22\-v/gitlab/config:/etc/gitlab\-v/gitlab/logs:/var/log/gitlab\-vgitlab/data:/var/opt/gitlab\gitlab/gitlab-ce:13.3.7-c</div>
                    </li>
                    <li><a href="/article/1903724807816540160.htm"
                           title="【第22节】windows网络编程模型(WSAAsyncSelect模型)" target="_blank">【第22节】windows网络编程模型(WSAAsyncSelect模型)</a>
                        <span class="text-muted">攻城狮7号</span>
<a class="tag" taget="_blank" href="/search/Windows%E7%BC%96%E7%A8%8B%28C%2B%2B%29/1.htm">Windows编程(C++)</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/1.htm">网络编程</a><a class="tag" taget="_blank" href="/search/windows%E7%BC%96%E7%A8%8B/1.htm">windows编程</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/sdk/1.htm">sdk</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>目录引言一、WSAAsyncSelect模型概述二、WSAAsyncSelect模型流程2.1自定义消息2.2创建窗口例程2.3初始化套接字2.4注册网络事件2.5绑定和监听2.6消息循环三、完整示例代码引言在网络编程的广袤天地中,高效处理网络事件是构建稳定应用的关键。WSAAsyncSelect模型作为一种独特且实用的网络编程模型,为开发者提供了异步处理网络事件的有力手段。它巧妙地将Window</div>
                    </li>
                    <li><a href="/article/1903711045067796480.htm"
                           title="python 捕获异常" target="_blank">python 捕获异常</a>
                        <span class="text-muted">weixin_30730151</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>异常:由于代码的逻辑或者语法错误导致的程序中断。在学习Python的过程当中,大家一定要区分清楚异常和布尔值False布尔值的False只是一个值,通常代表的是一个条件的不成立,常用于逻辑判断比如:1num=22print(num>3)3ifnum>3:4print("num>3")异常指的是由于代码的逻辑或者语法错误导致的程序中断比如:1num=222+"2"了解了上面的逻辑之后,我们来看看大家</div>
                    </li>
                    <li><a href="/article/1903616618194333696.htm"
                           title="dfs(二十五)22. 括号生成" target="_blank">dfs(二十五)22. 括号生成</a>
                        <span class="text-muted">曾几何时`</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/DFS/1.htm">DFS</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1res;vectorgenerateParenthesis(int_n){n=_n;dfs();returnres;}voiddfs()</div>
                    </li>
                    <li><a href="/article/1903584193309372416.htm"
                           title="Linux系统安全加固基础" target="_blank">Linux系统安全加固基础</a>
                        <span class="text-muted">linux言叙</span>
<a class="tag" taget="_blank" href="/search/Linux%E5%AE%89%E5%85%A8/1.htm">Linux安全</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA/1.htm">系统加固</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>注:建议在修改相关配置文件时,首先对需要修改文件进行备份。1、ssh远程连接vi/etc/sshd/sshd_configPort65531#修改ssh端口,默认22ListenAddress192.168.1.X#允许ssh登录的IP地址PermitRootLoginno#禁止root通过ssh连接)AllowUserstest@192.168.1.*#允许用户test从IP为192.168.1</div>
                    </li>
                    <li><a href="/article/1903517311269138432.htm"
                           title="c++算法赛万能模板个人笔记适用蓝桥杯,天梯赛,acm等赛事" target="_blank">c++算法赛万能模板个人笔记适用蓝桥杯,天梯赛,acm等赛事</a>
                        <span class="text-muted">a东方青</span>
<a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E7%AC%94%E8%AE%B0/1.htm">个人笔记</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</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>算法笔记-更新与2025-3-22点赞收藏+关注持续更新算法基础二分整数二分//在一个单调区间里面去找答案boolcheck(intx){/*...*/}//检查x是否满足某种性质//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:intbsearch_1(intl,intr){while(l>1;if(check(mid))r=mid;//check()判断mid是否满足性质el</div>
                    </li>
                    <li><a href="/article/1903450881853026304.htm"
                           title="遗传算法均匀变异" target="_blank">遗传算法均匀变异</a>
                        <span class="text-muted">huahua20190514</span>

                        <div>importnumpyasnpimportrandompop_1=np.array([[1,11,21,9,16,10,8,17],[2,12,22,10,17,11,9,18],[3,13,23,11,18,12,10</div>
                    </li>
                    <li><a href="/article/1903438407942598656.htm"
                           title="LLM的工具调用能力(如Function Calling)" target="_blank">LLM的工具调用能力(如Function Calling)</a>
                        <span class="text-muted">maxmaxma</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>LLM的工具调用能力(如FunctionCalling)是增强大模型实用性的核心技术,使其能够通过生成结构化指令与外部系统交互。以下是关键要点及技术解析:一、工具调用的定义与原理核心机制LLM通过生成符合工具接口的指令(如JSON参数),触发外部工具执行。例如,用户提问天气时,模型生成{"location":"北京","date":"2025-03-22"},系统调用天气API获取数据。分工明确:</div>
                    </li>
                    <li><a href="/article/1903370691210702848.htm"
                           title="常见的应用对应的传输层协议和端口号" target="_blank">常见的应用对应的传输层协议和端口号</a>
                        <span class="text-muted">数据链路摸索者</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E8%B7%AF%E5%AE%89%E5%85%A8/1.htm">网路安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>常见的应用对应的传输层协议和端口号如下:服务端口号协议http80TCPhttps443TCPFTP21(控制)TCP20(数据)TCPTFTP69UDPTelent23TCPSSH22TCPSMTP25TCPPOP3110TCPSNMP161UDPNTP123UDPDNS53TCP+UDPDHCP67和68UDPOracle数据库1521TCP终端服务3389TCP</div>
                    </li>
                    <li><a href="/article/1903202150125727744.htm"
                           title="layui中tab的切换" target="_blank">layui中tab的切换</a>
                        <span class="text-muted">catino</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/layui/1.htm">layui</a>
                        <div>layui中tab的切换,可使用element.tabChange(filter,layid);用于外部切换到指定的Tab项上,如:element.tabChange('demo','layid');//切换到lay-id="yyy"的这一项下例所示element.tabChange('demo','22');//切换到:用户管理网站设置用户管理权限分配商品管理订单管理点击该Tab的任一标题,观察</div>
                    </li>
                    <li><a href="/article/1903030101952491520.htm"
                           title="指令系统(2017统考真题)" target="_blank">指令系统(2017统考真题)</a>
                        <span class="text-muted">海大超级无敌暴龙战士</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/1.htm">计算机组成原理</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/1.htm">学习方法</a>
                        <div>指令系统(2017统考真题)原始C语言函数为intf1(unsignedn){intsum=1,power=1;for(unsignedi=0;i<n-1;i++){power*=2;sum+=power;}returnsum;}该函数计算的是一个几何级数的和,其数学表达式为f(n)=1+2+22+⋯+2n−1=2n−1.f(n)=1+2+2^2+\cdots+2^{n-1}=2^n-1.f(n)</div>
                    </li>
                    <li><a href="/article/1903001716853370880.htm"
                           title="Springboot整合Swagger+mybatis-plus" target="_blank">Springboot整合Swagger+mybatis-plus</a>
                        <span class="text-muted">cccy001</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/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录1.springboot整合swagger接口文档1.1什么是swagger21.2为什么需要使用swagger2的api文档1.3如何使用swagger22.springboot整合mybatis-plus2.1mp的简介2.2如何使用1.springboot整合swagger接口文档1.1什么是swagger2它就是可以api接口,它可以对你书写的接口进行说明。并以文档的形式存在。、1.2</div>
                    </li>
                    <li><a href="/article/1902976879523065856.htm"
                           title="【北京迅为】iTOP-RK3568开发板OpenHarmony系统南向驱动开发UART接口运作机制" target="_blank">【北京迅为】iTOP-RK3568开发板OpenHarmony系统南向驱动开发UART接口运作机制</a>
                        <span class="text-muted">迅为电子</span>
<a class="tag" taget="_blank" href="/search/RK3568%E5%BC%80%E5%8F%91%E6%9D%BF/1.htm">RK3568开发板</a><a class="tag" taget="_blank" href="/search/RK3568%E5%BC%80%E5%8F%91%E6%9D%BF/1.htm">RK3568开发板</a><a class="tag" taget="_blank" href="/search/OpenHarmony/1.htm">OpenHarmony</a>
                        <div>瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向物联网网关、NVR存储、工控平板、工业检测、工控盒、卡拉OK</div>
                    </li>
                    <li><a href="/article/1902948746782633984.htm"
                           title="LeetCode热题100JS(59/100)第十一天|46|78|17|39|22" target="_blank">LeetCode热题100JS(59/100)第十一天|46|78|17|39|22</a>
                        <span class="text-muted">Alicesflower</span>
<a class="tag" taget="_blank" href="/search/LeetCode%E7%83%AD%E9%A2%98100JS/1.htm">LeetCode热题100JS</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>46.全排列题目链接:46.全排列难度:中等刷题状态:2刷新知识:解题过程思考示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]题解分析参考题解链接:全排列放下1刷过程/***@param{number[]}nums*@return{number[][]}*///varpermute=function(num</div>
                    </li>
                    <li><a href="/article/1902916315539107840.htm"
                           title="基于AT89C52单片机的智能导盲杖报警设计" target="_blank">基于AT89C52单片机的智能导盲杖报警设计</a>
                        <span class="text-muted">七月小卖铺</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</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>点击链接获取Keil源码与ProjectBackups仿真图:https://download.csdn.net/download/qq_64505944/90498287?spm=1001.2014.3001.5503C+22部分参考设计如下:摘要超声波测距技术因其具有较强的指向性、低能耗、较长的传播距离等优点,已成为广泛应用于各类传感器技术和自动控制技术相结合的测距方案之一。超声波传感器利用声</div>
                    </li>
                    <li><a href="/article/1902821230138945536.htm"
                           title="QMap 多重嵌套" target="_blank">QMap 多重嵌套</a>
                        <span class="text-muted">金色暖阳</span>
<a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/QMap/1.htm">QMap</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                        <div>QMap多重嵌套,通过迭代器修改内层的mapQMapmap_id;map_id.insert(1,22);map_id.insert(2,44);map_id.insert(5,55);if(map_id.contains(2)){qDebug()>map_test;map_test.insert(1,map_id);qDebug()>::iteratorit=map_test.begin();f</div>
                    </li>
                    <li><a href="/article/1902769274309636096.htm"
                           title="go clickhouse query" target="_blank">go clickhouse query</a>
                        <span class="text-muted">leijmdas</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/clickhouse/1.htm">clickhouse</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在Go中使用clickhouse-go查询ClickHouse数据库非常简单。以下是一个完整的示例,展示如何连接ClickHouse并执行查询操作。1.安装依赖首先,安装clickhouse-go:bash复制goget-ugithub.com/ClickHouse/clickhouse-go/v22.示例代码以下是一个完整的示例,展示如何连接ClickHouse并执行查询操作。go复制packa</div>
                    </li>
                    <li><a href="/article/1902627267939463168.htm"
                           title="table点击行事件,且点击行高亮" target="_blank">table点击行事件,且点击行高亮</a>
                        <span class="text-muted">爱吃玉米的兔子</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a>
                        <div>consttableData=[{id:1,date:"2025-03-20",name:"Tom",},{id:2,date:"2025-03-21",name:"Hom",},{id:3,date:"2025-03-22",name:"Rem",},];constselectedRow=ref(null);//储存选中的行//点击行操作事件constrowChange=(row)=>{sele</div>
                    </li>
                    <li><a href="/article/1902534361144684544.htm"
                           title="Java24的新特性" target="_blank">Java24的新特性</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/jdk24java24/1.htm">jdk24java24</a>
                        <div>Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java18的新特性Java19的新特性Java20的新特性Java21的新特性Java22的新特性Java23的新特性Java2</div>
                    </li>
                    <li><a href="/article/1902509463449956352.htm"
                           title="高通成都linux engineer intern 一面面经" target="_blank">高通成都linux engineer intern 一面面经</a>
                        <span class="text-muted">han_xue_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>题解|#KNN算法#在*******里有个叫《题解--2024华南理工校赛.pdf》的文件高通成都linuxengineerintern一面面经两个面试官共25min就结束了,面试氛围还可以,问的很快。1.自我介绍2.问对高通了解多少3.对牛客鼠人传(第四十四集,2024/4/22)刷题:尝试补昨天D,题解看了半天似懂非懂,遂放弃改天再补。做题老是把复杂的问题想简单,简单的问题想复京东物流管理培训</div>
                    </li>
                    <li><a href="/article/1902440240413470720.htm"
                           title="求解一次最佳平方逼近多项式" target="_blank">求解一次最佳平方逼近多项式</a>
                        <span class="text-muted">F_D_Z</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%90%86/1.htm">数理</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90/1.htm">数值分析</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E6%AC%A1%E6%9C%80%E4%BD%B3%E5%B9%B3%E6%96%B9%E9%80%BC%E8%BF%91%E5%A4%9A%E9%A1%B9%E5%BC%8F/1.htm">一次最佳平方逼近多项式</a>
                        <div>例设f(x)=1+x2f(x)=\sqrt{1+x^2}f(x)=1+x2,求[0,1][0,1][0,1]上的一个一次最佳平方逼近多项式。解:d0=∫011+x2dx=12ln⁡(1+2)+22≈1.147d_0=\int_{0}^{1}\sqrt{1+x^2}dx=\frac{1}{2}\ln(1+\sqrt{2})+\frac{\sqrt{2}}{2}\approx1.147d0=∫011+</div>
                    </li>
                    <li><a href="/article/1902432791614779392.htm"
                           title="教书育人杂志教书育人杂志社教书育人编辑部2024年第34期目录" target="_blank">教书育人杂志教书育人杂志社教书育人编辑部2024年第34期目录</a>
                        <span class="text-muted">QQ296078736</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>卷首教育没有捷径韩庆文;1教育观察法制化视角下的幼儿园爱国主义教育邓敏;曾彬;4-7教育转型视域下优化师生关系的三个着力点严挺;8-10家庭环境对幼儿性格形成的影响钟兴琴;11-13探索创新中华优秀传统文化融入中职思政教育的创新路径高书文;李金怡;吴金星;14-16新媒体时代高中音乐教育特色发展路径朱静;17-19基于绘本阅读的幼儿阅读习惯培养丁艳娥;20-22本期话题_地域文化与学科教学的融合区</div>
                    </li>
                    <li><a href="/article/1902430144019099648.htm"
                           title="【图论】并查集的学习和使用" target="_blank">【图论】并查集的学习和使用</a>
                        <span class="text-muted">猪猪成</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/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/%E5%9B%BE%E8%AE%BA/1.htm">图论</a>
                        <div>目录并查集是什么?举个例子组成父亲数组:find函数:union函数:代码实现:fa[]初始化code:findcode:递归实现:非递归实现:unioncode:画图模拟:路径压缩:路径压缩Code:并查集是什么?是一种树形的数据结构,一般用来处理集合的合并,查询操作。举个例子告诉你1的父节点是22的父节点是34的父节点是56没有父节点那么可以画出三个集合,或者说是树。然后我们一般用并查集判断:</div>
                    </li>
                    <li><a href="/article/1902354205113380864.htm"
                           title="小白学java日记day22--单例实例" target="_blank">小白学java日记day22--单例实例</a>
                        <span class="text-muted">兰翎翡竹</span>

                        <div>定义一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用.分析:1.我们肯定要建立一个单例类来描述2.只允许有一个对象3.全局的访问点:说的就是当前的s----通过static实现的4.提供出去5.给大家使用总括:1.传值.作为全局的访问点.解决一个全局使用的类,频繁创建和销毁。拥有对象的唯一性,并保证内存中对象的唯一。可以节省内存,因为单例共用一个实例,有利于Java的垃圾回收机制。</div>
                    </li>
                    <li><a href="/article/1902272620171161600.htm"
                           title="选择排序算法解析与代码实例展示" target="_blank">选择排序算法解析与代码实例展示</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/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/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/java/1.htm">java</a>
                        <div>选择排序是一种简单、直观的排序算法,适合用来处理小规模的数据。它的基本思想是每次从待排序的元素中选择最小的元素,然后将其放到已排序序列的末尾。听起来挺简单吧?接下来,让我们详细了解一下选择排序的工作原理、代码实现和一些性能特点。选择排序的步骤可以分为几个关键部分:初始状态:假设我们有一个数组,里面存放了一系列的数字。比如说,数组是[64,25,12,22,11]。在排序之前,这些数字是无序的。选择</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>