众所周知,网络就是一种辅助双方或者多方能够连接在一起的工具,使用网络可以联通多方然后进行通信,即把数据从一方传递给另外一方,为了让在不同的电脑上运行的软件,之间能够互相传递数据,就需要借助网络的功能,即进程间通信.
A:使用网络UDP,基于socket来完成通信,使用步骤可分为:
import socket(1)创建套接字
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
(SOCK_DGRAM属于数据报套接字,专门用于UDP)
(2)接收和发送数据
1>
send_msg = input('请输入要发送的消息内容:')
send_addr = (ip地址,端口号) (此处可以指定一个接收消息者的ip地址或者端口号,注意使用一个元组包裹)
soc.sendto(send_msg.encode('utf-8'),send_addr) (注意将发送的消息进行编码)
2>
recv_msg,recv_addr = soc.recvfrom(1024)
print('接收到的消息是:%s' % recv_msg.decode('utf-8')) (注意将接收到的消息进行解码)
(3)关闭套接字
soc.close() (当端口不绑定时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化,如果端口绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的)
B:使用网络TCP进行通信,同样基于socket来完成通信,分为客户端和服务器端,使用步骤为:
(1)创建套接字
client_soc = socket.socket(socket.AF_INT,socket.SOCK_STREAM) (客户端)
server_soc = socket.socket(socket.AF_INET,socket.SOC_STREAM) (服务器)
(2)客户端连接服务器
client_soc.connect((服务器ip地址,端口号)) (客户端) (注意这里书写的格式,使用元组包裹地址信息)
(3)发送数据
send_msg = input('请输入要发送的消息内容:')
client_soc.send(send_msg.encode('utf-8')) (客户端)(发送的数据同样进行编码,将字符串转换成二进制)
server_soc.send(send_msg.encode('utf-8')) (括号里直接是发送的内容)
(4)接收数据
recv_msg = client_soc.recv(1024) (直接是接收到的内容)
print('接收到的消息是:%s' % (recv_msg.decode('utf-8'))) (同样需要进行解码,将收到的二进制文本转换)
(5)注意服务器一般需要绑定端口
local_addr = (ip地址,端口号)
server_soc.bind(local_addr) (服务器)
(6)设置服务器为被动监听模式
server_soc.listen(128) (服务器)
(7)获取客户端连接并创建一个新的套接字来服务客户端
client_soc,client_addr = server_soc.accept() (服务器)
(8)使用客户端套接字来收发数据
clilent_soc.send(send_msg)
recv_msg,recv_addr = client_soc.recv(1024)
print('%s发来的消息是:%s' % (recv_addr ,revc_msg.deocde('utf-8'))) (同样进行解码)
(9)关闭客户端套接字
client_soc.close()
(10)关闭服务器套接字
server_soc.close()
C:开启多线程执行多任务
(1)导入模块import threading,提供子线程任务
(2)使用threading模块里的Thread类创建线程对象
t1 = threading.Thread(target = 函数名)
t2 = threading.Thread(target = 函数名)
......
(3)开启线程
t1.start()
t2.start()
......
针对于大型项目,可以使用面向对象来创建,会更加方便和灵活,定义好一个类之后让继承threading,然后提供定义线程的run方法,最后创建线程对象调用start执行run方法,将多任务的方法提供在网络通信,便于服务器和客户端之间通信.
import threading
from time import sleep
def kehuduan():
for i in range(3):
print("正在服务...%d"%i)
sleep(1)
def fuwuqiduan():
for i in range(3):
print("正在服务...%d"%i)
sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
多线程实现服务器与多客户端之间通信步骤
1.服务器端创建ServerSocket,循环调用accept()等待客户端连接。2. 客户端创建一个socket并请求和服务器端连接。
3.服务器端接受客户端请求,创建socket与该客户建立专线连接。
4.建立连接的两个socket在一个单独的线程上对话。
5.服务器端继续等待新的连接。