Python網絡編程--Echo服務
學習網絡編程必須要練習的三個小項目就是Echo服務,Chat服務和Proxy服務。在接下來的幾篇文章會詳細介紹。
今天就來介紹Echo服務,Echo服務是最基本的服務。它的主要特點就是連接與連接之間沒有通信。
1. 一問一答Echo
根據官網上的例子,做簡單的修改。
echo_server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Echo server program
"""
import socket
HOST = ''
PORT = 50007
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected by {}'.format(addr))
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
s.close()
if __name__ == '__main__':
main()
echo_client.py 輸入為空時,關閉連接。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Echo client program
"""
import socket
HOST = 'localhost'
PORT = 50007
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
data = raw_input('> ')
if not data:
break
s.sendall(data)
data = s.recv(1024)
if not data:
break
print('{}'.format(data))
s.close()
if __name__ == '__main__':
main()
先運行服務器程序,再啟動客戶端程序,如下:
服務器:
客戶端:
2. 輸入與輸出不同
要實現輸入與輸出不同,就需要解決輸入的內容,根據不同的輸入(指令)給出不同的應答。
下面我們實現以下幾個小功能:
- 輸入date,返回當前的日期與時間。
- 輸入os,返回操作系統信息。
- 輸入ls,列出當前目錄的清單。輸入ls dir,返回dir目錄的文件清單。
echo_server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Echo server program
"""
import socket
import time
import os
HOST = ''
PORT = 50007
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# enable address reuse
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected by {}'.format(addr))
while True:
data = conn.recv(1024)
if not data:
break
elif data == 'date':
data = get_date()
elif data == 'os':
data = get_os()
elif data.startswith('ls'):
data = get_ls(data[2:])
conn.sendall(data)
conn.close()
s.close()
def get_date():
return time.ctime()
def get_os():
return os.name
def get_ls(dire):
if not dire.strip():
dire = os.curdir
return '\n'.join(os.listdir(dire.strip()))
if __name__ == '__main__':
main()
echo_client.py 沒有變化。
效果如下:
服務器:
客戶端:
總結
通過上面的兩上小練習,所有類似Echo都應該可以完成了。可以在其基礎上進行擴充。比如實現一上HTTP服務器。