1.两台计算机之间进行通信,两台机器间进行收发数据,如果将发送与接收数据的代码封装起来,写成一个接口,这便是socket;socket主要是用来收发数据的。
所有的网络协议都是基于socket的;网络协议有 HTTP(网页)、smtp(邮件)、dns、ftp、ssh、snmp、icmp ping(网络层,其他在应用层)。
2.两台计算机通信遵守的规则有 TCP\IP(三次握手、四次断开)、 UDP
3.我们现在先实现一下两台计算机简单的通信一次(发送数据的为客户端、接收数据的为服务器端,当然客户端也可以接收数据,服务器端也可以发送数据)
服务器端代码:
#服务器端
import socket
server=socket.socket() #定义类型
server.bind(('localhost',6969)) #绑定要监听的端口
server.listen() #监听
print("准备接收数据")
conn,addr=server.accept() #等待接收数据
print(conn,addr) #conn是客户端连接过来而在服务器端为其生成的一个连接实例
print("开始接收数据")
data=conn.recv(1024)
print("recv:",data) #打印接收的数据
conn.send(data.upper()) #发送数据,将其变为大写
server.close()
客户端代码:
#客户端
import socket
#声明协议类型
client=socket.socket()#声明socket类型,同时生成socket连接对象
client.connect(('localhost',6969))
client.send(b"hello world")
data=client.recv(1024)
print("recv:",data)
client.close()
以上代码实现了客户端跟服务器端的一次通信。
4.将以上代码升级一下,让它们能通信多次:
服务器端:
#服务器端
import socket,os
server = socket.socket()
server.bind(('localhost',6969)) #绑定要监听端口
server.listen(5) #监听
print("我要开始等电话了")
while True:
conn, addr = server.accept() # 等电话打进来
# conn就是客户端连过来而在服务器端为其生成的一个连接实例
print(conn, addr)
print("电话来了")
count = 0
while True:
data = conn.recv(1024)
print("recv:",data)
if not data:
print("client has lost...")
break
conn.send(data.upper())
count+=1
if count >10:break
server.close()
客户端:
#客户端
import socket
#声明协议类型
client = socket.socket() #声明socket类型,同时生成socket连接对象
client.connect(('localhost',6969))
while True:
msg = input(">>:").strip()
if len(msg) == 0:continue
client.send(msg.encode("utf-8"))
data = client.recv(10240)
print("recv:",data.decode())
client.close()