惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - 西康的博客

mysql information_schema库中COLUMNS 和 TABLES表字段详解 python - queue 队列模块 python - 修改系统环境变量 python - threading 多进程模块 python - socketserver python - 反射 python 序列化 字典 异常处理 类的成员,类的特殊方法 elasticsearch RESTfull _cat api python - 面向对象编程基础知识 (进阶) python - 面向对象编程基础知识 python 文件操作 python re 模块 正则表达式 python configparser 模块 python logging 模块 python hashlib 模块 python sys 模块
python - socket 基础
西康的博客 · 2018-04-23 · via 博客园 - 西康的博客

最基本的socket实例:

Server端

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8080))
phone.listen(2)
print ('Start Server: ')
connect,address = phone.accept()
msg = connect.recv(1024)
print ('客户端发来的消息是:',msg)
connect.send(msg.upper())
connect.close()
phone.close()

Client端

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
phone.send('test message!'.encode('utf-8'))
msg = phone.recv(1024)
print ('服务端发来的消息是:',msg)
phone.close()

Server端改进版

# -*-coding:utf-8-*-
__author__ = 'qikang'

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8080))
phone.listen(5)

while True:
    print ('Start Server: ')
    connect,address = phone.accept()
    while True:
        # try:
        msg = connect.recv(1024)
        if not msg: break
        print ('客户端发来的消息是:',msg)
        connect.send(msg.upper())
        # except Exception as e:
        #     break
    connect.close()
phone.close()

Client端改进版

# -*-coding:utf-8-*-
__author__ = 'qikang'
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
while True:
    input_str = input('请输入需要发送的代码:')
    phone.send(input_str.encode('utf-8'))
    msg = phone.recv(1024)
    print ('服务端发来的消息是:',msg)
phone.close()

 一个SSH Server和Client示例:

# -*-coding:utf-8-*-
import socket
import subprocess
import struct
from functools import partial

ip_port = ('127.0.0.1',8080)
buffer_size = 1024
back_log = 5


tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 解决ip地址正在使用的问题
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

tcp_server.bind(ip_port)
tcp_server.listen(back_log)

print ('Running Server ...')
while True:
    connect,address = tcp_server.accept()
    print ('New Client: ',connect,address)
    while True:
        try:
            recv_cmd = connect.recv(buffer_size)
            print ('客户端发来的命令是:',recv_cmd )
            if not recv_cmd:
                break

            cmd = recv_cmd.decode('utf-8')
            cmd_result = subprocess.Popen(cmd,
                                          shell=True,
                                          stdin=subprocess.PIPE,
                                          stdout=subprocess.PIPE,
                                          stderr=subprocess.PIPE
            )
            # cmd_result_stdin = cmd_result.stdin.read()
            cmd_result_stdout = cmd_result.stdout.read()
            cmd_result_stderr = cmd_result.stderr.read()

            # .encode('utf-8')
            if cmd_result_stderr:
                cmd_result_recv = cmd_result_stderr

            elif not cmd_result_stdout:
                cmd_result_recv = b'None'
            else:
                cmd_result_recv = cmd_result_stdout

            length_data = struct.pack('i',len(cmd_result_recv))

            # send length data.
            connect.send(length_data)

            client_ready = connect.recv(buffer_size)
            if client_ready == b'client_ready':
                connect.send(cmd_result_recv)

        except Exception as e:
            break
    connect.close()
tcp_server.close()

server 端

# -*-coding:utf-8-*-
import socket
import struct
from functools import partial

ip_port = ('127.0.0.1',8080)
buffer_size = 1024

tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_client.connect(ip_port)

while True:
    input_str = input('请输入需要执行的命令:')

    if input_str == 'quit' or input_str == 'q' or input_str == 'exit':
        break

    if not input_str:
        continue

    tcp_client.send(input_str.encode('utf-8'))

    # recv data length.
    data_length_recv = tcp_client.recv(buffer_size)
    data_length = struct.unpack('i',data_length_recv)[0]
    tcp_client.send(b'client_ready')

    recv_size = 0
    server_send_data = b''
    while data_length > recv_size:
        server_send_data += tcp_client.recv(buffer_size)
        recv_size = len(server_send_data)

    # windows gbk
    print (server_send_data.decode('gbk'))

    # linux utf-8
    # print (server_send_data.decode('utf-8'))

tcp_client.close()

client端