套接字及通信
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()
以上是关于套接字及通信的主要内容,如果未能解决你的问题,请参考以下文章