python利用socket实现客户端和服务端之间进行通信

目录
  • 一、socket
    • socket通信的条件:IP和端口
    • 形象比喻
  • 二、客户端实现过程
  • 三、服务器实现过程
  • 四、演示
  • 五、实现持续通信过程

前言:

今天教大家通过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()

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

服务端返回的内容:

当前系统时间+服务端:客户端你好,服务器端收到

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

到此这篇关于python利用socket实现客户端和服务端之间进行通信 的文章就介绍到这了,更多相关python主机通信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Websocket服务端通信的使用示例

    1.唠唠叨叨 最近又回顾了下Websocket,发现已经忘的七七八八了.于是用js写了客户端,用python写了服务端,来复习一下这方面的知识. WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大.另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一

  • Python实现socket库网络通信套接字

    Socket 套接字:通讯端点 简介 socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). Socket 是任何一种计算机网络通讯中最基础的内容.Socket通讯一般用户C/S结构系统的网络通讯. Socket 网络通讯是基于TCP(传输控制协议)或UDP(用户数据报协议)两种协议

  • Python基于socket实现TCP/IP客户和服务器通信

    前言 套接字除了用于分析网络地址等功能之外,还可以配置一个服务器,监听到来的消息. 比如你在网络上跟网络机器人聊天,你发送数据到机器人(服务器),然后机器人(服务器)反馈聊天数据信息给你. 当然,机器人的回复内容可能还涉及机器学习,但简单的消息反馈涉及的就是套接字的知识. 简单的搭建服务器与客户端 既然已经了解了套接字的应用.下面,我们来实现一个简单的单向通信TCP/IP服务器与客户端. 服务器 服务器的原理如下: 首先创建一个套接字,TCP是面向流的套接字.故需要使用SOCK_STREAM 然

  • python实现socket简单通信的示例代码

    首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解. socket是在应用层与传输层之间的一个抽象层,它的本质是编程接口,通过socket,才能实现TCP/IP协议. 它就是一个底层套件,用来处理最底层消息的接受和发送. socket翻译为套接字,可以把TCP/IP复杂的操作抽象为简单的几个接口来供应用层调用来实现进程在网络中的通信.socket起源于Unix,而Unix的基本要素之一就是"一切都为文件",即可以通过打开--

  • Python实现Socket通信建立TCP反向连接

    目录 前言 远程控制 脚本编写 脚本优化 getopt () 完整代码 前言 本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机远程控制的目的. 我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如 HTTP.FTP.TELNET 等,也可以自己定义应用层协议.而 Socket 是对 TCP/IP 协议的封装,Socke

  • Python基础之Socket通信原理

    上图是socket网络编程的流程图 至于数据在网络中是怎么走的,咱先不说,那个太底层了,咱今天见就说如何将数据从咱的屏幕上放到网络流中去. 这可不是键盘敲敲,回车一按的事情,在这背后,那也是百转千回. 打开一个网络接口:套接字 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. Python 中,我们用 socket()函数来创建套接字,语法格式如下: import socket # 居然

  • python利用socket实现客户端和服务端之间进行通信

    目录 一.socket socket通信的条件:IP和端口 形象比喻 二.客户端实现过程 三.服务器实现过程 四.演示 五.实现持续通信过程 前言: 今天教大家通过Python进行Socket网络编程(做一个聊天程序),可以实现在不同的主机(电脑)之间进行通话. 具体效果如何,接着往下看: 可以看到客户端(上方)向服务器端(下方)发送了内容,服务器端进行了回复 [备注:客户端是我的本机,服务器是另一条主机(阿里云服务器)] 两台主机的目的:验证两台主机可以相互通信 一.socket 先简单给大家

  • python Socket之客户端和服务端握手详解

    简单的学习下利用socket来建立客户端和服务端之间的连接并且发送数据 1. 客户端socketClient.py代码 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('127.0.0.1', 9999)) # 接收欢迎消息: print(s.recv(1024).decode('utf-8')) for data in [b'Michael', b'Tracy', b'

  • 基于node的tcp客户端和服务端的简单通信

    目录 1.简单介绍下TCP/IP 2.服务端编程 监听客户端连接 接收数据和发送数据 3.客户端编程 4.一个小的登录系统 1.简单介绍下TCP/IP TCP/IP是互联网相关协议的集合,分为以下四层:应用层.传输层.网络层.数据链路层. 分成四层的好处是,假如只有一层,某个地方需要改变设计时,就必须把所有整体替换掉,而分层之后只需把变动的层替换掉即可. 2. 服务端编程 node提供了net模块来实现tcp编程.主要分为服务端编程和客户端编程两部分,先来写服务端的: 监听客户端连接 先引入ne

  • 用PHP的socket实现客户端到服务端的通信实例详解

    一.server.php服务端: <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'localhost'; //设置用111端口进行通信 $port = 111; //创建SOCKET if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket创建失败原因 &q

  • PHP基于socket实现客户端和服务端通讯功能

    本文主要介绍了PHP基于socket实现的简单客户端和服务端通讯功能,可实现服务端接收客户端发送的字符串进行翻转操作后返回客户端的功能,需要的朋友可以参考下 服务端: <?php set_time_limit(0); $host="localhost"; $port=1001; //创建一个连接 $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socket\n");

  • python网络编程示例(客户端与服务端)

    client客户端 复制代码 代码如下: if __name__ == '__main__':       import socket       import os    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)       sock.connect(('localhost', 8001))       import time       time.sleep(2)       sock.send('1')       p

  • Socket结合线程池使用实现客户端和服务端通信demo

    目录 引导语 1.要求 2.客户端代码 3.服务端代码 3.1.对客户端请求进行控制 3.2.服务端任务的处理逻辑 4.测试 5.总结 引导语 Socket 面试最终题一般都是让你写一个简单的客户端和服务端通信的例子,本文就带大家一起来写这个 demo. 1.要求 可以使用 Socket 和 ServiceSocket 以及其它 API: 写一个客户端和服务端之间 TCP 通信的例子: 服务端处理任务需要异步处理: 因为服务端处理能力很弱,只能同时处理 5 个请求,当第六个请求到达服务器时,需要

  • Python基于socket实现TCP客户端和服务端

    目录 一.基于socket实现的TCP客户端 二.基于socket实现的TCP服务端 一.基于socket实现的TCP客户端 import socket   # 建立socket对象 # 参数一表示IP地址类型(AF_INET为IPV4,AF_INET6为IPV6),参数二表示连接的类型(SOCK_STREAM表示TCP形式,SOCK_DGRAM表示UDP形式) client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 代

  • Python警察与小偷的实现之一客户端与服务端通信实例

    本文实例讲述了Python警察与小偷的实现之一客户端与服务端通信,分享给大家供大家参考.具体方法分析如下: 该实例来源于ISCC 2012 破解关第四题 目的是通过逆向police,实现一个thief,能够与police进行通信 实际上就是一个RSA加密通信的例子,我们通过自己编写客户端和服务端来实现上面的thief和police的功能. 要通信,这们这次先通过python写出可以进行网络连接的客户端与服务端. 服务端代码如下: #!/usr/bin/env python import Sock

  • Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例

    本文实例讲述了Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能.分享给大家供大家参考,具体如下: 由于目前工作的需要,需要在IPv4和IPv6两种网络模式下TCP和UDP的连接,要做到客户端发包,服务端收包. 前几天写了代码,但是把UDP的客户端和服务端使用TCP模式的代码了.今天在公司使用该工具的时候,发现了问题,忘记了UDP不需要验证.疏忽,疏忽.不过刚刚接触编程,可以原谅. 现在在家,已经把代码改好了.经测试可以使用. 先运行客户端: python Mini

随机推荐