Python网络通讯

day26html

网络通讯shell

参考:网络

http://www.cnblogs.com/yuanchenqi/articles/5692716.htmlsocket

 

男生是client端,字条是socket(sk),经过sk通讯。url

socket属于客户端。应用程序两端经过“套接字”向网络发出请求或者应答网络请求。能够把socket理解为通讯的把手(hand)。spa

肯定对端IP地址→ 肯定应用程序端口 → 肯定通信协议.net

 

 

server下的方法命令行

bind()code

listen()server

accept()

 

recv()

send()#传送内容必须为bytes类型

sendall()

close()

client下的方法

connect()

 

recv()

send()

aendall()

close()

 

client发送,serve接收

serve.py

 1 import socket  2 
 3 sk = socket.socket()#建立socket
 4 
 5 print(sk)  6 
 7 address = ('127.0.0.1', 8000)#本机地址
 8 sk.bind(address)#为socket绑定IP和端口号
 9 
10 sk.listen(3)#限制排队的个数
11 print('waiting......') 12 conn, addr = sk.accept()#conn为客户端socket对象
13 # 14 # inp = input('>>>')
15 # conn.send(bytes(inp, 'utf8'))
16 
17 data = conn.recv(1024)#为何用conn,而不用sk
18 print(str(data, 'utf8')) 19 
20 # conn.close()#关具体对象
21 # sk.close()#全关

client.py

 1 import socket  2 
 3 sk = socket.socket()  4 
 5 print(sk)  6 address = ('127.0.0.1', 8000)  7 
 8 sk.connect(address)  9 
10 #data = sk.recv(1024)#收到的为bytes类型
11 data = sk.send(bytes('hah', 'utf8')) 12 
13 #print(str(data, 'utf8'))

运行serve.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> waiting......

waiting,accept()阻塞。

运行client.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> Process finished with exit code 0

serve收到数据“hah”

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> waiting...... hah Process finished with exit code 0

 

client接收,serve发送

serve.py

 1 import socket  2 
 3 sk = socket.socket()#建立socket
 4 
 5 print(sk)  6 
 7 address = ('127.0.0.1', 8000)#本机地址
 8 sk.bind(address)#为socket绑定IP和端口号
 9 
10 sk.listen(3)#限制排队的个数
11 print('waiting......') 12 conn, addr = sk.accept()#conn为客户端socket对象
13 
14 inp = input('>>>') 15 conn.send(bytes(inp, 'utf8')) 16 
17 # data = conn.recv(1024)#为何用conn,而不用sk
18 # print(str(data, 'utf8'))
19 
20 # conn.close()#关具体对象
21 # sk.close()#全关

client.py

import socket sk = socket.socket() print(sk) address = ('127.0.0.1', 8000) sk.connect(address) data = sk.recv(1024)#收到的为bytes类型 #data = sk.send(bytes('hah', 'utf8'))

print(str(data, 'utf8'))

运行serve.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> waiting......

运行client.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>

在serve命令行输入hello

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> waiting...... >>>hello Process finished with exit code 0

client命令行收到数据。

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> hello Process finished with exit code 0

 

不间断聊天

client.py

 1 import socket  2 
 3 sk = socket.socket()  4 
 5 print(sk)  6 address = ('127.0.0.1', 8000)  7 sk.connect(address)  8 
 9 while True: 10     inp = input('>>>') 11     if inp == 'exit': 12         break
13     sk.send(bytes(inp, 'utf8')) 14 
15     data = sk.recv(1024) 16     print(str(data, 'utf8')) 17 
18 sk.close() 19 #print(sk)

serve.py

 1 import socket  2 
 3 sk = socket.socket()#建立socket
 4 
 5 print(sk)  6 
 7 address = ('127.0.0.1', 8000)#本机地址
 8 sk.bind(address)#为socket绑定IP和端口号
 9 
10 sk.listen(3)#限制排队的个数
11 print('waiting......') 12 #conn, addr = sk.accept()#conn为客户端socket对象
13 
14 while True: 15     conn, addr = sk.accept() 16     print(addr)    #client打开则接收
17     while True: 18         #
19         try: 20             data = conn.recv(1024)#为何用conn,而不用sk,client关闭时报错误
21         except Exception: 22             break  #client端中止,他也中止
23         print('.......',str(data, 'utf8')) 24         if not data:break
25         #
26         inp = input('>>>') 27         conn.send(bytes(inp, 'utf8')) 28 
29 sk.close()#全关

不间断聊天,其中client若关闭,新开一个client,serve端还能继续服务。

 

粘包现象(远程执行命令)

cmd_client.py

 1 import socket  2 
 3 sk = socket.socket()  4 
 5 print(sk)  6 address = ('127.0.0.1', 8001)  7 sk.connect(address)  8 
 9 while True: 10     inp = input('>>>') 11     if inp == 'exit': 12         break
13     sk.send(bytes(inp, 'utf8')) 14     result_len = int(str(sk.recv(1024), 'utf8')) 15 
16     sk.sendall(bytes('ok', 'utf8'))#收到长度信息后,告诉server
17 
18     data = bytes()#初始化
19     while len(data) != result_len: #等于原文件大小,说明接收完
20         recv = sk.recv(1024) 21         data += recv 22 
23     print(str(data, 'utf8')) 24 
25 sk.close() 26 #print(sk)

cmd_server.py

 1 import socket  2 import subprocess  3 sk = socket.socket()#建立socket
 4 
 5 print(sk)  6 
 7 address = ('127.0.0.1', 8001)#本机地址
 8 sk.bind(address)#为socket绑定IP和端口号
 9 
10 sk.listen(3)#限制排队的个数
11 print('waiting......') 12 #conn, addr = sk.accept()#conn为客户端socket对象
13 
14 while True: 15     conn, addr = sk.accept() 16     print(addr)    #client打开则接收
17     while True: 18         #
19         try: 20             data = conn.recv(1024)#为何用conn,而不用sk,client关闭时报错误
21         except Exception: 22             break  #client端中止,他也中止
23         print('.......',str(data, 'utf8')) 24 
25         if not data:break
26         obj = subprocess.Popen(str(data, 'utf8'), shell = True, stdout = subprocess.PIPE) 27         cmd_result = obj.stdout.read()#以上执行结果
28         #print(cmd_result)
29         result_len = bytes(str(len(cmd_result)), 'utf8') 30 
31 
32         conn.sendall(result_len)#
33         #先向client发送数据,client若收到则向server发送OK,Server再发送处理结果
34         #若连续发送,两个发送内容(长度,处理结果)可能会合并。
35         re = conn.recv(1024)#防止粘包
36         if str(re, 'utf8') != 'ok': 37             break
38         #
39  conn.sendall(cmd_result) 40 
41         # conn.sendall(result_len) # 这种方式会发生粘包现象,长度和内容合在一块儿了
42         # conn.sendall(cmd_result)
43 sk.close()#全关

先执行server.py,再执行client.py,在client中输入命令(dir,pwd,ifconfig等)

相关文章
相关标签/搜索