本實例旨在瞭解py和socket的一些相關知識。php
1.服務器端搭建py監聽程序。html
在客戶端搭建python,linux默認自帶了python2.7,先無論安裝了。python
接着編寫socket程序,能夠在本地編輯上傳,或者用vim編輯,這裏用本地編輯上傳,vim仍是有不方便的地方。linux
python怎麼寫註釋?c++
在腳本里寫了幾行中文註釋,可是,忘了py的註釋格式,用的「//」出錯 ,改用#號,用#號作註釋,和其餘c,c++,php,js,都不同,獨特的風格仍是好記憶的,這裏直接記下,可是改用#後仍是出錯,由於py文件編輯好後,默認是用ASCII碼來保存,ASCII有什麼特色?他只針對了原始的數字,字母,鍵盤符號等有編碼,中文等根本就沒有編碼,因此要進行編碼聲明,vim
在首行加上瀏覽器
#coding=utf-8,這樣註釋就有效了。服務器
下面是具體的服務端的程序,引用自廖雪峯的網站app
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000python2.7
#建立socket
import socket
import threading
import time
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#因爲個人客戶端程序在另外一個服務器上,因此我用外網的服務器和這臺服務器進行通訊時被拒絕了,起初覺得是防火牆問題,後來在防火牆裏也沒有找到
#相關的限制,用netstat -tlp (t:只顯示tcp鏈接,l:只顯示正在監聽的端口,p:顯示程序名)發現那些80端口 ip都是*等,只有這個程序是127.0.0.1才明白,這裏是指
#只監聽本地ip的鏈接而已,因此把 127.0.0.1 改爲 0.0.0.0 (表示任意ip)就能夠了
#s.bind(('127.0.0.1', 9999))
s.bind(('0.0.0.0',9999))
s.listen(5)
print('Waiting for connection...')
while True:
# 接受一個新鏈接:
sock, addr = s.accept()
# 建立新線程來處理TCP鏈接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
2.客戶端編寫鏈接程序。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 創建鏈接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 發送數據:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
//利用socket請求一個網頁
//理解這一塊對http請求原理以及瀏覽器的請求方式有必定的幫助
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.sina.com.cn',80))
s.send('GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
buffer=[]
while True:
d=s.recv(1024)
if d :
buffer.append(d)
else :
break
data = b''.join(buffer)
s.close
header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))# 把接收的數據寫入文件:with open('sina.html', 'wb') as f: f.write(html)