python实现两台不同主机之间进⾏通信(客户端和服务端)——
Socket
⼤家好,我是⾠哥~
今天教⼤家通过Python进⾏Socket⽹络编程
(做⼀个聊天程序)
可以实现在不同的主机(电脑)之间进⾏通话。
具体效果如何,接着往下看
可以看到客户端(上⽅)向服务器端(下⽅)发送了内容,服务器端进⾏了回复
【备注:客户端是我的本机,服务器是另⼀条主机(阿⾥云服务器)】
两台主机的⽬的:验证两台主机可以相互通信
socket
先简单给⼤家介绍⼀下什么是socket,socket(简称套接字) 是进程间通信的⼀种⽅式,它与其他进程间通信的⼀个主要不同是:它能实现不同主机间的进程间通信。
我们⽹络上各种各样的服务⼤多都是基于 Socket 来完成通信的,例如浏览⽹页、QQ 聊天、收发 email 等等
简单的说:socket可以实现不同主机间进⾏通信
socket通信的条件:IP和端⼝
ip相信⼤家都陌⽣了,每⼀台主机都有⼀个ip,不同主机之间通信的⾸要前提就是ip可以互访,此外还有⼀个条件就是端⼝,⽐如我们经常听到的80端⼝,3306端⼝,8080端⼝等。
主机中的数据是通过端⼝发送和接收,需要将对应端⼝打开才能进⾏通信。
形象⽐喻
ip相当于家庭地址,端⼝相当于门或者窗户
例⼦:
(主机A)快递员要想将快递(数据)送到你⼿中(另⼀台主机B),需要知道你家的地址(主机B的ip),到你家门⼝后,需要你打开门(主机B的端⼝)才能拿到快递(数据)。
这⾥需要分服务端和客户端,客户端发送(主机A),服务器接收(主机B),当然了,每⼀台主机可以充当两个⾓⾊(既是客户端,也是服务器),这样就可以实现两台主机之间相互发送和接收。
看到这⾥之后,相信⼤家都清楚socket在实现不同主机之间通信的⼤概意思了,下⾯开始Python代码实现。
客户端实现过程
先来分析客户端(主机A)的实现过程
from socket import *
# 1.创建套接字
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 2.准备连接服务器,建⽴连接
serve_ip = "服务器端(主机B)的IP"
serve_port = 8000 #端⼝,⽐如8000
t((serve_ip,serve_port)) # 连接服务器,建⽴连接,参数是元组形式
⾸先与服务器接收端(主机B)建⽴连接,连接条件(主机B的ip和端⼝),这⾥的端⼝8000是指将数据发送到主机B的端⼝(主机B到时候会监听8000端⼝,然后进⾏接收数据)
#准备需要传送的数据
send_data = "今天是2021年08⽉29⽇,⾠哥给服务器端发送数据了"
tcp_socket.send(de("gbk"))
#从服务器接收数据
#注意这个1024byte,⼤⼩根据需求⾃⼰设置
from_server_msg = v(1024)
#加上.decode("gbk")可以解决乱码
print(from_server_msg.decode("gbk"))
#关闭连接
tcp_socket.close()
send_data是往服务器端(主机B)发送的内容,from_server_msg是服务器端(主机B)往客户端(主机A)发送的内容
客户端的代码就结束了
服务器实现过程
分析服务器端(主机B)的实现过程
from socket import *
#创建套接字
tcp_server = socket(AF_INET,SOCK_STREAM)
#绑定ip,port
#这⾥ip默认本机
address = ('',8000)
tcp_server.bind(address)
# 启动被动连接
#多少个客户端可以连接
tcp_server.listen(128)
#使⽤socket创建的套接字默认的属性是主动的
#使⽤listen将其变为被动的,这样就可以接收别⼈的链接了
服务器端(主机B)ip可以留空(默认本机),端⼝8000(因为客户端往8000端⼝发送数据,所以服务器需要监听的端⼝也是8000,与客户端的端⼝⼀致)
# 创建接收
# 如果有新的客户端来链接服务器,那么就产⽣⼀个新的套接字专门为这个客户端服务
client_socket, clientAddr = tcp_server.accept()
client_socket⽤来为这个客户端服务,相当于的tcp_server套接字的代理
tcp_server_socket就可以省下来专门等待其他新客户端的链接
这⾥clientAddr存放的就是连接服务器的客户端地址
#接收对⽅发送过来的数据
from_client_msg = v(1024)#接收1024给字节,这⾥recv接收的不再是元组,区别UDP
print("接收的数据:",from_de("gbk"))
#发送数据给客户端
socket通信为什么要指定端口send_data = client_socket.send("客户端你好,服务器端收到,【Python研究者】".encode("gbk"))
#关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
client_socket.close()
from_client_msgs 是服务器端(主机B)接收到来⾃客户端(主机A)发送过来的数据send_data 是服务器端(主机B)往客户端(主机A)发送过去的数据
服务器端的代码就结束了
提醒:服务器端的8000端⼝需要开启,不然⽆法进⾏通信
演⽰
先启动(执⾏)服务器端(主机B)的程序,再执⾏客户端(主机A)
可以看到客户端(上⽅)向服务器端(下⽅)发送了内容,服务器端进⾏了回复
发送和响应内容:
客户端发送:今天是2021年08⽉29⽇,⾠哥给服务器端发送数据了
服务器端接收并回复给客户端:客户端你好,服务器端收到,【Python研究者】
实现持续通信过程
上⽅动图演⽰的是客户端和服务端的⼀次通信过程,可以将客户端的发送和服务端的接收放到循环中,实现持续通信过程。
客户端
while(1):
send_data = input("请输⼊内容:")
#send_data = "今天是2021年08⽉29⽇,⾠哥给服务器端发送数据了"
tcp_socket.send(de("gbk"))
if send_data == "exit":
break;
#从服务器接收数据
#注意这个1024byte,⼤⼩根据需求⾃⼰设置
from_server_msg = v(1024)
#加上.decode("gbk")可以解决乱码
print(from_server_msg.decode("gbk"))
#关闭连接
tcp_socket.close()
服务端
while(1):
#接收对⽅发送过来的数据
from_client_msg = v(1024)#接收1024给字节,这⾥recv接收的不再是元组,区别UDP
if(from_client_msg=="exit"):
break
print("接收的数据:",from_client_msg.decode("gbk"))
now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
#发送数据给客户端
send_data = client_socket.send((str(now_time)+" 服务端:客户端你好,服务器端收到,【Python研究者】").encode("gbk")) #关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
client_socket.close()
客户端可以持续给服务端发送数据,服务器接收数据后打印并返回数据给客户端
服务端返回的内容:
当前系统时间+服务端:客户端你好,服务器端收到,【Python研究者】
最后当客户端输⼊:exit,则断开与服务端的连接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论