熟悉了一下python的socket模塊,感覺還是有點好玩的,不過坑也也是不少的。
1、服務器端代碼
#!/usr/bin/env python import socket HOST='192.168.1.60' PORT=55555 s = socket.socket() s.bind((HOST,PORT)) s.listen(10) while True: conn,addres = s.accept() conn.send('HELLO') while True: data = conn.recv(1024) print data,addres if data =='exit': print 'byebye' break if not data.strip(): continue flag = True while flag: info = raw_input('Answer:>>') if info.strip(): flag=False conn.sendall(' %s' % info) conn.close()
主要是創建一個服務端,在創建服務端的時候,主要步驟如下:
創建socket對象socket——》綁定IP地址和端口bind——》監聽listen——》得到請求accept——》接收請求recv——》發送信息send——》關閉close
2、 客戶端代碼
#!/usr/bin/env python import socket HOST='192.168.1.60' PORT=55555 s = socket.socket() s.connect((HOST,PORT)) while True: data = s.recv(1024) if data.strip(): print 'Replay is ',data flag = True while flag: kel = raw_input('Question :>>') print 'raw_input values : %r' % kel if kel.strip(): flag=False s.sendall(kel) if kel == 'exit': break s.close()
客戶端代碼就是連接服務器,接收和發送消息,具體流程如下:
創建socket對象socket——》connet連接服務器——》獲取消息recv——》發送消息send——關閉close
3、 基本方法描述
在使用socket模塊的時候,創建對象一般是使用如下的代碼:
s = socket.socket()
在使用默認值的時候,表示創建的是TCP 的socket,地址家族表示為socket.AF_INET,socket類型默認值為socket.SOCK_STREAM表示為TCP的,而UDP的為socket.SOCK_DGRAM,表示為數據包
綁定的代碼如下:
s.bind((IP,port))注意在綁定的時候,參數只有一個表示為元組tuple,其中第一個元素為ip地址或者是hostname,第二個參數為port端口號,也就是開始監聽哪個IP地址的哪個端口
監聽的代碼如下:
s.listen(5)其中的參數為整數,5表示阻塞五個連接,實際上,,經過測試,十幾個都沒問題,主要是阻塞式的,當有一個連接上的時候,那么其他的都不會連接上,只有在第一個推出的時候,其他的才能進行連接,開始還以為是可以同時連接五個,然后測試下,發現不行,無論是同一個服務器上還是不同的機器上,是不能同時進行連接的,也就是所謂的阻塞式。
被動接受請求的代碼如下:
conn,addres = s.accept()返回的是一個元組,也就是在接受客戶端的連接,返回的第一個元素是一個socket對象,可以認為是客戶端的socket對象,address表示為客戶端的地址,其實這個也就使用和客戶端進行通信的。
客戶端連接服務器端的代碼如下:
s.connect((ip,port))參數為服務器的IP地址和服務器監聽的端口。
發送消息的代碼如下:
conn.send('string is send') conn.sendall('send')l兩個都是用來發送消息的,區別就是sendall盡量一次發送,而send的話主要看接收能力,如果超出范圍的話,那么會進行發送兩次進行發送
接收消息的代碼如下:
conn.recv(1024)
主要方法是recv方法表示接收消息,最多接收的字節數為1024,那么多余的字符將會在下次接收的過程中進行接收。
4、運行客服端和服務端
在運行客戶端和服務端代碼之后,發現是可以交互的,也就是客戶端和服務端進行說話,就想其他的一些交流軟件一樣,注意,在上述的代碼中還存在一些bug,並不是指異常處理
在上述的代碼中,主要的思路就是如果客戶端輸入為空,那么會一直輸入,除非輸入exit,那么退出,輸入了字符之后,才會發送到服務端
如果服務端回復為空,那么會要求服務端一直輸入,輸入字符后發送給客戶端,如果客戶端退出,那么斷開連接,繼續監聽。