## Socket
百度百科上對Socket的解釋是:Socket通常稱作“套接字”,用于描述IP位址和端口,是一個通信鍊的句柄,可以用來實作不同虛拟機或不同計算機之間的通信。
## Socket通信
下面圖是socket伺服器與用戶端通信的過程,接下來我們簡單講一下程式設計
使用socket通信,首先導入socket子產品
```python
import socket
```
### TCP伺服器
1. 伺服器建立套接字,綁定套接字到本地IP與端口
socket(family, type[, protocal])使用給定的套接族,套接字類型,協定編号(預設為0)來建立套接字。
```python
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind()
```
2. 開始監聽連結
s.listen(backlog)
backlog為拒絕連結前,系統可以挂起的最大連接配接數,至少為1。
```python
s.listen(2)
```
3. 進入循環,不斷接收用戶端的連結請求
```python
while True:
s.accept()
```
accept()接受TCP連結并傳回(conn, address),其中conn是新的套接字對象,可以用來接收和發送資料,address是連結用戶端的位址。
4. 接收用戶端傳來的資料,并且給對方發資料
```python
s.recv()
s.sendall()
```
注意:
伺服器與用戶端不能直接發送清單,元素,字典等帶有資料類型的格式,發送的内容必須是字元串資料。
5. 傳輸完畢後,關閉套接字。
```python
s.close()
```
#### 簡單的伺服器端代碼
```python
import socket
HOST, PORT = '', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
print "Server start at:%s:%s" %(HOST, PORT)
print "wait for connection..."
while True:
conn, addr = s.accept()
print "Connected", addr
while True:
data = conn.recv(1024)
print data
conn.send("server received you message.")
conn.close()
s.close()
```
TCP用戶端
1. 建立套接字并連結至遠端位址(伺服器)
```python
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect()
```
用戶端調用connect()方法來建立與伺服器的連結,并開始三次握手。握手保證了用戶端可以正常連接配接到伺服器,反之亦然。
2. 連接配接後發送資料和接收資料
```python
s.sendall()
s.recv()
```
3. 傳輸完畢後關閉套接字
```python
s.close()
```
#### 簡單的用戶端代碼
```python
import socket
HOST, PORT = '192.168.0. 118', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
cmd = raw_input("Input msg:")
s.send(cmd)
data = s.recv(1024)
print data
s.close()
```
參考:https://blog.51cto.com/loufeng/2340821