基于TCP协议的套接字编程
实现电话沟通为例,这里传递的是字符,可以自己尝试去发送一个文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# 服务端
import socket
# 1. 符合TCP协议的手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # TCP
# 2. 绑定手机号 一个服务器,我们自己的电脑作为服务器的话,用自己的IP地址
server.bind(( '127.0.0.1' , 8000 )) # 127.0.0.1 代表本地
# server.bind(('192.168.11.251',8000))
server.listen( 5 ) # 半连接池 可以同时接收5个客户端
# 3. 等待客户端连接
print ( 'start...' )
# 链接循环
while True :
# 通信循环
conn,client_addr = server.accept()
while True :
try :
# 4. 收到信息 receive
data = conn.recv( 1024 ) # 每次接收多少字节,如果改为10,客户端输入dir,(可以在cmd中输入 dir,看看会得到什么) ,会出现什么情况呢,下次的博客会讲到粘包问题,以及如何处理粘包问题
print (data)
# 5. 回消息
conn.send(data.upper())
except ConnectionAbortedError:
continue
except ConnectionResetError:
break
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 客户端1
import socket
# 1. 创建符合TCP协议的手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. 拨号
client.connect(( '127.0.0.1' , 8000 ))
while True :
msg = input ( 'please enter your msg' ) # dir
# 3. 发送消息
client.send(msg.encode( 'utf8' ))
# 4. 接收消息
data = client.recv( 1024 )
print (data)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 客户端2
import socket
# 1. 创建符合TCP协议的手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. 拨号
client.connect(( '127.0.0.1' , 8000 ))
# msg = input('please enter your msg>>>')
# 3. 发送消息
client.send( 'hello' .encode( 'utf8' ))
client.send( 'world' .encode( 'utf8' ))
# 4. 接收信息
data = client.recv( 1024 )
print (data)
|
模拟ssh远程执行命令(linux系统)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# ssh服务端
import socket
import subprocess
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(( '192.168.11.251' , 8000 )) # 这是我的机子,客户端可以是其他人的机子
server.listen( 5 )
print ( 'start...' )
while True :
conn,cient_addr = server.accept()
print (client_addr) # 打印出的是其他人机子的IP
while True :
try :
cmd = conn.recv( 1024 ) # dir
print (cmd)
# 帮你执行cmd命令,然后把执行结果保存到管道里
pipeline = subprocess.Popen(cmd.decode( 'utf8' ),
shell = True ,
stderr = subprocess.PIPE, # std 标准
stdout = subprocess.PIPE)
stderr = pipeline.stderr.read()
stdout = pipeline.stdout.read()
conn.send(stderr)
conn.send(stdout)
except ConnectionResetError:
break
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# ssh客户端
import socket
# 1.创建符合TCP协议的手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. 拨号
client.connect(( '192.168.11.210' , 8000 ))
while True :
msg = input ( 'please enter your msg' ) # dir
# 3. 发送消息
client.send(msg.encode( 'utf8' ))
# 4. 接收消息
data = client.recv( 10 )
print (data.decode( 'gbk' )) # 在mac电脑上可能是'utf8'
|
学习最有效的方法一定是有输入,一定要输出,这样学的东西才能真正得有用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/geyatou322/p/11093020.html