## Socket
百度百科上对Socket的解释是:Socket通常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
## Socket通信
下面图是socket服务器与客户端通信的过程,接下来我们简单讲一下编程
![screenshot_1560395848760.png](images/screenshot_1560395848760.png)
使用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