Socket 网络编程:
socket 是对上层协议的封装;
发送端:
import socket
socket.TCP/IP
connect(a.ip,port)
socket.send("hello")
socket.recv()
socket.close()
接收端:
import socket
socket.TCP/IP
listen(ip,port) #监听某个地址和端口
waiting
recv()
send
socket 是对上层协议的封装;
发送端:
import socket
socket.TCP/IP
connect(a.ip,port)
socket.send("hello")
socket.recv()
socket.close()
接收端:
import socket
socket.TCP/IP
listen(ip,port) #监听某个地址和端口
waiting
recv()
send
地址簇:
socket.AF_UNIX #unix本机进程间通信
socket.AF_INET #IPV4
socket.AF_INET6 #IPV6
Socket Protocol Types:
socket.SOCK_STREAM #for tcp
socket.SOCK_DGRAM #for udp
socket.SOCK_RAW #原始套接字,普通的套接字无法处理IMCP,IGMP等网络报文,而socket.SOCK_RAW可以
还可以处理特殊的IPV4报文
socket.SOCK_RDM #是一种可靠的UDP形式
案例1:
服务端:
import socket
server = socket.socket()
server.bind(("127.0.0.1", 6969))
server.listen() # 监听
conn, addr = server.accept() # 等待消息
print(conn, addr)
data = conn.recv(1024)
print("receive:", data)
conn.send(data.upper())
server.close()
客户端:
import socket
conn = socket.socket() # 声明socket类型,同时生成socket连接对象
conn.connect(("127.0.0.1", 6969))
conn.send(b"Hello.World!") #只能发bytes类型
data = conn.recv(1024) #1024 字节 = 1kb
print(data)
conn.close()
案例2:
服务端:
import socket
server = socket.socket()
server.bind(("127.0.0.1", 6968))
server.listen(5) # 监听,最多可以监听的最大链接数
while True:
conn, addr = server.accept() # 等待消息
print(conn, addr)
while True:
data = conn.recv(1024)
if not data:
print("client has lost....")
break
print("receive:", data.decode())
conn.send(data.upper())
server.close()
客户端:
import socket
conn = socket.socket() # 声明socket类型,同时生成socket连接对象
conn.connect(("127.0.0.1", 6968))
while True:
while True:
msg = input(">>:").strip()
if msg : break
conn.send(msg.encode("utf-8")) #只能发bytes类型(不能send空,否则就卡住)
data = conn.recv(1024) #1024 字节 = 1kb
print(data.decode())
conn.close()
import os
import socket
server = socket.socket()
server.bind(("127.0.0.1", 6966))
server.listen(5) # 监听,最多可以监听的最大链接数
while True:
conn, addr = server.accept() # 等待消息,阻塞状态
print(conn, addr)
while True:
data = conn.recv(1024)
if not data:
print("client has lost....")
break
res = os.popen(data.decode()).read()
conn.send(res.encode("utf-8"))
server.close()
import socket
conn = socket.socket() # 声明socket类型,同时生成socket连接对象
conn.connect(("127.0.0.1", 6966))
while True:
while True:
msg = input(">>:").strip()
if msg : break
conn.send(msg.encode("utf-8")) #只能发bytes类型
data = conn.recv(1024) #1024 字节 = 1kb
print(data.decode())
conn.close()
简单的单机SSH:
import socket, os
server = socket.socket()
server.bind(("127.0.0.1", 8888))
server.listen(5)
while True:
conn, addr = server.accept()
while True:
client_cmd = conn.recv(1024)
if not client_cmd:
print("the client had lost.....")
break
res_cmd = os.popen(client_cmd.decode()).read().encode("utf-8")
res_size = len(res_cmd)
conn.send(str(res_size).encode("utf-8"))
client_action = conn.recv(1024).decode() #有效解决了粘包
if client_action == "start":
data = conn.send(res_cmd)
server.close()
server = socket.socket()
server.bind(("127.0.0.1", 8888))
server.listen(5)
while True:
conn, addr = server.accept()
while True:
client_cmd = conn.recv(1024)
if not client_cmd:
print("the client had lost.....")
break
res_cmd = os.popen(client_cmd.decode()).read().encode("utf-8")
res_size = len(res_cmd)
conn.send(str(res_size).encode("utf-8"))
client_action = conn.recv(1024).decode() #有效解决了粘包
if client_action == "start":
data = conn.send(res_cmd)
server.close()
import socket
client = socket.socket()
client.connect(("127.0.0.1", 8888))
while True:
while True:
cmd = input(">>:").strip()
if not cmd: continue
client.send(cmd.encode("utf-8"))
res_size = int(client.recv(1024).decode())
client.send("start".encode("utf-8"))
data = ""
while res_size > 0:
recv_data = client.recv(1024)
data += recv_data.decode()
res_size -= len(recv_data)
else:
print(data)