Python学习——socket 模块

http://www.cnblogs.com/alex3714/articles/5830365.html 可以看的内容

socket ssh (不带防止粘包的方法)

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket
import os

server = socket.socket()
server.bind(('localhost', 6969))  #绑定被监听端口
server.listen(5)   #监听端口
while True:
    print("我要开始等电话了")
    conn, addr = server.accept()  # 就是等待的意思
    #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
    print("电话来了%s"% [conn, addr])
    while True:
        data = conn.recv(1024)
        if not data:
            print('client is lost.')
            break
        # res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
        # with open('filename', 'r') as ret:  #这两行就 可以用过来传输文件了。
        #     data = ret.read()
        print('receive:',data)
        conn.send(data.upper())


server.close()

socket client 模块

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket


client = socket.socket() #声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))   #localhost就是本机地址

while True:
    msg = input('input msg >>:').strip()
    if len(msg) == 0: continue  #检查msg的信息,防止无输入信息
    #client.send(b"Hello, world!") #发送信息
    client.send(msg.encode('utf-8'))

    data = client.recv(1024) #默认接受1024字节,就是1k
    # with open('filename', 'w') as ret:  # 这两行就 可以用过来传输文件了。
    #     ret = data.write()

    print(data.decode())

client.close() #关闭端口

防止粘包的socket_ssh.py

 1 #! /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author Ian Ying
 4 # mail: kongqing.ying@yitu-inc.com
 5 
 6 import socket
 7 import os
 8 
 9 server = socket.socket()
10 server.bind(('localhost', 6969))  #绑定被监听端口
11 server.listen(5)   #监听端口
12 while True:
13     print("我要开始等电话了")
14     conn, addr = server.accept()  # 就是等待的意思
15     #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
16 
17     while True:
18         data = conn.recv(1024).decode()
19         print("电话来了%s" % type(data))
20         # if type(data) is str:
21         #     data = data.strip()
22         if not data:
23             print('client is lost.')
24             break
25         cmd_res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
26         cmd_res_size = str(len(cmd_res.encode("utf-8")))
27         print("before send",len(cmd_res),"size after encode", cmd_res_size)
28         if len(cmd_res) == 0:
29             print("there is no output.")
30             res_warning = "there is no output."
31             conn.send(res_warning.encode("utf-8"))
32             continue
33         else:
34             conn.send(cmd_res_size.encode("utf8"))
35             print(conn.recv(1024).decode())  #通过接收数据的形式来强制发送缓冲区的数据,防止粘包。
36         # with open('filename', 'r') as ret:  #这两行就 可以用过来传输文件了。
37         #     data = ret.read()
38         #print('receive:',data)
39         print('receive:', data)
40         conn.send(cmd_res.encode("utf-8"))
41         # conn.send(bytes(cmd_res)) #不可行。传输的时候是需要encoding
42 
43 
44 server.close()

socket_client.py

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket


client = socket.socket() #声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))   #localhost就是本机地址

while True:
    msg = input('input msg >>:').strip()
    if len(msg) == 0: continue  #检查msg的信息,防止无输入信息
    #client.send(b"Hello, world!") #发送信息
    client.send(msg.encode('utf-8'))
    received_size = client.recv(1024).decode() #用来记录接受的数据大小
    print("接收的数据大小", received_size)
    received_cont = b''
    received_cont_size = 0  # 用来判断接受数据的大小
    if received_size != "there is no output." :
        client.send("准备好了,可以发送。".encode())  #发送确认信息,以防止粘包
        received_size = int(received_size) #数据需要变成int才能进行判断
        while received_size != received_cont_size:  #判断encode后的长度是否一致。
            received_cont_for_test = client.recv(1024)
            received_cont_size += int(len(received_cont_for_test))
            received_cont = received_cont + received_cont_for_test
            print("当前结束后的数据大小为:", received_cont_size)
            # print(received_cont_size)
        else:
            print("数据接收完成,接收的数据大小为:", received_cont_size)
            print("接收的内容为:
",received_cont.decode(),"
")
    else:
        print("output:
", received_size)


        # data = client.recv(1024) #默认接受1024字节,就是1k
        # with open('filename', 'w') as ret:  # 这两行就 可以用过来传输文件了。
        #     ret = data.write()
        # print(data.decode())
        # print(str(data))


client.close() #关闭端口
原文地址:https://www.cnblogs.com/Ian-learning/p/8454597.html