Socket两台主机通信
Socket
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信。我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如浏览网页、QQ 聊天、收发 email 等等。
socket通信的条件:IP和端口
每一台主机都有一个IP,不同主机之间通信的首要前提就是IP可以互访,此外还有一个条件就是端口,比如我们经常听到的80端口,3306端口,8080端口等。主机中的数据是通过端口发送和接收,需要将对应端口打开才能进行通信。
创建客户端
from socket import *
# 1.创建套接字
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 2.准备连接服务器,建立连接
serve_ip = "服务器端(主机B)的IP"
serve_port = 8000 #端口,比如8000
tcp_socket.connect((serve_ip,serve_port)) # 连接服务器,建立连接,参数是元组形式
#准备需要传送的数据
send_data = "今天是2021年08月29日,Kolbey给服务器端发送数据了"
tcp_socket.send(send_data.encode("gbk"))
#从服务器接收数据
#注意这个1024byte,大小根据需求自己设置
from_server_msg = tcp_socket.recv(1024)
#加上.decode("gbk")可以解决乱码
print(from_server_msg.decode("gbk"))
#关闭连接
tcp_socket.close()
创建服务器
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将其变为被动的,这样就可以接收别人的链接了
# 创建接收
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
client_socket, clientAddr = tcp_server.accept()
# client_socket用来为这个客户端服务,相当于的tcp_server套接字的代理
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# 这里clientAddr存放的就是连接服务器的客户端地址
#接收对方发送过来的数据
from_client_msg = client_socket.recv(1024)#接收1024给字节,这里recv接收的不再是元组,区别UDP
print("接收的数据:",from_client_msg.encode("gbk"))
#发送数据给客户端
send_data = client_socket.send("客户端你好,服务器端收到!".encode("gbk"))
#关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
client_socket.close()
创建客户端,实现持续通信
from socket import *
# 1.创建套接字
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 2.准备连接服务器,建立连接
serve_ip = "服务器端(主机B)的IP"
serve_port = 8000 #端口,比如8000
tcp_socket.connect((serve_ip,serve_port)) # 连接服务器,建立连接,参数是元组形式
while True:
send_data = input("请输入内容:")
#send_data = "今天是2021年08月29日,Kolbey给服务器端发送数据了"
tcp_socket.send(send_data.encode("gbk"))
if send_data == "exit":
break
#从服务器接收数据
#注意这个1024byte,大小根据需求自己设置
from_server_msg = tcp_socket.recv(1024)
#加上.decode("gbk")可以解决乱码
print(from_server_msg.decode("gbk"))
#关闭连接
tcp_socket.close()
创建服务器,实现持续通信
from socket import *
import time
#创建套接字
tcp_server = socket(AF_INET,SOCK_STREAM)
#绑定ip,port
#这里ip默认本机
address = ('',8000)
tcp_server.bind(address)
# 启动被动连接
#多少个客户端可以连接
tcp_server.listen(128)
#使用socket创建的套接字默认的属性是主动的
#使用listen将其变为被动的,这样就可以接收别人的链接了
# 创建接收
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
client_socket, clientAddr = tcp_server.accept()
# client_socket用来为这个客户端服务,相当于的tcp_server套接字的代理
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# 这里clientAddr存放的就是连接服务器的客户端地址
while True:
#接收对方发送过来的数据
from_client_msg = client_socket.recv(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)+" 服务端:客户端你好,服务器端收到!").encode("gbk"))
#关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
client_socket.close()