大家好,我是辰哥~

今天教大家通过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
tcp_socket.connect((serve_ip,serve_port)) # 连接服务器,建立连接,参数是元组形式

首先与服务器接收端(主机B)建立连接,连接条件(主机B的ip和端口),这里的端口8000是指将数据发送到主机B的端口(主机B到时候会监听8000端口,然后进行接收数据)

#准备需要传送的数据
send_data = "今天是2021年08月29日,辰哥给服务器端发送数据了"
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()

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 = client_socket.recv(1024)#接收1024给字节,这里recv接收的不再是元组,区别UDP
print("接收的数据:",from_client_msg.encode("gbk"))
#发送数据给客户端
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(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()

服务端


while(1):
#接收对方发送过来的数据
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)+" 服务端:客户端你好,服务器端收到,公众号【Python研究者】").encode("gbk"))
#关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
client_socket.close()

客户端可以持续给服务端发送数据,服务器接收数据后打印并返回数据给客户端

服务端返回的内容:

当前系统时间+服务端:客户端你好,服务器端收到,公众号【Python研究者】

最后当客户端输入:exit,则断开与服务端的连接

python实现两台不同主机之间进行通信(客户端和服务端)——Socket的更多相关文章

  1. 两台Linux主机之间文件的复制

    使用scp命令可以实现两台Linux主机之间的文件复制,基本格式是: scp [可选参数] file_source file_target 1. 复制文件 命令格式: scp local_file r ...

  2. 两台Linux机之间传送文件

    最近实验室里接管了一台服务器,经常需要用到服务器与自己主机之间进行文件传输,因此,在此介绍一下两台Linux主机之间的一些操作,方便后来者. 1. Linux.Windows主机远程访问Linux服务 ...

  3. 两台Linux主机互传文件可以使用SCP命令来实现

    当两台linux主机之间要互传文件时可使用SCP命令来实现 复制文件: (1)将本地文件拷贝到远程 scp 文件名 --用户名@计算机IP或者计算机名称:远程路径 (2)从远程将文件拷回本地 scp ...

  4. Python_架构、同一台电脑上两个py文件通信、两台电脑如何通信、几十台电脑如何通信、更多电脑之间的通信、库、端口号

    1.架构 C/S架构(鼻祖) C:client  客户端 S:server  服务器 早期使用的一种架构,目前的各种app使用的就是这种架构,它的表现形式就是拥有专门的app. B/S架构(隶属于C/ ...

  5. 两台linux服务器之间实现挂载

    https://blog.csdn.net/lpp_dd/article/details/78743862 两台linux服务器之间实现挂载: 服务端: 1.首先需要在主机上设置允许挂载的目录 (1) ...

  6. 多台linux主机之间建立免密通信

    多台linux主机之间设置免密通信 例:A 向 B设置免密通信 第一步 A生成密钥对 ssh-keygen -t rsa -t 指定秘钥的类型 rsa 秘钥类型 密钥目录:/root/.ssh/(如果 ...

  7. 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件

    两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...

  8. 两台Linux系统之间传输文件的几种方法

    两台Linux系统之间传输文件的几种方法:参考https://www.cnblogs.com/bignode/articles/9241333.html

  9. linu SSH 不在同一网段的两台机器如何通过ssh通信,SSH限制特定网段登陆的方法

    1. linu SSH 不在同一网段的两台机器如何通过ssh通信 https://blog.csdn.net/lhf19891003/article/details/39895763 https:// ...

随机推荐

  1. CRUD搬砖两三年了,怎么阅读Spring源码?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! ‍连读同事写的代码都费劲,还读Spring? 咋的,Spring 很难读! 这个与我们码农朝夕 ...

  2. Debian9 无线网卡驱动安装

    https://wiki.debian.org/iwlwifi sudo vi /etc/apt/sources.list --------- ..... deb http://httpredir.d ...

  3. Linux 安装 Nodejs 的两种方式

    Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...

  4. P3312 数表

    P3312 数表 题意 求出 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(\gcd(i,j))[\sigma(\gcd(i,j))\le a] \] 其中 \(\sigma\) ...

  5. PostgreSQL数据库结构

    PG数据存储结构分为:逻辑结构和物理存储. 一.逻辑存储结构是:内部的组织和管理数据的方式[逻辑存储结构适用于不同的操作系统和硬件平台] 二.物理存储结构是:操作系统中组织和管理数据的方式. 1.逻辑 ...

  6. solr(CVE-2019-0193)远程命令执行

    影响版本 Apache Solr < 8.2.0 并且开启了DataImportHandler模块(默认情况下该模块不被启用) 安装 重启daoker  更新配置文件 systemctl dae ...

  7. 创建函数function

    1.创建普通函数 function 函数名称(){ 函数体://封装的代码 } 函数名称()://调用函数 function getSum(){ for(var i=1,sum=0;i<=100 ...

  8. OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Solon 1.5.22 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  10. 做了两年多的安卓,突然想转Java后端,感觉Android职业前景不太好,转还是不转?

    近几年相信很多Android开发者都有过这种想法,最终还是有些Android 开发选择了转行,但是还有些开发者选择了坚持. 因为现在Android开发确实竞争很大,很多公司抛出几个岗位,每天能收到成百 ...