用socket进行网络开发需了解服务器和客户端的Socket原语,每个原语在不同的高级语言中都有相应的实现方式。TCP的Socket原语如下:
socket():建立Socket对象。bind():绑定。在参数中需要传入绑定的IP地址和端口。listen():监听。只在服务器端有用,告诉操作系统开始监听之前绑定的IP地址和端口,可以在参数中指定允许排队的最大连接数量。connect(): 在客户端连接服务器。参数中需要指定服务器的地址和端口。accept():接受连接。只在服务器端有用,从监听到的连接中取出一个,并将其包装成一个新的Socket对象。send():发送数据。服务器和客户端均可以调用send()向对方发送数据,在send()的参数中传入要发送的数据,通过send()的返回值判断数据是否发送成功。recv():接收数据。服务器和客户端均可调用recv()从对方接收数据。close():关闭连接。通信中的任何一方可以调用close()发起关闭连接请求,另一方收到后也调用close()关闭连接。
下面通过Python代码演示
服务端代码如下:
import socket HOST='0.0.0.0' PORT = 3434 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((HOST,PORT))#绑定IP与端口 s.listen(1) while True: conn,addr = s.accept() print('Client %s connected!'%str(addr) )#输出客户端的IP地址 dt = '我来自服务端' message = 'Current time is ' + str(dt) conn.send(message.encode())#向客户端发送时间 print("Sent:",message) conn.close()#关闭链接
与服务器端对应的客户端代码如下:
import socket #socket模块 HOST = '127.0.0.1' PORT = 3434 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((HOST,PORT)) print('Connect %s:%d OK'%(HOST,PORT)) data = s.recv(1024)#接受数据,本次接收数据的最大长度为1024 print("Received:",data.decode()) s.close()#关闭链接
自行调试,查看执行结果!
注:客户端的Socket端口号由系统自动分配。