zoukankan      html  css  js  c++  java
  • python实现一个客户端与服务端的通信

    函数介绍

    Socket对象方法:
    服务端:

    函数 描述
    .bind() 绑定地址关键字,AF_INET下以元组的形式表示地址。常用bind((host,port))
    .listen() 监听TCP,可以挂起的最大连接数,该值至少为1,一般设为5即可
    .accept() 被动接受TCP客户端的连接

    客户端:

    函数 描述
    .connect() 初始化服务器连接
    .connect_ex() 是对connect()函数的扩展,当出错时返回出错码,不报异常

    其它函数:

    函数 描述
    .recv() 接收数据,数据以字符串的形式返回,bufsize指定接收的最大数据量。
    .send() 发送数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量,通常使用.encode()函数对数据进行转码
    .senddall() 发送完整的数据,在返回之前会尝试发送所有数据,成功返回None,失败则抛出异常。
    .recvfrom() 与recv()函数类似,不同的是返回值是(data,address),其中data是包含接收数据的字符串,address是发送数据的套接字地址。
    .sendto() 发送UDP数据,将数据发送到套接字,形式是(ipaddr,port)的元组。
    .close() 关闭套接字

    服务端

    使用socket函数来创建一个socket对象,并设置一个socket服务,然后通过bind(hostname,port)函数来指定一个端口,使用socket对象的accept方法,等待客户端的连接,并返回connection对象。
    具体步骤为:

    创建服务端套接字
    serversocket=socket()
    把地址绑定到套接字
    serversocket.bind()
    对连接进行监听
    serversocket.listen()
    使用一个while进行循环,并接收客户端的连接
    while True:
      serverclient=serversocket.accept()
      while True:
         #接收已发送
         serverclient.recv()
         serverclient.send()
         #关闭客户端套接字
         serverclient.close()
    关闭服务端套接字
    serversocket.close()
    

    具体代码实现:

    import socket
    import sys
    import time
    
    serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host=socket.gethostname()#获取本地主机名
    port=9999
    #绑定端口号
    serversocket.bind((host,port))
    
    #设置最大连接数
    serversocket.listen(5)
    while True:
        print('服务器启动,监听客户端链接')
        clientsocket,addr=serversocket.accept()
        print('链接地址:%s' % str(addr))
        while True:
            try:
                data=clientsocket.recv(1024)
            except Exception:
                print('断开的客户端:',addr)
                break
            print('客户端发送内容:',data.decode('utf-8'))
            reply=input('回复:').strip()
            if not reply:
                break
            msg=time.strftime('%Y-%m-%d %X')#获取结构化时间戳
            msg1='[%s]:%s'% (msg,reply)
            clientsocket.send(msg1.encode('utf-8'))
        clientsocket.close()
    serversocket.closel()
    

    实现功能:通过while实现循环接收客户端发送的数据,并对客户端发送的数据进行显示并返回给客户端数据,返回给客户端的数据信息后加入时间戳。

    客户端

    创建一个客户端用来连接以上服务的的服务,使用socket.connect()方法打开一个TCP连接到主机,连接后可以从服务端获取数据,在操作完成后关闭连接。 具体步骤为: ``` 创建客户端的套接字 client=socket() 尝试连接服务器 client.connect() 发送并接收数据 client.send() client.recv() 关闭客户端套接字 client.close() ``` **具体代码实现:** ``` import socket import sys

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host=socket.gethostname()
    port=9999
    s.connect((host,port))
    while True:
    data= input('>>').strip()
    if not data:
    break
    s.send(data.encode('utf-8'))
    msg=s.recv(1024)
    if not msg:
    break
    print(msg.decode('utf-8'))
    s.close()

    ###测试###
    使用cmd命令行中打开到代码所在文件目录,执行python 服务端文件名.py,再另打开一个cmd命令界面执行  python 客户端文件名.py
    在pycharm中运行服务端代码,运行结果:
    
    ![](https://img2018.cnblogs.com/blog/989555/202002/989555-20200209134606487-1326198410.png)
    
    在cmd中运行客户端代码,运行结果:
    
    ![](https://img2018.cnblogs.com/blog/989555/202002/989555-20200209132403132-1188987226.png)
    </font>
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/supershuai/p/12286933.html
Copyright © 2011-2022 走看看