网络编程的一个基本组件就是套接字(socket)
一个套接字就是一个socket模块中的socket类的实例,他的实例化需要3个参数:
第一个参数是地址族(默认是socket.AF_INET,前缀AF_表示地址族(address family))
第二个参数是流(socket.SOCK_STREAM,默认值) 或者 数据报(socket.SOCK_DGRAM)套接字
第三个参数是协议,默认是0(一般可不提供)
# 导入socket库:
import socket
# 创建Socket时,AF_INET指定使用IPv4协议,IPv6就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:注意参数是一个tuple,包含地址和端口号。
s.connect(('www.baidu.com', 80))socket有两个方法:send和recv
s.send('GET / HTTP/1.1\r\nHost: \r\nConnection: close\r\n\r\n')
s.recv:用一个所需(最大)字节数做参数调用recv来接收数据,一般建议1024
一个简单服务器端的例子
import socket
s = socket.socket()
host = socket.gethostname() #获取本机
port = 2233
s.bind((host, port))
s.listen(5) #调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:
print 'Waiting for connection...'
while True:
#服务器通过循环来接受连接,accept()会等待并返回一个客户端的连接,类型是tuple:
c,addr = s.accept()
print 'Get connection from %s:%s' % addr
c.send('Thank you for connecting')
c.close()##升级版
##使用面向对象的思维,一个基于SocketServer类的服务器
from SocketServer import TCPServer,StreamRequestHandler
class Handler(StreamRequestHandler):
def handle(self):
addr = self.request.getpeername()
print 'Get connection from: %s %s' % addr
self.wfile.write('Thank you for connection')
#''空字符表示程序运行的本机
server = TCPServer(('',2345),Handler)
server.serve_forever()一个客户端的例子
import socket s = socket.socket() host = socket.gethostname() port = 2233 s.connect((host, port)) print s.recv(2233)
















