Python——TCP客户端和服务端开发 学习笔记_Vone_66的博客-程序员宅基地

技术标签: 网络  学习笔记  socket  

TCP客户端和服务端开发

在这里插入图片描述

TCP客户端开发

import socket
if __name__ == '__main__':
    # 1. 创建tcp客户端套接字
    # AF_INET: ipv4地址类型    SCOK_STREAM:tcp传输协议类型
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 和服务端套接字建立连接
    tcp_client_socket.connect(("192.168.1.207", 9090))

    send_connect = "你好,我是技术茭白"  # input()
    # 对字符串进行编码成为二进制数据
    # windows 里面的网络协调助手使用的gbk编码     Linux使用utf-8
    send_data = send_connect.encode("gbk")

    # 3. 发送数据到服务器端
    tcp_client_socket.send(send_data)

    # 4. 接收服务端的数据
    # 1024: 表示每次接受的最大字节数
    recv_data = tcp_client_socket.recv(1024)
    # 对二进制数据进行解码
    recv_content = recv_data.decode("gbk")
    print("接受服务端的数据为:", recv_content)

    # 5. 关闭套接字
    tcp_client_socket.close()

TCP服务端开发

import socket

if __name__ == '__main__':

    # 1. 创建tcp服务端套接字
    # AF_INET: ipv4地址类型    SCOK_STREAM:tcp传输协议类型
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用 (端口号退出后立即释放)
    # SO_LINGER: 表示当前套接字    SO_REUSEADDR: 表示复用端口号的选项    True:表示确定复用
    tcp_server_socket.setsockopt(socket.SO_LINGER, socket.SO_REUSEADDR, True)
    # 2. 绑定端口号
    tcp_server_socket.bind(("", 9090))
    # 3. 设置监听
    # 128: 表示最大等待建立连接的个数
    tcp_server_socket.listen(128)

    # 循环等待客户请求连接
    while True:
        # 4. 等待接收客户端的连接请求
        # 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字
        # tcp_server_socket 只负责等待接收客户端的连接请求,收发消息不使用这套接字
        news_client, ip_port = tcp_server_socket.accept()
        # 代买执行到此说明客户端与服务端建立连接成功
        print("客户端的IP和端口号为:", ip_port)

        # 5. 接收客户端的数据
        # 收到信息都使用返回的这个新套接字  1024: 表示每次最多接收1024个字节
        recv_data = news_client.recv(1024)
        # 对接收的二进制数据进行解码变成字符串
        recv_content = recv_data.decode("gdk")
        send_content = "问题正在处理中...."
        # 对字符串进行编码
        send_data = send_content.encode("gbk")

        # 6. 发送数据到客户端
        news_client.send(send_data)
        # 关闭服务端与客户端套接字,表示与客户端终止通信
        news_client.close()
        
    # 7. 关闭套接字
    # tcp_server_socket.close() 	# 服务端需一直服务,无需关闭

多任务TCP服务端开发

import socket
import threading


def handle_client_request(ip_port, news_client):
    """
    处理客户端请求任务
    :return:
    """
    print("客户端的IP和端口号为:", ip_port)
    # 循环接收客户端消息
    while True:
        # 5. 接收客户端的数据
        # 收到信息都使用返回的这个新套接字  1024: 表示每次最多接收1024个字节
        recv_data = news_client.recv(1024)
        if recv_data:
            print("接收的数据长度是:", len(recv_data))
            # 对接收的二进制数据进行解码变成字符串
            recv_content = recv_data.decode("gdk")
            print("客户端发送的数据为:", recv_content, "\t用户:", ip_port)
            send_content = "问题正在处理中...."
            # 对字符串进行编码
            send_data = send_content.encode("gbk")

            # 6. 发送数据到客户端
            news_client.send(send_data)
        else:
            # 客户端关闭连接
            print("客户端: ", ip_port, "已下线")
            break
    # 关闭服务端与客户端套接字,表示与客户端终止通信
    news_client.close()


if __name__ == '__main__':

    # 1. 创建tcp服务端套接字
    # AF_INET: ipv4地址类型    SCOK_STREAM:tcp传输协议类型
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用 (端口号退出后立即释放)
    # SO_LINGER: 表示当前套接字    SO_REUSEADDR: 表示复用端口号的选项    True:表示确定复用
    tcp_server_socket.setsockopt(socket.SO_LINGER, socket.SO_REUSEADDR, True)
    # 2. 绑定端口号
    tcp_server_socket.bind(("", 9090))
    # 3. 设置监听
    # 128: 表示最大等待建立连接的个数
    tcp_server_socket.listen(128)

    # 循环等待客户请求连接
    while True:
        # 4. 等待接收客户端的连接请求
        # 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字
        # tcp_server_socket 只负责等待接收客户端的连接请求,收发消息不使用这套接字
        news_client, ip_port = tcp_server_socket.accept()
        # 代买执行到此说明客户端与服务端建立连接成功
        # 当客户端和服务端建立成功,创建子线程。让子线程负责接受客户端消息
        sub_thread = threading.Thread(target=handle_client_request, args=(ip_port, news_client))
        # 设置守护主线程,主线程退出子线程直接销毁
        sub_thread.setDaemon(True)
        # 启动线程
        sub_thread.start()

    # 7. 关闭套接字 
    # tcp_server_socket.close()  # 服务端需一直服务,无需关闭
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Vone_66/article/details/107843474

智能推荐

node moment 格式化日期_sun-程序员宅基地_node 格式化时间

参考http://momentjs.com/docs/#/use-it/1 安装npm install moment2 创建当前时间let createTime = moment().format('YYYY-MM-DD HH:mm:ss');

Cstring使用问题和struct结构体初始化方法汇总_mmdev-程序员宅基地

今天在写程序为cstringarray变量操作时遇见:ASSERT_VALIDfailswithillegalvtablepointer.AssertionFailed:<unknownapplication>:Filearray_s.cpp,Line236这两个问题,几经查找、询问才知道是定义的结构体中的cstringarray虚拟表出错。仔细看程序时才发现,我申请的...

linux的系统文件位置,剖析Linux系统中的文件系统路径_冬瓜Don的博客-程序员宅基地

1、Linux文件系统是从/开始的;在Linux操作系统的文件管理中,命令行模式(在控制台或终端下)的文件或目录管理,要涉及路径这一概念,这是Linux命令行操作的最基础的基础。如果我们了解了路径的概念,就可以随心所欲的进入任何目录,进行我们想的工作。Linux 文件系统,是一个呈树形结构,是从/做为入口,/(也被称为根目录)下有子目录,比如etc、usr、lib等,在每个子目录下又有文件或子目录...

Android Layout 之 RelativeLayout,代码实现相对布局&android的button设置透明_rong_wz的专栏-程序员宅基地

使用 AbsoluteLayout 可以直接指定其子 View 的绝对位置, 这种布局方式虽然简单,但是不够灵活。比如在一个程序中,按钮2 位于 按钮1 的下方且和 按钮1 左对齐,我们可以使用指定两个按钮的绝对位置的方式布局,但是当布局完成后,由于某些原因,这两个按钮需要相左平移一些距离以便在父 View 右边留出一些空白区域,那么我们就需要同时修改 按钮1 和 按钮2 的 layout p

【CentOS7】Samba服务器的安装_野生Java小菜鸟的博客-程序员宅基地

Samba服务器可以让手机、电脑、平板等等所有网络设备都能实现数据共享。简单来说,就是很香!看一下百度的Samba的简单释义Samba简介:Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他

随便推点

蓝桥算法训练 4-1打印下述图形 JAVA_高瑜的博客-程序员宅基地

使用循环结构打印下述图形,打印行数n由用户输入。打印空格时使用"%s"格式,向printf函数传递只包含一个或多个空格的字符串" ",下同。样例输入5样例输出 * *** ***** ****************思路:控制每一层后,空格位置一块, 的位置一块,的规律是1 3 5 7 9所有就是i2-1* public static void main(Stri...

石大远程在线考试计算机网络课程设计,20202021石大远程在线考试——《计算机网络课程设计》在线考试主观题参考资料答案.docx..._BugMarker的博客-程序员宅基地

中国石油大学 ( 北京 ) 远程教育学院《计算机网络课程设计》大作业说明目的 : 本大作业的目的就是希望同学们学以致用 , 能够将课程上教授的理论内容在自己的工作生活实践中加以印证 , 理解计算机网络设计的基本内容即可。方法 : 同学们可以结合自己的工作生活实际情况 , 观察所在单位 ( 或家庭、网吧等有网络规划的地方 ) 的网络设计情况。具体内容有 :1 、要搞清楚所观察对象 ( 单位、家庭或网...

scala的模式匹配_汉子一枚-程序员宅基地

模式匹配scala中有一个非常强大的模式匹配机制,可以应用在很多场景:switch语句类型查询使用模式匹配快速获取数据简单模式匹配在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。语法格式变量 match {case “常量1” => 表达式1case “常量2” => 表达式2case “常量3” =&g...

npm start 时 报4 verbose stack Error: missing script: start这个错误_feimenglu的博客-程序员宅基地

0 info it worked if it ends with ok1 verbose cli [ 'D:\\nodejs\\node.exe',1 verbose cli 'D:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',1 verbose cli 'start' ]2 info using [email protected] info us...

发布网站tomcat服务器错误,'在本地主机上发布到Tomcatv8.0服务器'失败,出现多个错误('Publishing to Tomcatv8.0 Server at localhost' fai..._大奇鸭的博客-程序员宅基地

'在本地主机上发布到Tomcatv8.0服务器'失败,出现多个错误('Publishing to Tomcatv8.0 Server at localhost' failed with multiple errors)我是JSP Servlet新手,并且在Tomcat服务器v8.0上的JSP Servlet项目中遇到以下错误发布多个错误失败错误读取文件/Users/vnmaniyar/Docume...

推荐文章

热门文章

相关标签