Python 网络编程说明第1/2页

发表于 5年以前  | 总阅读数:1008 次

一、网络知识的一些介绍

socket 是网络连接端点。例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听。两端使用各自的socket来发送和 接收信息。

在使用的时候,每个socket都被绑定到一个特定的IP地址和端口。IP地址是一个由4个数组成的序列,这4个数均是范围 0~255中的值(例如,220,176,36,76);端口数值的取值范围是0~65535。端口数小于1024的都是为众所周知的网络服务所保留的 (例如Web服务使用的80端口);最大的保留数被存储在socket模块的IPPORT_RESERVED变量中。你也可以为你的程序使用另外的端口数 值。

不是所有的IP地址都对世界的其它地方可见。实际上,一些是专门为那些非公共的地址所保留的(比如形如192.168.y.z或10.x.y.z)。地址127.0.0.1是本机地址;它始终指向当前的计算机。程序可以使用这个地址来连接运行在同一计算机上的其它程序。

IP地址不好记,你可以花点钱为特定的IP地址注册一个主机名或域名(比如使用www.jb51.net代替222.76.216.16)。域名服务器(DNS)处理名字到IP地址的映射。每个计算机都可以有一个主机名,即使它没有在官方注册。

多少信息通过一个网络被传送基于许多因素,其中之一就是使用的协议。许多的协议是基于简单的、低级协议以形成一个协议栈。例如HTTP协议,它是用在Web浏览器与Web服务器之间通信的协议,它是基于TCP协议,而TCP协议又基于IP协议。

当 在你自己的两个程序间传送信息的时候,你通常选择TCP或UDP协议。TCP协议在两端间建立一个持续的连接,并且你所发送的信息有保证的按顺序到达它们 的目的地。UDP不建立连接,它的速度快但不可靠。你发送的信息也可能到不了另一端;或它们没有按顺序到达。有时候一个信息的多个复制到达接收端,即使你 只发送了一次。

二、使用地址和主机名

socket模块提供了几个函数用于使用主机名和地址来工作。

gethostname()返回运行程序所在的计算机的主机名:

import socket
socket.gethostname()
'lenovo'

gethostbyname(name) 尝试将给定的主机名解释为一个IP地址。首先将检查当前计算机是否能够解释。如果不能,一个解释请求将发送给一个远程的DNS服务器(远程的DNS服务器 还可能将解释请求转发给另一个DNS服务器,直到该请求可以被处理)。gethostbyname函数返回这个IP地址或在查找失败后引发一个异常。

socket.gethostbyname('lenovo')
'192.168.1.4'
socket.gethostbyname('www.jb51.net')
'222.76.216.16'

一个扩展的形式是gethostbyname_ex(name),它返回一个包含三个元素的元组,分别是给定地址的主要的主机名、同一IP地址的可选的主机名的一个列表、关于同一主机的同一接口的其它IP地址的一个列表(列表可能都是空的)。

socket.gethostbyname('www.163.com')
'60.191.81.49'
socket.gethostbyname_ex('www.163.com')
('www.cache.split.netease.com', ['www.163.com'], ['60.191.81.48', '60.191.81.49
, '60.191.81.50', '60.191.81.51', '60.191.81.52', '60.191.81.53', '60.191.81.54
, '220.181.28.50', '220.181.28.51', '220.181.28.52', '220.181.28.53', '220.181.
8.54', '220.181.31.182', '220.181.31.183', '220.181.31.184'])

gethostbyaddr(address)函数的作用与gethostbyname_ex相同,只是你提供给它的参数是一个IP地址字符串:

socket.gethostbyaddr('202.165.102.205')
('homepage.vip.cnb.yahoo.com', ['www.yahoo.com.cn'], ['202.165.102.205'])

getservbyname(service,protocol)函数要求一个服务名(如'telnet'或'ftp')和一个协议(如'tcp'或'udp'),返回服务所使用的端口号:

socket.getservbyname('http','tcp')
80
socket.getservbyname('telnet','tcp)
23

通常,非Python程序以32位字节包的形式存储和使用IP地址。inet_aton(ip_addr)和inet_ntoa(packed)函数在这个形式和IP地址间作转换:

socket.inet_aton('222.76.216.16')
'\xdeL\xd8\x10'
socket.inet_ntoa('\xdeL\xd8\x10')
'222.76.216.16'

socket 也定义了一些变量来代表保留的IP地址。INADDR_ANY和INADDR_BROADCAST是被保留的IP地址分别代表任意IP地址和广播地 址;INADDR_LOOPBACK代表loopback设备,总是地址127.0.0.1。这些变量是32位字节数字形式的。

getfqdn([name])函数返回关于给定主机名的全域名(如果省略,则返回本机的全域名)。

三、使用低级的socket通信

尽管Python提供了一些封装,使得使用socket更容易,但是你也可以直接使用socket来工作。

1、创建和销毁socket

socket 模块中的socket(family,type[,proto])函数创建一个新的socket对象。family的取值通常是AF_INET。type 的取值通常是SOCK_STREAM(用于定向的连接,可靠的TCP连接)或SOCK_DGRAM(用于UDP):

from socket import *
s=socket(AF_INET,SOCK_STREAM)

family和type参数暗指了一个协议,但是你可以使用socket的第三个可选的参数(proto的取值如IPPROTO_TCP或IPPROTO_RAW)来指定所使用的协议。代替使用IPPROTO_XX变量,你可以使用函数getprotobyname:

getprotobyname('tcp')
6
IPPROTO_TCP
6

fromfd(fd,type[,proto]) 是一个很少被使用的函数,它用来从打开的一个文件描述符创建一个socket对象(文件描述符由文件的fileno()方法返回)。文件描述符与一个真实 的socket连接,而非一个文件。socket对象的fileno()方法返回关于这个socket的文件描述符。

当你使用完工 socket对象时,你应调用close()方法显式的关闭socket以尽快释放资源(尽管socket被垃圾回收器回收时将自动被关闭)。另外,你也 可以使用shutdown(how)方法来关闭连接一边或两边。参数0阻止socket接收数据,1阻止发送,2阻止接收和发送。

2、连接socket

当 两个socket连接时(例如使用TCP),一端监听和接收进来的连接,而另一端发起连接。临听端创建一个socket,调用bind(address) 函数去绑定一个特定的地址和端口,调用listen(backlog)来临听进来的连接,最后调用accept()来接收这个新的,进来的连接,下面是在 服务器端的代码:

s=socket(AF_INET,SOCK_STREAM)
s.bind(('127.0.0.1',44444))
s.listen(1)
q,v=s.accept() #返回socket q和地址v

注意:上面的代码将一直处于等待直到连接被建立。下面我们再打开另一个Python解释器,用作客户端;然后键入如下代码:

from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.connect(('127.0.0.1',44444) #发起连接

好了,我们验证一下连接是否建立了。我们在服务器端键入以下代码来发送一条信息:

q.send('hello,i come from pythontik.com') 注:有时可能出现send() argument 1 must be string or buffer,not str 错误,原因可能是您的机器不支持UTF-8字符集,临时解决方案是q.send(b' hello...')
31 #发送的字节数

在客户端键入以下代码来接收信息:

s.recv(1024)
'hello,i come from pythontik.com'

你 传递给bind和connect的地址是一个关于AF_INET的socket的元组(ipAddress,port)。代替connect,你也可以调 用connect_ex(address)方法。如果背后对C的connect的调用返回一个错误,那么connect_ex也将返回一个错误(否则返回 0代表成功),代替引发一个异常。

当你调用listen时,你给了它一个参数,这个数值表示在等待队列中允许放置的进来的连接总数。当等待队列已满时,如果有更多的连接到达,那么远程端将被告知连接被拒绝。在socket模块中的SOMAXCONN变量表明了等待队列所能容纳的最大量。

accept()方法返回形如bind和connect的一个地址,代表远程socket的地址。下面显示变量v的值:

v
('127.0.0.1', 1334)

UDP是不定向的连接,但是你仍然可以使用给定的目的地址和端口来调用connect去关联一个socket。

3、发送和接收数据

函 数send(string[,flags])发送给定的字符串到远程socket。sendto(string[,flags],address)发送给 定的字符串到一个特定的地址。通常,send方法用于可靠连接的socket,sendto方法用于不可靠连接的socket,但是如果你在一个 UDP socket上调用connect来使它与一个特定的目标建立联系,那么这时你也可以使用send方法来代替sendto。

send和sendto都返回实际发送的字节数。当你快速发送大量的数据的时候,你可能想去确保全部信息已被发送,那么你可以使用如下的一个函数:

def safeSend(sock,msg):
sent=0
while msg:
i=sock.send(msg)
if i==-1: #发生了错误
return -1
sent+=i
msg=msg[i:]
time.sleep(25)
return sent

recv(bufsize[,flags]) 方法接收一个进来的消息。如果有大量的数据在等待,它只返回前面的bufsize字节数的数据。recvfrom(bufsize[,flags])做同 样的事,除了它使用AF_INET socket的返回值是(data,(ipAddress,port)),这便于你知道消息来自哪儿(这对于非连接的 socket是有用的)。

send,sendto,recv和recvfrom方法都有一个可选的参数flags,默认值为0。你可以通过对socket.MSG_*变量进行组合(按位或)来建立flags的值。这些值因平台而有所不同,但是最通用的值如下所示:

MSG_OOB:处理带外数据(既TCP紧急数据)。
MSG_DONTROUTE:不使用路由表;直接发送到接口。
MSG_PEEK:返回等待的数据且不把它们从队列中删除。

例如,如果你有一个打开的socket,它有一个消息等待被接收,你可以接收这个消息后并不把它从进来的数据的队列中删除:

q.recv(1024,MSG_PEEK)
'hello'
q.recv(1024,MSG_PEEK) #因为没有删除,所以你可以再得到它。
'hello'

makefile([mode[,bufsize]]) 方法返回一个文件类对象,其中封装了socket,以便于你以后将它传递给要求参数为一个文件的代码(或许你喜欢使用文件的方法来代替send和 recv)。这个可选的mode和bufsize参数的取值和内建的open函数一样。

4、使用socket选项

socket对象的getpeername()和 getsockname()方法都返回包含一个IP地址和端口的二元组(这个二元组的形式就像你传递给connect和bind的)。 getpeername返回所连接的远程socket的地址和端口,getsockname返回关于本地socket的相同信息。

在默认 情况下,socket是阻塞式的,意思就是socket的方法的调用在任务完成之前是不会返回的。例如,如果存储向外发送的数据的缓存已满,你又企图发送 更多的数据,那么你对send的调用将被阻塞直到它能够将更多的数据放入缓存。你可以通过调用setblocking(flag)方法(其中flag取值 是0,setblocking(0))来改变这个默认行为,以使socket为非阻塞式。当socket为非阻塞式的时候,如果所做的动作将导致阻塞,将 会引起error异常。下面一段代码将试图不断地接受新的连接并使用函数processRequest来处理。如果一个新连接无效,它将间隔半秒再试。另 一方法是在你的监听socket上调用select或poll来检测一个新的连接的到达。

别的socket的选项可以使用 setsockopt(level,name,value)和getsockopt(level,name[,buflen])方法来设置和获取。 socket代表了一个协议栈的不同层,level参数指定了选项应用于哪一层。level的取值以SOL_开头(SOL_SOCKET,SOL_TCP 等等)。name表明你涉及的是哪个选项。对于value,如果该选项要求数值的值,value只能传入数字值。你也可以传递入一个缓存(一个字符串), 但你必须使用正确的格式。对getsockopt,不指定buflen参数意味你要求一个数字值,并返回这个值。如果你提供了 buflen,getsockopt返回代表一个缓存的字符串,它的最大长度是buflen的字节数。下面的例子设置了一个socket的用于发送的缓存 尺寸为64KB:

s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_SNDBUF,65535)

要得到一个包在被路由丢弃前所能有的生命周期(TTL)和跳数,你可以使用如下代码:

s.getsockopt(SOL_IP,IP_TTL)
32

5、数值转换

由于不同平台的字节顺序不一样,所以当在网络中传输数据时我们使用标准的网络字节顺序。nthol(x)和ntohs(x)函数要求一个网络字节顺序的数值并把它转换为当前主机字节顺序的相同数值,而htonl(x)和htons(x)则相反:

import.socket
socket.htons(20000) #转换为一个16位的值
8270
socket.htonl(20000) #转换为一个32位的值
541982720
socket.ntohl(541982720)
20000

使用SocketServers

SocketServers模块为一组socket服务类定义了一个基类,这组类压缩和隐藏了监听、接受和处理进入的socket连接的细节。

1、SocketServers家族
TCPServer和UDPServer都是SocketServer的子类,它们分别处理TCP和UDP信息。
注意:SocketServer也提供UnixStreamServer(TCPServer的子类)和UNIXdatagramServer(UDPServer的子类),它们都如同其父类一样除了在创建监听socket时使用AF_UNIX代替了AF_INET。

默 认情况下,socket服务一次处理一个连接,但是你可以使用ThreadingMixIN和ForkingMixIn类来创建任一 SocketServer的线程和子进程。实际上,SocketServer模块提供了一些对些有用的类来解决你的麻烦,它们 是:ForkingUDPServer、ForkingTCPServer、ThreadingUDPServer、 ThreadingTCPServer、ThreadingUnixStreamServer和 ThreadingUnixDatagramServer。

SocketServer以通常的方法处理进入的连接;要使它更有用,你应该 提供你自己的请求处理器类给它以便它传递一个socket去处理。SocketServer模块中的BaseRequestHandler类是所有请求处 理器的父类。假设,例如你需要写一个多线程的电子邮件服务器,首先你要创建一个MailRequestHandler,它是 BaseRequestHandler的子类,然后把它传递给一个新创建的SocketServer:
import SocketServer
...#创建你的MailRequestHandler
addr=('220.172.20.6',25) #监听的地址和端口
server=SocketServer.ThreadingTCPServer(addr,MailRequestHandler)
server.serve_forever()

每 次一个新的连接到来时,这个server创建一个新的MailRequestHandler实例并调用它的handle()方法来处理这个新的请求。因为 server继承自ThreadingTCPServer,对于每个新的请求它都启动一个单独的线程来处理这个请求,以便于多个请求能够被同时处理。如果 用handle_request()代替server_forever,它将一个一个的处理连接请求。server_forever 只是反复调用 handle_request而已。

一般来说,你只需使用socket服务之一,但是如果你需要创建你自己的子类的话,你可以覆盖我们下面提到的方法来定制它。

当 服务被第一次创建的时候,init函数调用server_bind()方法来绑定监听socket(self.socket)到正确的地址 (self.server_address)。然后调用server_activate()来激活这个服务(默认情况下,调用socket的listen 方法)。

这个socket服务不做任何事情直到调用了handle_request或serve_forever方法。 handle_request调用get_request()去等待和接收一个新的socket连接,然后调用 verify_request(request,client_address)去看服务是否会处理这个连接(你可以在访问控制中使用这个,默认情况下 verify_request总是返回true)。如果会处理这个请求,handle_request然后调用 process_request(request,client_address),如果 process_request(request,client_address)导致一个异常的话,将调用 handle_error(request,client_address)。默认情况下,process_request简单地调用 finish_request(request,client_address);子进程和线程类覆盖了这个行为去开始一新的进程或线程,然后调用 finish_request。finish_request实例化一个新的请求处理器,请求处理器轮流调用它们的handle()方法。

当SocketServer创建一个新的请求处理器时,它传递给这个处理器的init函数的self变量,以便于这个处理器能够访问关于这个服务的信息。

SocketServer 的fileno()方法返回监听socket的文件描述符。address_family成员变量指定了监听socket的socket族(如 AF_INET),server_address包含了监听socket被绑定到的地址。socket变量包含监听socket自身。

2、请求处理器

请 求处理器有setup()、handle()和finish()方法,你可以覆盖它们来定制你自己的行为。一般情况下,你只需要覆盖handle方法。 BaseRequestHandler的init函数调用setup()方法来做初始化的工作,handle()服务于请求,finish()用 于执行清理工作,如果handle或setup导致一个异常,finish不会被调用。记住,你的请求处理器会为每个请求创建一个新的实例。

request 成员变量有关于流(TCP)服务的最近接受的socket;对于数据报服务,它是一个包含进入消息和监听socket的元组。 client_address包含发送者的地址,server有对SocketServer的一个引用(通过这你可以访问它的成员,如 server_address)。

下面的例子实现了一个EchoRequestHandler,这作为一个服务端它将客户端所发送的数据再发送回客户端:

import SocketServer
class EchoRequestHandler(SocketServer.BaseRequestHandler):
... def handle(self):
... print 'Got new connection!'
... while 1:
... mesg=self.request.recv(1024)
... if not msg:
... break
... print 'Received:',msg
... self.request.send(msg)
... print 'Done with connection'
server=SocketServer.ThreadingTCPServer(('127.0.0.1',12321),EchoReuestHandler)
server.handle_request() #执行后将等待连接
Got new connection!
Received: Hello!
Received: I like Tuesdays!
Done with connection

打开另一个Python解释器作为客户端,然后执行如下代码:

from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.connect(('120.0.0.1',12321))
s.send('Hello!')
6
print s.recv(1024)
Hello!
s.send('I like Tuesdays!')
16
print s.recv(1024)
I like Tuesdays!
s.close()

SocketServer 模块也定义了BaseRequestHandler的两个子类:StreamRequestHandler和 DatagramRequestHandler。它们覆盖了setup和finish方法并创建了两个文件对象rfile和wfile,你可以用这两个文 件对象来向客户端读写数据,从而代替使用socket方法。

socket的阻塞或同步编程

一、使用socket

网 络编程中最基本的部分就是socket(套接字)。socket有两种:服务端socket和客户端 socket。在你创建了一个服务端socket之 后,你告诉它去等待连接。然后它将监听某个网络地址(形如:xxx.xxx.xxx.xxx:xxx) 直到客户端连接。然后这两端就可以通信了。

处理客户端socket通常比处理服务端socket要容易一点,因为服务端必须时刻准备处理来自客户端的连接,并且它必须处理多个连接,而客户端只需要简单的连接,然后做点什么,然后断开连接。

实 例化一个socket时,可以指定三个参数:地址系列(默认为socket.AF_INET)、流socket(这是个默认 值: socket.SOCK_STREAM)或数据报socket(socket.SOCK_DGRAM)、协议(默认值是0)。对于简单的 socket,你可以不指定任何参数而全部使用默认值。

服务端socket在使用bind方法之后调用listen方法去监听一个给定的 地址。然后,客户端socket就可以通过使用connect方法(connect方法所使用的地址参数与bind相同)去连接服务端。listen方法 要求一个参数,这个参数就是等待连接队列中所能包含的连接数。

一旦服务端socket调用了listen方法,就进入了临听状态,然后通 常使用一个无限的循环:1、开始接受客房端的连接,这通过调用accept方法来实现。调用了这个方法后将处于阻塞状态(等待客户端发起连接)直到一个客 户端连接,连接后,accept返回形如(client,address)的一个元组,其中client是一个用于与客户端通信的 socket,address是客户端的形如xxx.xxx.xxx.xxx:xxx的地址;2、然后服务端处理客户端的请求;3、处理完成之后又调用 1。

关于传输数据,socket有两个方法:send和recv。send使用字符串参数发送数据;recv参数是字节数,表示一次接受的数据量,如果你不确定一次该接受的数据量的话,最好使用1024。

下面给出一个最小的服务器/客户机的例子:

服务端:

import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close()

客户端:

import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))
print s.recv(1024)

注意:如果你使用Ctrl-C来停止服务端的话,如果再次使用相同的端口可能需要等待一会儿。

二、使用SocketServer

SocketServer模块简单化了编写网络服务器的工作。
它提供了四个基本的服务类:TCPServer(使用TCP协议)、UDPServer(使用数据报)、UnixStreamServer、

UnixDatagramServer。UnixStreamServer和UnixDatagramServer用于类Unix平台。
这四个类处理请求都使用同步的方法,也就是说,在下一个请求处理开始之前当前的请求处理必须已完成

用SocketServer创建一个服务器需要四步:

1、通过子类化BaseRequestHandler类和覆盖它的handle()方法来创建一个请求处理器类,用于处理进来

的请求;
2、实例化服务类如TCPServer,并传递给它参数:服务器地址和请求处理器类;
3、调用服务实例对象的handle_request()或serve_forever()方法去处理请求。

下面使用SocketServer用同步的方法写一个最简单的服务器:

from SocketServer import TCPServer, StreamRequestHandler

第一步。其中StreamRequestHandler类是BaseRequestHandler类的子类,它为流socket定义了

rfile和wfile方法

class Handler(StreamRequestHandler):
def handle(self):
addr = self.request.getpeername()
print 'Got connection from', addr
self.wfile.write('Thank you for connecting')

第二步。其中''代表运行服务器的主机

server = TCPServer(('', 1234), Handler)

第三步。serve_forever()导致进入循环状态

server.serve_forever()

注意:使用阻塞或同步的方法一次只能连接一个客户端,处理完成后才能连接下一个客户端。

非阻塞或异步编程

当前1/2页 12下一页阅读全文

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录