1. TCP簡介
TCP協(xié)議則是建立在IP協(xié)議之上的腕唧。TCP協(xié)議負(fù)責(zé)在兩臺計算機(jī)之間建立可靠連接,保證數(shù)據(jù)包按順序到達(dá)枣接。TCP協(xié)議會通過握手建立連接但惶,然后湿蛔,對每個IP包編號县爬,確保對方按順序收到,如果包丟掉了察迟,就自動重發(fā)纲缓。
- udp通信模型
udp通信模型中喊废,在通信開始之前,不需要建立相關(guān)的鏈接工闺,只需要發(fā)送數(shù)據(jù)即可瓣蛀,類似于生活中,"寫信”
- tcp通信模型
tcp通信模型中叠殷,在通信開始之前诈皿,一定要先建立相關(guān)的鏈接,才能發(fā)送數(shù)據(jù)壶冒,類似于生活中截歉,"打電話"
2. tcp服務(wù)器
生活中的電話機(jī)
- 如果想讓別人能更夠打通咱們的電話獲取相應(yīng)服務(wù)的話瘪松,需要做一下幾件事情:
1.買個手機(jī)
2.插上手機(jī)卡
3.設(shè)計手機(jī)為正常接聽狀態(tài)(即能夠響鈴)
4.靜靜的等著別人撥打 - 如同上面的電話機(jī)過程一樣,在程序中记罚,如果想要完成一個tcp服務(wù)器的功能状飞,需要的流程如下:
1.socket創(chuàng)建一個套接字
2.bind綁定ip和port
3.listen使套接字變?yōu)榭梢员粍渔溄?br> 4.accept等待客戶端的鏈接
5.recv/send接收發(fā)送數(shù)據(jù)
做一個簡單的TCP服務(wù)器
import socket
import time
# 買個手機(jī)
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 插卡
serverSocket.bind(('', 10086))
# 由飛行模式到接聽模式
serverSocket.listen(10)
print('1......')
# 等待電話打入
newSocket, clientAddr = serverSocket.accept()
print('2......')
print(newSocket)
print(clientAddr)
# time.sleep(100)
# 關(guān)
newSocket.close() # 關(guān)閉之后书斜,客戶端也會被關(guān)閉
serverSocket.close() # 項目運行中服務(wù)器一直運行荐吉,不會關(guān)閉
等待客戶端連接
G:\tools\python3.5\python.exe E:/課件/day28/demo/01_tcp服務(wù)端.py
1......
客戶端收發(fā)消息
import socket
import time
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket.connect(('192.168.11.74',10086))
#發(fā)
sendData = input('>>')
clientSocket.send(sendData.encode('gbk'))
#收
recvData = clientSocket.recv(1024)
print(recvData.decode('gbk'))
服務(wù)端收發(fā)消息
import socket
import time
'''
serverSocket是用來接收新的客戶端的
以后與這個連接的客戶端的收發(fā)消息就不能用serverSocket了口渔,
而是用返回來的新的newSocket
'''
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind(('', 10086))
serverSocket.listen(10)
newSocket, clientAddr = serverSocket.accept()
#發(fā)
sendData = input('>>')
newSocket.send(sendData.encode('gbk'))
#收
'''
此時的recv會導(dǎo)致阻塞。
一旦對應(yīng)客戶端斷開了痪欲,不阻塞攻礼,并返回''的字符串
'''
recvData = newSocket.recv(1024)
print(recvData)
ewSocket.close()
serverSocket.close()
服務(wù)端收發(fā)消息多線程
import socket
import time
import threading
def socketState(newSocket, clientAddr):
while True:
recvDate = newSocket.recv(1024)
recvDate = recvDate.decode('gbk')
if recvDate == '':
print('客戶端%s:%s退出......'%(clientAddr[0],clientAddr[1]))
newSocket.close()
break
else:
sendDate = 'echo:%s' % recvDate
newSocket.send(sendDate.encode('gbk'))
print('來自%s:%s的消息(%s)' % (clientAddr[0], clientAddr[1], time.strftime('%Y-%m-%d %H:%M:%S')) + recvDate)
def main():
serveSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveSocket.bind(('', 10086))
serveSocket.listen(5)
while True:
newSocket, clientAddr = serveSocket.accept()
threading.Thread(target=socketState, args=(newSocket, clientAddr)).start()
if __name__ == '__main__':
main()
用網(wǎng)絡(luò)調(diào)試助手模擬客戶端
服務(wù)端收到結(jié)果
G:\tools\python3.5\python.exe E:/workspace/day28/03服務(wù)端收發(fā)消息多線程.py
來自192.168.11.67:62945的消息(2017-06-15 22:13:28)hello
來自192.168.11.67:62946的消息(2017-06-15 22:13:29)你好
來自192.168.11.67:62945的消息(2017-06-15 22:13:31)hello
來自192.168.11.67:62946的消息(2017-06-15 22:13:33)你好
客戶端192.168.11.67:62945退出......
來自192.168.11.67:62946的消息(2017-06-15 22:13:37)你好
客戶端192.168.11.67:62946退出......