socket通信

socket通信的伪代码流程:

 

socket简单的示例代码

client端的代码:

 1 import socket
 2 
 3 client = socket.socket()
 4 client.connect(('localhost',3001))
 5 
 6 client.send(b'hhhh')
 7 data = client.recv(1024)
 8 print('recv:',data)
 9 
10 client.close()
1 客户端结果
2 >>> recv: b'HHHH'

 

server端的代码:

 1 import socket
 2 
 3 server = socket.socket()
 4 
 5 server.bind(('localhost',3001)) #绑定要监听端口
 6 server.listen()                 #监听
 7 
 8 print('开始等待数据....')
 9 
10 #conn表示客户端连接到服务端生成的一个连接实例
11 conn,addr = server.accept() #等待数据
12 
13 print(conn,addr)
14 
15 
16 print('数据来了')
17 data = conn.recv(1024)
18 print('recv:',data)
19 
20 conn.send(data.upper())
21 
22 server.close()
1 服务端结果
2 >>> 开始等待数据....
3 >>> <socket.socket fd=296, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 3001), raddr=('127.0.0.1', 54373)> ('127.0.0.1', 54373)
4 >>> 数据来了
5 >>> recv: b'hhhh'

 socket多用户连接:

client端的代码:

 1 import socket
 2 import os
 3 
 4 client = socket.socket()
 5 client.connect(('localhost', 3001))
 6 while True:
 7     #让用户自己输入要发送的信息msg,因为涉及到中文,所已用encode和decode进行转换
 8     msg = input(">>>:").strip()
 9     if len(msg) == 0:
10         continue
11     client.send(msg.encode("utf-8"))
12     data = client.recv(1024)
13     print('recv:', data.decode())
14 
15 client.close()

server端的代码:

 1 import socket
 2 import os
 3 
 4 server = socket.socket()  # 创建套接字
 5 server.bind(('localhost', 3001))  # 绑定要监听端口
 6 server.listen(1)  # 监听,数据代表允许多少个链接
 7 
 8 print('开始等待数据....')
 9 # conn表示客户端连接到服务端生成的一个连接实例
10 # 先说第二个while,循环接收客户端数据,当客户端数据没有发送,服务端收到数据为空的时候跳出循环,这么做是因为这个程序如果想要一直接收客户端数据,就需要进行循环操作,但是如果收到数据为空,该循环就会进入一个死循环,所以需要判定条件,当客户端结束发送数据,然后结束连接;
11 # 然后第一个while,因为这里考虑测试多人单线程连接server,如果不加while,当客户端数据没有发送,server会直接断开连接,不接收下个新用户的请求数据,所以将一个连接实例放在循环里,当一个用户断开连接,回到上层,然后再接收新用户的数据。
12 while True:
13     conn, addr = server.accept()  # 等待数据
14     print(conn, addr)
15     print('数据来了')
16     while True:
17         data = conn.recv(1024)
18         print('recv:', data)
19         if not data:
20             print('The client did not respond')
21             break
22          conn.send(data.upper())
23 
24 server.close()

socket简单的shell实现:

client端的代码:

import socket
import os

client = socket.socket()
client.connect(('localhost', 3001))
while True:
    #让用户自己输入要发送的信息msg,因为涉及到中文,所已用encode和decode进行转换
    msg = input(">>>:").strip()
    if len(msg) == 0:
        continue
    client.send(msg.encode("utf-8"))
    data = client.recv(1024)
    #print('recv:', data.decode())
    print(data.decode())

client.close()

server端的代码:

import socket
import os

server = socket.socket()  # 创建套接字
server.bind(('localhost', 3001))  # 绑定要监听端口
server.listen(1)  # 监听,数据代表允许多少个链接

print('开始等待数据....')
while True:
    conn, addr = server.accept()  # 等待数据
    print(conn, addr)
    print('数据来了')
    while True:
        data = conn.recv(1024)
        print('recv:', data)
        if not data:
            print('The client did not respond')
            break
        res = os.popen(data.decode()).read()  #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
        conn.send(res.encode("utf-8"))

server.close()

 

 



posted @ 2017-11-27 18:18  橙子味的萝卜  阅读(239)  评论(0编辑  收藏  举报