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()的扩展版,出错返回错误代码,而非抛出异常
来源:https://www.cnblogs.com/chenjie2018/p/8538615.html