大家好,我是辰哥~

今天教大家通过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)的实现过程

  1. from socket import *
  2. # 1.创建套接字
  3. tcp_socket = socket(AF_INET,SOCK_STREAM)
  4. # 2.准备连接服务器,建立连接
  5. serve_ip = "服务器端(主机B)的IP"
  6. serve_port = 8000 #端口,比如8000
  7. tcp_socket.connect((serve_ip,serve_port)) # 连接服务器,建立连接,参数是元组形式

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

  1. #准备需要传送的数据
  2. send_data = "今天是2021年08月29日,辰哥给服务器端发送数据了"
  3. tcp_socket.send(send_data.encode("gbk"))
  4. #从服务器接收数据
  5. #注意这个1024byte,大小根据需求自己设置
  6. from_server_msg = tcp_socket.recv(1024)
  7. #加上.decode("gbk")可以解决乱码
  8. print(from_server_msg.decode("gbk"))
  9. #关闭连接
  10. tcp_socket.close()

send_data是往服务器端(主机B)发送的内容,from_server_msg是服务器端(主机B)往客户端(主机A)发送的内容

客户端的代码就结束了

服务器实现过程

分析服务器端(主机B)的实现过程

  1. from socket import *
  2. #创建套接字
  3. tcp_server = socket(AF_INET,SOCK_STREAM)
  4. #绑定ip,port
  5. #这里ip默认本机
  6. address = ('',8000)
  7. tcp_server.bind(address)
  8. # 启动被动连接
  9. #多少个客户端可以连接
  10. tcp_server.listen(128)
  11. #使用socket创建的套接字默认的属性是主动的
  12. #使用listen将其变为被动的,这样就可以接收别人的链接了

服务器端(主机B)ip可以留空(默认本机),端口8000(因为客户端往8000端口发送数据,所以服务器需要监听的端口也是8000,与客户端的端口一致)

  1. # 创建接收
  2. # 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
  3. client_socket, clientAddr = tcp_server.accept()
  1. client_socket用来为这个客户端服务,相当于的tcp_server套接字的代理
  2. tcp_server_socket就可以省下来专门等待其他新客户端的链接
  3. 这里clientAddr存放的就是连接服务器的客户端地址
  4. #接收对方发送过来的数据
  5. from_client_msg = client_socket.recv(1024)#接收1024给字节,这里recv接收的不再是元组,区别UDP
  6. print("接收的数据:",from_client_msg.encode("gbk"))
  7. #发送数据给客户端
  8. send_data = client_socket.send("客户端你好,服务器端收到,公众号【Python研究者】".encode("gbk"))
  9. #关闭套接字
  10. #关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
  11. #如果还需要服务,只能再次重新连
  12. client_socket.close()

from_client_msgs 是服务器端(主机B)接收到来自客户端(主机A)发送过来的数据send_data 是服务器端(主机B)往客户端(主机A)发送过去的数据

服务器端的代码就结束了

提醒:服务器端的8000端口需要开启,不然无法进行通信

演示

先启动(执行)服务器端(主机B)的程序,再执行客户端(主机A)

可以看到客户端(上方)向服务器端(下方)发送了内容,服务器端进行了回复

发送和响应内容:

客户端发送:今天是2021年08月29日,辰哥给服务器端发送数据了

服务器端接收并回复给客户端:客户端你好,服务器端收到,公众号【Python研究者】

实现持续通信过程

上方动图演示的是客户端和服务端的一次通信过程,可以将客户端的发送和服务端的接收放到循环中,实现持续通信过程。

客户端

  1. while(1):
  2. send_data = input("请输入内容:")
  3. #send_data = "今天是2021年08月29日,辰哥给服务器端发送数据了"
  4. tcp_socket.send(send_data.encode("gbk"))
  5. if send_data == "exit":
  6. break;
  7. #从服务器接收数据
  8. #注意这个1024byte,大小根据需求自己设置
  9. from_server_msg = tcp_socket.recv(1024)
  10. #加上.decode("gbk")可以解决乱码
  11. print(from_server_msg.decode("gbk"))
  12. #关闭连接
  13. tcp_socket.close()

服务端


  1. while(1):
  2. #接收对方发送过来的数据
  3. from_client_msg = client_socket.recv(1024)#接收1024给字节,这里recv接收的不再是元组,区别UDP
  4. if(from_client_msg=="exit"):
  5. break
  6. print("接收的数据:",from_client_msg.decode("gbk"))
  7. now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
  8. #发送数据给客户端
  9. send_data = client_socket.send((str(now_time)+" 服务端:客户端你好,服务器端收到,公众号【Python研究者】").encode("gbk"))
  10. #关闭套接字
  11. #关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
  12. #如果还需要服务,只能再次重新连
  13. 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. Java 使用新方法打印Word文档

    前言 我曾写过一篇文章,它主要介绍了如何通过物理打印机和虚拟打印机来打印Word文档.今天这篇教程将介绍一种新的方法来实现对Word文档的打印. 此次使用到的类库仍然是Spire.Doc for Ja ...

  2. CF1032G Chattering

    CF1032G Chattering 题意 思路 对于每一个位置,它转移的范围是确定的. 对于一段可以走到的区间,我们可以求出区间中所有点再能走到区间范围. 于是这个就可以倍增进行转移. 如何快速求出 ...

  3. 第一篇 -- Go环境的搭建以及Hello World程序编写

    VS Code的下载和安装 1. 下载链接(本人下载版本VSCodeUserSetup-x64-1.57.0.exe) https://code.visualstudio.com/download 友 ...

  4. 第二十八篇 -- 写一个简陋的WIFI服务器界面

    效果图: Dlg.cpp // WIFIWMITestDlg.cpp : implementation file // #include "stdafx.h" #include & ...

  5. 前端构建第1篇之---引入elementUI

    张艳涛 写于2021-1-19 HOW:如何引入elementui? 在项目根目录package.json引入,在重新执行npm install "dependencies": { ...

  6. PHP 后台数组数据 传输给前台JS 使用

    一. PHP: $a = array('aaa','bbb'); $a= json_encode($a); JS: var a_json = {$a};   //此处a_json数组便可使用 二. H ...

  7. Apollo mqtt 服务器搭建

    html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...

  8. DevOps基础的认识与工具实践

    什么是DevOps DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快.更频繁地交付更稳定的软件 Devops 包含了敏捷开发,测试,运维 DevO ...

  9. TypeScript学习笔记(三)泛型、模块化和命名空间

    目录 一.泛型 1. 泛型函数 2. 泛型类 3. 泛型接口 写法一 写法二 两种写法的区别 二.模块化 1. export写法一 2. export写法二 3. 为引入的方法或变量起别名 4. ex ...

  10. 工具idea 基于maven 创建springMVC项目

    SpringMVC Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一般不 ...