socket:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
服务端:
# 导入socket模块
import socket
# 创建socket对象
sk = socket.socket()
# 绑定端口和ip,本机ip,与客户端相同的端口号
ip_port = ('127.0.0.1',9993)
sk.bind(ip_port)
# 最大连接数
sk.listen(5)
# 进入一个四循环中
while True:
# 获取客户端的ip和端口号
conn,address = sk.accept()
conn.send('hello')
flag = True
while flag:
# data是从缓冲区中拿到的数据,一次大小为1024字节
data = conn.recv(1024)
print data
# 如果客户端的回应是'exit',则推出该循环
if data == 'exit':
flag = False
# 服务端回复yeah
conn.send('yeah')
conn.close()
客户端:
import socket
# 创建一个socket对象
client = socket.socket()
# 创建连接,本机的回环接口和与服务端保持一致的端口号
ip_port = ('127.0.0.1',9993)
client.connect(ip_port)
flag = True
while flag:
# 在缓冲区中获取数据
data = client.recv(1024)
print data
# 发送数据
inp = raw_input('client:')
if inp == 'exit':
flag = False
client.send(inp)