网络编程之socket

网络编程

第一阶段:简单版

客户端

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
posted @ 2019-06-26 16:23  Hello_Jack  阅读(335)  评论(0编辑  收藏  举报
# 页脚html代码 /*头部导航栏*/ #navigator { font-size:15px; border-bottom: 1px solid #ededed; border-top: 1px solid #ededed; height: 60px;/*导航栏高度,原始50*/ clear: both; margin-top: 25px; } /*导航栏设置,可以自定义导航栏的目录*/ #navList { min-height: 35px; float: left; } #navList li { /*每一个栏目节点*/ float: left; margin: 0 5px 0 0; /*这里原来是0 40px 0 0 */ } #navList a { /*栏目文字的格式*/ display: block; width: 5em; height: 22px; float: left; text-align: center; padding-top: 19px; }