python 进行socket 通信

python 进行socket 通信

socket是应用层于TCP/IP协议族通信的中间软件抽象层,它是一组接口。Socket组织数据,以求符合指定的协议。

基于TCP协议的Socket(基于连接的通信)

server端(服务器端)

import socket
sk = socket.socket()                         # 括号内默认不加参数就是进行TCP连接
sk.bind(('127.0.0.1',8898))               #把地址绑定到套接字
sk.listen()                                        #监听链接
conn,addr = sk.accept()                 #接受客户端链接
ret = conn.recv(1024)                   #接收客户端信息
print(ret)                                       #打印客户端信息
conn.send(ret.upper)                  #向客户端发送信息
conn.close()                               #关闭客户端套接字
sk.close()                                  #关闭服务器套接字(可选)

client端(客户端)

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字

这样子就可以简单地建立通信了,这时候在客户端向服务端发送消息,服务端就会返回客户端消息的大写,返回到客户端,并且进行打印。
虽然这样子是建立了连接,但是这时候存在一个缺点,就是只能够一个服务端对应一个客户端,这样子是非常的不理想。这时候就需要使用到多线程或者多进程来提高效率了。

改进版

服务端

import socket
from threading import Thread


def connect(conn):
    while True:
        ret = conn.recv(1024)  # 接收客户端信息 (二进制数据)
        # print(ret.decode('utf-8').upper()) # 打印客户端信息,并且转换为大写输出(监听客户端的信息)
        conn.send(ret)  # 向客户端发送信息


sk = socket.socket()
sk.bind(('127.0.0.1', 8898))  # 把地址绑定到套接字
sk.listen(2)  # 监听链接
while True:
    conn, addr = sk.accept()  # 接受客户端链接
    t = Thread(target=connect, args=(conn,))
    t.start()
    print("接通连接")

conn.close()  # 关闭客户端套接字
sk.close()  # 关闭服务器套接字(可选)

客户端

import socket

sk = socket.socket()  # 创建客户套接字 括号内不加参数默认就是tcp协议
sk.connect(('127.0.0.1', 8898))  # 尝试连接服务器
while True:
    try:
        sk.send(b'hello!')   # 服务端接收到的只是二进制的数据
        ret = sk.recv(1024)  # 对话(发送/接收)
        print(ret.decode('utf-8'))
    except Exception as e:
        print("fail:",e)
        break

sk.close()  # 关闭客户套接字
print("关闭连接")

这样子就可以实现多个客户端同时连接在一个服务器上了,这样子在应用上提高了很大的效率。

基于UDP协议的Socket(不基于连接的通信)

服务端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #创建一个服务器的套接字(UDP连接)
udp_sk.bind(('127.0.0.1',9000))        #绑定服务器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr)                 # 对话(接收与发送)
udp_sk.close()                         # 关闭服务器套接字

客户端

import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115137.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ioctl+FIONREAD判断文件可读

    ioctl+FIONREAD判断文件可读linux下判断一个文件描述符是否可读可用ioctl,参数FIONREAD,包含头文件unistd.hwindows下有个类似的ioctlsocket,实现了ioctl的部分功能,也可以实现同样的功能。https://blog.csdn.net/tgdzsjh/article/details/17142949https://blog.csdn.net/wy_kath/article/d…

    2022年7月23日
    22
  • 写给大忙人看的 – Java中上传文件MinIO服务器(2)

    写给大忙人看的 – Java中上传文件MinIO服务器(2)上一篇写给大忙人看的-搭建文件服务器MinIO(一),我们已经成功地搭建了MinIO文件服务器,这一篇讲解在Java中如何上传文件至MinIO一、开发前戏1、项目中引入maven依赖<!–minio相关依赖–><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version

    2022年6月1日
    58
  • <node>……express的中间件……//[通俗易懂]

    <node>……express的中间件……//[通俗易懂]<node>……express的中间件……//

    2022年4月21日
    46
  • drupal安装详解

    drupal安装详解drupal是一个非常优秀的cms开源框架,其实安装是非常简单的,和其他的php安装程序没什么大的不同。。。我使用的wamp集成环境,现在我想安装drupal中文版的,所以现在我要去下载drupal和中文汉化文件。。。1.到http://drupal.org/project/drupal下载drupal,到http://localize.drupal.org/translate/langu…

    2022年7月20日
    22
  • 面试java工程师的自我介绍_软件开发和程序员一样吗

    面试java工程师的自我介绍_软件开发和程序员一样吗程序员面试时一段短短的自我介绍,其实是为了揭开更深入的面谈而设计的。下面学习啦小编为你带来java程序员面试自我介绍范文的内容,希望你们喜欢。关于java程序员面试自我介绍范文篇一本人叫小冰,今年22岁,现在是吉林大学软件开发与信息管理专业方向的三年级学生,对软件开发怀有浓烈的兴趣,且对JAVA语言尤其熟悉,能熟练使用jsp、struts、struts2、sring2和hibernate3等流行的…

    2025年6月28日
    5
  • 人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)

    人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)摘要:这篇博文介绍基于深度卷积神经网络实现的人脸表情识别系统,系统程序由Keras,OpenCv,PyQt5的库实现,训练测试集采用fer2013表情库。如图系统可通过摄像头获取实时画面并识别其中的人脸表情,也可以通过读取图片识别,本文提供完整的程序文件并详细介绍其实现过程。博文要点如下:表情识别数据集、搭建表情识别的模型、数据增强的批量训练、系统UI界面的实现。点击跳转至博文涉及的全部文件下载页。

    2022年4月29日
    192

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号