基于TCP協(xié)議的套接字編程
實(shí)現(xiàn)電話溝通為例,這里傳遞的是字符,可以自己嘗試去發(fā)送一個(gè)文件
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
|
# 服務(wù)端 import socket # 1. 符合TCP協(xié)議的手機(jī) server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # TCP # 2. 綁定手機(jī)號(hào) 一個(gè)服務(wù)器,我們自己的電腦作為服務(wù)器的話,用自己的IP地址 server.bind(( '127.0.0.1' , 8000 )) # 127.0.0.1 代表本地 # server.bind(('192.168.11.251',8000)) server.listen( 5 ) # 半連接池 可以同時(shí)接收5個(gè)客戶端 # 3. 等待客戶端連接 print ( 'start...' ) # 鏈接循環(huán) while True : # 通信循環(huán) conn,client_addr = server.accept() while True : try : # 4. 收到信息 receive data = conn.recv( 1024 ) # 每次接收多少字節(jié),如果改為10,客戶端輸入dir,(可以在cmd中輸入 dir,看看會(huì)得到什么) ,會(huì)出現(xiàn)什么情況呢,下次的博客會(huì)講到粘包問題,以及如何處理粘包問題 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. 創(chuàng)建符合TCP協(xié)議的手機(jī) client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 撥號(hào) client.connect(( '127.0.0.1' , 8000 )) while True : msg = input ( 'please enter your msg' ) # dir # 3. 發(fā)送消息 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. 創(chuàng)建符合TCP協(xié)議的手機(jī) client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 撥號(hào) client.connect(( '127.0.0.1' , 8000 )) # msg = input('please enter your msg>>>') # 3. 發(fā)送消息 client.send( 'hello' .encode( 'utf8' )) client.send( 'world' .encode( 'utf8' )) # 4. 接收信息 data = client.recv( 1024 ) print (data) |
模擬ssh遠(yuǎn)程執(zhí)行命令(linux系統(tǒng))
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服務(wù)端 import socket import subprocess server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(( '192.168.11.251' , 8000 )) # 這是我的機(jī)子,客戶端可以是其他人的機(jī)子 server.listen( 5 ) print ( 'start...' ) while True : conn,cient_addr = server.accept() print (client_addr) # 打印出的是其他人機(jī)子的IP while True : try : cmd = conn.recv( 1024 ) # dir print (cmd) # 幫你執(zhí)行cmd命令,然后把執(zhí)行結(jié)果保存到管道里 pipeline = subprocess.Popen(cmd.decode( 'utf8' ), shell = True , stderr = subprocess.PIPE, # std 標(biāo)準(zhǔn) 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.創(chuàng)建符合TCP協(xié)議的手機(jī) client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 撥號(hào) client.connect(( '192.168.11.210' , 8000 )) while True : msg = input ( 'please enter your msg' ) # dir # 3. 發(fā)送消息 client.send(msg.encode( 'utf8' )) # 4. 接收消息 data = client.recv( 10 ) print (data.decode( 'gbk' )) # 在mac電腦上可能是'utf8' |
學(xué)習(xí)最有效的方法一定是有輸入,一定要輸出,這樣學(xué)的東西才能真正得有用
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/geyatou322/p/11093020.html