套接字及通信

Posted 笃行1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套接字及通信相关的知识,希望对你有一定的参考价值。

socket():先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

socket()用法:

socket.socket(socket_family,socket_type,protocal=0)
socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
例如tcpSock = socket(AF_INET, SOCK_STREAM)

简单的socket通信流程程序:

客户端:

import socket

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


#拨号
phone.connect((\'127.0.0.1\',8050))

#发、收信息
phone.send(\'hello\'.encode(\'utf-8\'))
data =phone.recv(1024)
print(data)

#关机
phone.close()

服务端:

import socket

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


#绑定手机卡\'169.254.223.212\'
phone.bind((\'127.0.0.1\',8050))


#开机
phone.listen(10)#最大挂起的连接数


#等电话链接
print(\'starting.....\')
conn,client_adder= phone.accept()
print(conn)

data=conn.recv(1024)#单位是Byte,1024是接受数据的最大数
print(\'客户端的数据\',data)
conn.send(data.upper())

conn.close()
phone.close()

 

简单的通信循环程序:

客户端:

import socket

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


#拨号
phone.connect((\'127.0.0.1\',7100))

#发、收信息

while True:
    \'\'\'通信循环\'\'\'
    msg = input(\'>>>:\').strip()
    phone.send(msg.encode(\'utf-8\'))
    data =phone.recv(1024)
    print(data)

#关机
phone.close()

服务端:

import socket

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


#绑定手机卡\'169.254.223.212\'
phone.bind((\'127.0.0.1\',7100))


#开机
phone.listen(10)#最大挂起的连接数


#等电话链接
print(\'starting.....\')
conn,client_adder= phone.accept()
while True:
    data=conn.recv(1024)#单位是Byte,1024是接受数据的最大数
    print(\'客户端的数据\',data)
    msg = input(\'>>>:\').strip()
    conn.send(msg.upper().encode(\'utf-8\'))

conn.close()
phone.close()

模拟ssh

客户端:(在window环境上)

import socket

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


#拨号
phone.connect((\'127.0.0.1\',8030))

#发、收信息

while True:
    \'\'\'通信循环\'\'\'
    msg = input(\'>>>:\').strip()
    if not msg:continue
    phone.send(msg.encode(\'utf-8\'))
    data =phone.recv(1024)
    print(data.decode(\'gbk\'))

#关机
phone.close()

服务器:

import socket,subprocess

#买手机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

#绑定手机卡\'169.254.223.212\'
phone.bind((\'127.0.0.1\',8030))


#开机监听
phone.listen(10)#最大挂起的连接数


#等电话链接
print(\'starting.....\')
while True:
    conn,client_adder= phone.accept()
    print(client_adder)
    while True:
        try:
            cmd=conn.recv(1024)#单位是Byte,1024是接受数据的最大数print(\'客户端的数据\',data)
            print(\'客户端的命令\', cmd)
            obj = subprocess.Popen(cmd.decode(\'utf-8\'),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            stdout = obj.stdout.read()
            stderr = obj.stderr.read()


            conn.send(stdout+stderr)
        except ConnectionResetError:
            break



    conn.close()
phone.close()

 

以上是关于套接字及通信的主要内容,如果未能解决你的问题,请参考以下文章

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

进程间通信方式及特点

在tablayout片段之间进行通信[重复]

Socket通信关于Socket通信原理解析及python实现

Linux 进程间套接字通信(Socket)基础知识

与另一个片段通信的片段接口