美文网首页
day31 基于TCP的套接字

day31 基于TCP的套接字

作者: 天行_b6d0 | 来源:发表于2020-08-19 16:19 被阅读0次

一、基于tcp协议实现简单套接字通信

TCP是基于链接的,必须先启动服务端,再去启动客户端去连接服务器。

可以把服务端和客户端之间的通信看成用老式手机通信的过程。

tcp服务端:

# server.py
import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、插手机卡
phone.bind(("127.0.0.1", 8080))  # 本地回环

# 3、开机
phone.listen(5)  # 半连接池,即允许等待的链接的最大个数
print('starting %s:%s' %("127.0.0.1", 8080))

# 4、等电话链接
conn, client_addr = phone.accept()

# 5、收/发消息
data = conn.recv(1024)  # 最大接收的字节个数
print("收到的客户端数据:", data.decode('utf-8'))
conn.send(data.upper())  # 这里默认是将接收的数据大写返回,也可以在定义返回信息

# 6、关闭
conn.close()  # 挂电话
phone.close()  # 关机

tcp客户端:

# client.py
import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、拨电话
phone.connect(("127.0.0.1", 8080))  # 这里客户端和服务端是写在一台电脑上的

# 3、发/收消息
phone.send("hello".encode('utf-8'))
data = phone.recv(1024)  # 可以接收的最大字节数
print("服务的返回的数据:", data.decode('utf-8'))

# 4、关闭
phone.close()

二、加上循环

TCP服务端:

"""
服务端应该满足的特性:
    1、一直对外提供服务
    2、并发地提供服务
"""

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、插手机卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 用于修改端口号

phone.bind(("127.0.0.1", 8080))  # 两台电脑通信时,此处要修改为服务器ip地址和端口号

# 3、开机
phone.listen(5)
print('starting %s:%s' %("127.0.0.1", 8080))

# 4、等电话链接=>链接循环
while True:
    conn, client_addr = phone.accept()
    print(client_addr)
    # 5、收/发消息=>通信循环
    while True:
        try:
            data = conn.recv(1024)  # 最大接收的字节个数
            if len(data) == 0:  # 针对linux系统
                break
            print("收到的客户端数据:", data.decode('utf-8'))
            conn.send(data.upper())  # 这里默认是将接收的数据大写返回,也可以在定义返回信息

        except Exception:  # 针对windows系统
            break

    # 6、关闭
    conn.close()  # 挂电话
phone.close()  # 关机

TCP客户端:

# client.py
import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、拨电话
phone.connect(("127.0.0.1", 8080))  # 在于其他电脑上的服务器通信时,此处要改为服务器ip地址和端口号

# 3、发/收消息=>通信循环
while True:
    msg = input(">>: ").strip()
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print("服务的返回的数据:", data.decode('utf-8'))

# 4、关闭
phone.close()

三、远程执行命令

tcp服务端:

import socket
import subprocess

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、插手机卡
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 就是它,在bind前加

phone.bind(("127.0.0.1", 8080))  # 本地回环

# 3、开机
phone.listen(5)
print('starting %s:%s' % ("127.0.0.1", 8080))

# 4、等电话链接=>链接循环
while True:
    conn, client_addr = phone.accept()
    print(client_addr)
    # 5、收/发消息=>通信循环
    while True:
        try:
            cmd = conn.recv(1024)  # 最大接收的字节个数
            if len(cmd) == 0:  # 针对linux系统
                break

            obj = subprocess.Popen(cmd.decode('utf-8'),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE
                                   )

            res=obj.stdout.read()+obj.stderr.read()  # ???
            print(res)
            conn.send(res)
        except Exception:  # 针对windows系统
            break

    # 6、关闭
    conn.close()  # 挂电话
phone.close()  # 关机

tcp客户端:

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议

# 2、拨电话
phone.connect(("127.0.0.1", 8080))

# 3、发/收消息=>通信循环
while True:
    cmd = input("[root@localhost]# ").strip()
    phone.send(cmd.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('gbk'))

# 4、关闭
phone.close()

相关文章

  • day31 基于TCP的套接字

    一、基于tcp协议实现简单套接字通信 TCP是基于链接的,必须先启动服务端,再去启动客户端去连接服务器。 可以把服...

  • 网络编程之套接字

    套接字 套接字编程 根据socket模块提供的接口函数,进行组合使 用完成基于tcp或者udp的网路...

  • Socket、TCP和UDP

    Socket介绍 socket 套接字, 是基于TCP UDP 协议的 一种通信机制, 它本身就是对TCP ...

  • TCP和UDP

    套接字:两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就称为“套接字” TCP:基于TCP的...

  • TCP/UDP套接字通信

    一,基于TCP套接字通信 服务端 客户端 二,基于UDP套接字通信 服务端 客户端 - 执行如下(服务端无返回信息...

  • socket注意事项

    Socket TCP 和 UDP最大的区别就是:UDP 套接字没有 listen TCP 套接字使用recv()/...

  • ss:一个统计网络和套接字信息的命令行工具

    ss简介 ss命令可以用来统计套接字信息,它支持PACKET套接字、TCP套接字、UDP套接字、DCCP套接字、R...

  • iOS中的socket通信

    socket 套接字, 是基于TCP UDP 协议的 一种通信机制, 它本身就是对TCP 和UDp 协议应用的一...

  • Linux下进程间通讯方式 - UNIX Domain Sock

    概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台...

  • Linux下进程间通讯方式 - UNIX Domain Sock

    概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台...

网友评论

      本文标题:day31 基于TCP的套接字

      本文链接:https://www.haomeiwen.com/subject/amzpdktx.html