先放个题外话,了解一下OSI七层网络模型,这里放一张网上的图
再大致了解一下socket的基本概念:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。它的工作方式是这样的
了解了大致的工作方式,主要是怎么使用!
用socket编程时,需要做一个客户端和一个服务器端,我们先做个最简单的socket通讯模式
server端
client端
client端-windows
server端-linux
1 import socket 2 server = socket.socket() 3 server.bind(('localhost',9999)) 4 server.listen() 5 conn,addr = server.accept() 6 print(conn,addr) 7 print("开始") 8 while True: 9 data = conn.recv(1024) 10 print(data.decode()) 11 conn.send(data.upper().encode()) 12 server.close()
1 import socket 2 client = socket.socket() 3 client.connect(('localhost',9999)) 4 while True: 5 msg = input('>>>').strip() 6 client.send(msg.encode('utf-8')) 7 data = client.recv(1024) 8 print("recv:",data.decode()) 9 client.close()
发送的data必须为byte的格式,(在python2中好像不太一样,忘记了!),所以要把数据encode成utf-8的格式(utf-8可以省略不写,是默认的)在收到数据后在decode一下就可以。
这里还要注意的是int格式的数据不能encode,可以先转换成str的格式。
都敲好以后,先运行service端,然后再运行client端,就可以试一试了!
调试好以后我们可以稍微来个复杂一点的,把服务器放在linux里,客户端就还在pycharm里。但是要把代码稍微改一改,先启动linux,ifconfig一下
ip是192.168.75.130,把客户端的localhost改成这个ip地址,端口号不用换
1 import socket 2 client = socket.socket() 3 client.connect(('192.168.75.130',9999)) 4 while True: 5 msg = input('>>>').strip() 6 client.send(msg.encode('utf-8')) 7 data = client.recv(1024) 8 print("recv:",data.decode("utf-8")) 9 client.close()
1 import socket 2 server = socket.socket() 3 server.bind(('0.0.0.0',9999)) 4 server.listen() 5 conn,addr = server.accept() 6 print(conn,addr) 7 print("开始") 8 while True: 9 data = conn.recv(1024).decode() 10 print(data) 11 conn.send(data.upper().encode()) 12 server.close()
服务器端的ip地址要改成0.0.0.0
先后运行一下,OK
成功!!
备注:linux需要对防火墙进行设置,否则有可能连接失败。设置方法
https://www.cnblogs.com/yinsedeyinse/p/10230157.html