网络编程的一个基本组件就是套接字(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: www.sina.com.cn\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)