Socket源于Unix的“一切借文件”的思想,简而言之就是类似与file的:打开——读写——关闭的操作,file针对与文件进行操作,socket针对与服务器和客户端进行操作。基于网络进行通信,必然逃不开各种网络协议,为了快速开发,在应用层和传输层之间加入socket层,从而将tcp(udp)的协议进行封装,便于进行开发。
首先写一个简单的基于socket的网络通信
1 # import socket 2 from socket import * 3 ip_port=(‘127.0.0.1‘,8080) 4 back_log=5 5 buffer_size=1024 6 7 tcp_client=socket(AF_INET,SOCK_STREAM) 8 tcp_client.connect(ip_port) 9 10 while True: 11 msg=input(‘>>: ‘).strip() 12 if not msg:continue 13 tcp_client.send(msg.encode(‘utf-8‘)) 14 print(‘客户端已经发送消息‘) 15 data=tcp_client.recv(buffer_size) 16 print(‘收到服务端发来的消息‘,data.decode(‘utf-8‘)) 17 18 tcp_client.close()
# import socket from socket import * ip_port=(‘127.0.0.1‘,8080) back_log=5 buffer_size=1024 tcp_server=socket(AF_INET,SOCK_STREAM) tcp_server.bind(ip_port) tcp_server.listen(back_log) while True: print(‘服务端开始运行了‘) conn,addr=tcp_server.accept() #服务端阻塞 print(‘双向链接是‘,conn) print(‘客户端地址‘,addr) while True: # try: data=conn.recv(buffer_size) print(‘客户端发来的消息是‘,data.decode(‘utf-8‘)) conn.send(data.upper()) # except Exception: # break conn.close() tcp_server.close()
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
socket中常用的方法有如下几个
socket.socket():建立socker套接字,两个参数,family代表家族.type代表类型,type默认TCP
socket.bind():服务器端,接受的参数是元组,不是传递host,port两个元素,而是(host,port),绑定主机,端口号到套接字
socket.listen():一个参数,值为允许客户端连接服务器的排队上线,如果超过挂起上限则会拒绝掉, 开始监听绑定的端口号
socket.accept():无参数,其返回值是一个元组,第一个是新的套接字对象,第二个是地址,被动接受tcp客户链接,阻赛式等待连接的到来
socket.connect():主动初始化tcp的服务器连接
socket.connect_ex():connect()的扩展版,出错返回错误代码,而非抛出异常