首页 > 其他 > 详细

网络编程之socket

时间:2019-06-26 16:42:43      阅读:127      评论:0      收藏:0      [点我收藏+]

网络编程

第一阶段:简单版

客户端

import  socket

# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)


# 发送消息
client_msg = "hello world"
client.send(bytes(client_msg.encode('utf-8')))


# 接受消息
data = client.recv(1024)
print(data.decode("utf-8"))

# 关闭连接
client.close()

服务端

import socket

# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 买卡
addr = ('127.0.0.1',8000)

# 手机上安装卡
server.bind(addr)

# 设置手机最多能同时接五个电话
server.listen(5)

# 开始等待电话
conn,addr = server.accept()

# 接受client的电话
client_msg = conn.recv(1024)
print(client_msg.decode("utf-8"))

# server回复消息给client
msg = "我是服务端"
conn.send(bytes(msg.encode('utf-8')))

# 关闭连接
conn.close()        
server.close()

PS:数据在传输的过程中,使用是二进制,所以我们需要将客户端,服务端中的数据转化为二进制传输(客户端:13行,服务端:24行),转化前需要使用utf8格式编码。

第二阶段:交互式发送

客户端

import socket

# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)

while True:
    # 发送消息
    client_msg = input("请输入发送的消息>>>>")
    client.send(bytes(client_msg.encode('utf-8')))

    # 接受消息
    data = client.recv(1024)
    print("服务端:",data.decode("utf-8"))

服务端

import socket

# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 买卡
addr = ('127.0.0.1',8000)

# 手机上安装卡
server.bind(addr)

# 设置手机最多能同时接五个电话
server.listen(5)

# 开始等待电话
conn,addr = server.accept()

while True:
    # 接受client的电话
    client_msg = conn.recv(1024)
    print(client_msg.decode('utf-8'))

    # server回复消息给client
    msg = "我是服务端"
    conn.send(bytes(msg.encode('utf-8')))

此时我们可以实现客户端与服务端交互式发送消息,但是存在一些问题:

a. 如果此时有另外一个客户端连接到服务端,客户端发送消息不会被接受

b. 当客户端关闭后,服务端会异常退出.

第三阶段:终极版

客户端

import socket

# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)

while True:
    # 发送消息
    client_msg = input("请输入发送的消息>>>>")
    client.send(bytes(client_msg.encode('utf-8')))

    # 接受消息
    data = client.recv(1024)
    print("服务端:",data.decode("utf-8"))

服务端

import socket

# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 买卡
addr = ('127.0.0.1',8000)

# 手机上安装卡
server.bind(addr)

# 设置手机最多能同时接五个电话
server.listen(5)

while True:
    # 开始等待电话
    conn, addr = server.accept()

    while True:
        try:
            # 接受client的电话
            client_msg = conn.recv(1024)
            print(client_msg.decode('utf-8'))

            # server回复消息给client
            msg = "我是服务端"
            conn.send(bytes(msg.encode('utf-8')))
        except Exception:
            break

此时当客户端退出后,再连接进来一个客户端 服务端也能正常工作!

实现在客户端输入指令,服务端负责执行指令,同时返回结果

客户端

import socket

# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)

while True:
    # 发送消息
    client_msg = input("请输入发送的消息>>>>")
    client.send(bytes(client_msg.encode('utf-8')))

    # 接受消息
    data = client.recv(2048)
    print("服务端:",data.decode('gbk'))        # 接受的编码为gbk,所以解码需要gbk

服务端

import socket
import subprocess
# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 买卡
addr = ('127.0.0.1',8000)

# 手机上安装卡
server.bind(addr)

# 设置手机最多能同时接五个电话
server.listen(5)

while True:
    # 开始等待电话
    conn, addr = server.accept()

    while True:
        try:
            # 接受client的电话
            client_msg = conn.recv(1024)
            command = client_msg.decode('utf-8')
            # 执行命令的模块
            obj = subprocess.Popen(command,
                             shell=True,
                             stderr=subprocess.PIPE,
                             stdout=subprocess.PIPE
                             )

            stdout = obj.stdout.read()
            stderr = obj.stderr.read()
            print(stderr, stdout)

            # server回复消息给client
            msg = stdout + stderr
            conn.send(msg)      # window输出的内容为编码为gbk
        except Exception:
            break

网络编程之socket

原文:https://www.cnblogs.com/plf-Jack/p/11090609.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!