Socket又称”套接字”,应用程序一般经过”套接字”向网络发出请求或者应答网络请求。 具体定义看百科 python
socket有两种,一种基于UDP,一种基于TCP。UDP是面向非链接的,传递的是数据报,每次传递都要指定目的地址端口;而TCP是面向链接的,通过三次握手协议创建起链接,因此不用每次都指定目的地址端口。固然还有不少的区别,这里就不一一列举。git
通常服务器端和客户端各有一个socket,你能够将它当作是一个网络接口,将你的请求转化成底层数据,把收到的数据转化成高级的数据对象。github
在Python中用于socket编程的包是socket
,这是一个自带的包。web
#coding=utf-8
import socket
import time
HOST = 'localhost' #主机,由于是本机因此是localhost,或者127.0.0.1也能够
BUFFSIZE = 1024 #每次读取数据的缓存区大小
PORT = 8802 #端口,也就是客户端要链接的端口
ADDR = (HOST,PORT) #将主机地址和端口组成一个tuple形式的地址
UDPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSerSocket.bind(ADDR)
print('waiting for connect...')
while True:
data,addr = UDPSerSocket.recvfrom(BUFFSIZE)
print 'Received',data,'from',addr,'in [%s]'%time.ctime()
UDPSerSocket.sendto('[%s]:%s'%(time.ctime(),data),addr)
UDPSerSocket.close()
说明:编程
UDPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
中两个参数,第一个是指定以internet地址链接,第一个参数还有一个值是AF_UNIX
,可是通常都不会用到,至少我还没用到过。第二个参数是指定以何种方式传输,socket.SOCK_DGRAM
是以数据报的形式传输,也就是对应UDP方式,TCP方式是socket.socket.SOCK_STREAM
。缓存
UDPSerSocket.bind(ADDR)
是绑定地址,服务器端的socket必须执行这一步,计算机才知道这个socket对应那个端口,并能够在这个端口监听。服务器
服务器端的socket通常都会有一个while True
的循环,用于接收完数据以后立刻等待下一个数据。网络
UDPSerSocket.recvfrom(BUFFSIZE)
是接收数据的方法,接受到的是一个data
数据和发送数据的地址addr
。以前咱们说过UDP方式是每一次都必须指定地址,因此这里获取到一个地址能够在下一步的发送方法UDPSerSocket.sendto('[%s]:%s'%(time.ctime(),data),addr)
中用到。socket
最后,用完socket以后记得记性close()
方法释放tcp
#coding=utf-8
import socket
HOST = 'localhost'
PORT = 8802
ADDR = (HOST,PORT)
BUFFSIZE = 1024
UDPcliSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
data = raw_input('>')
if not data:
break;
UDPcliSocket.sendto(data,ADDR)
datarecv,addr = UDPcliSocket.recvfrom(BUFFSIZE)
if not datarecv:
break
print datarecv
UDPcliSocket.close()
说明:
Client和Server创建socket对象的方法都是同样的,不一样的是Client端不须要绑定bind()
,由于Client是通常状况下是主动链接的一方,而不是等待的一方。
Client端的接收和发送方法和Server是彻底同样的。
#coding=utf-8
import socket
import time
HOST = 'localhost'
PORT = 8081
BUFFSIZE = 1024
ADDR = (HOST,PORT)
TCPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCPSerSocket.bind(ADDR)
TCPSerSocket.listen(5)
while True:
print "waiting for connection..."
tcpCliSocket,addr = TCPSerSocket.accept()
print '...connected from:',addr
while True:
data = tcpCliSocket.recv(BUFFSIZE)
if not data:
break
tcpCliSocket.send('[%s] %s'%(time.ctime(),data))
print [time.ctime()],":",data
tcpCliSocket.close()
TCPSerSocket.close()
说明:
TCP与UDP的Server端创建socket对象差很少,不一样的是在socket.socket(socket.AF_INET,socket.SOCK_STREAM)
第二个参数指定为socket.SOCK_STREAM
,一样也须要绑定地址端口。,还有TCP的ServerSocket还须要一个listen(5)
方法,表示监听,不加会报错。
咱们说TCP是面向链接的,因此在Client端链接到Server后并不会马上断开,而为了能双方通讯,Server会经过tcpCliSocket,addr = TCPSerSocket.accept()
收到一个ClientSocket对象,经过操做ClientSocket对象来完成接收、发送操做。
TCP接收方法是recv
与UDP的recvfrom
不一样,其实想一想仍是挺容易理解的,UDP的recvfrom
方法除了获得data
以外,还能获得addr
,因此才有from,而TCP早就已经获得ClientSocket对象,固然也经过accept()
获得了addr
,因此就没有from咯。TCP的send
和UDP的sendto
也可如此理解。
固然仍是不要忘记执行close()
方法,也不要忘了关闭ClientSocket
。
#coding = utf-8
import socket
import time
HOST = 'localhost'
PORT = 8081
BUFFSIZE = 1024
ADDR = (HOST,PORT)
TCPCliSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCPCliSocket.connect(ADDR)
while True:
data = raw_input('>')
if not data:
break
TCPCliSocket.send(data)
data = TCPCliSocket.recv(BUFFSIZE)
if not data:
break
print '%s'%data
说明:
TCP与UDP的ClientSocket不一样之处在于TCPClientSocket
要先创建链接,因此要执行connect()
方法,为何?由于TCP是面向链接的。
Client端的发送和接收方法与TCP的Server相同,send()
和recv()
Client端不会像Server端那样接收到对方的Socket的,为何,由于不须要!通常Client是主动链接Server,就是用connect()
,那么链接后Client就把本身的ClientSocket传给Server,Server经过它来操做发送接收,而Client也就用ClientSocket接收和发送咯,你能够将ClientSocket当作一个管道,经过这个管道来沟通Server和Client。
Server端都要用bind()
绑定地址和端口。
区别TCP和UDP的是在创建ServerSocket对象时第二个参数不一样,TCP是socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
,而UDP是socket.socket(socket.AF_INET,socket.SOCK_STREAM)
。
TCP的Server还须要有listen()
方法监听。
TCP的Server端会经过accpet()
方法获得addr
和ClientSocket
,经过ClientSocket
的send()
和recv()
方法实现发送和接收。
UDP的发送和接收方法是sendto()
和recvfrom
,TCP的发送和接收方法是send
和recv
,注意区分。
博文中代码点此下载