Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。
在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。
所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程.
TCP通信的基本步骤如下:
服务端:socket---bind---listen------accept---recv---send-------close
客户端:socket---------connect---send---recv-------close
Server端
#!/usr/bin/env python #-*-coding=utf-8-*- import socket #定义ip和端口,(元组) ip_port = (‘127.0.0.1‘,9999) #绑定协议,创建套接字,对象 s=socket.socket() #绑定ip+协议+端口:用来唯一标识一个进程,ip_port必须是元组格式 s.bind(ip_port) #定义最大可挂起的链接数 s.listen(3) #等待客户端的链接,conn相当于一条客户端和server端链接的通道,addr是客户端ip+port conn,addr = s.accept() #server 每次接收最大值是1024字节 data = conn.recv(1024) print(data.decode()) #server 端发送消息 conn.send(bytes(‘已收到‘,encoding=‘utf8‘)) s.close()
Client端
#!/usr/bin/env python #-*-coding=utf-8-*- import socket ip_port = (‘127.0.0.1‘,9999) #创建一个套接字对象 s=socket.socket() #连接服务端,如果服务端现在有一个连接,那么挂起,挂起个数在服务端配置 s.connect(ip_port) #客户端发送消息 #python 3.0以后只能发送字节,所以需要把字符串转换成字节 #s.send(‘消息已发送,请注意查收!‘) #错误格式 s.send(bytes(‘消息已发送,请注意查收!‘,encoding=‘utf8‘)) #客户端接收消息,每次接收最大值是1024字节 cli_recv = s.recv(1024) print(cli_recv.decode()) #关闭 s.close()
时间: 2024-12-15 01:32:57