1. TCP简介
TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
- udp通信模型
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信”
- tcp通信模型
tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"
2. tcp服务器
生活中的电话机
- 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情:
1.买个手机
2.插上手机卡
3.设计手机为正常接听状态(即能够响铃)
4.静静的等着别人拨打 - 如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:
1.socket创建一个套接字
2.bind绑定ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv/send接收发送数据
做一个简单的TCP服务器
import socket
import time
# 买个手机
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)
# 关
newSocket.close() # 关闭之后,客户端也会被关闭
serverSocket.close() # 项目运行中服务器一直运行,不会关闭
等待客户端连接
G:\tools\python3.5\python.exe E:/课件/day28/demo/01_tcp服务端.py
1......
客户端收发消息
import socket
import time
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket.connect(('192.168.11.74',10086))
#发
sendData = input('>>')
clientSocket.send(sendData.encode('gbk'))
#收
recvData = clientSocket.recv(1024)
print(recvData.decode('gbk'))
服务端收发消息
import socket
import time
'''
serverSocket是用来接收新的客户端的
以后与这个连接的客户端的收发消息就不能用serverSocket了,
而是用返回来的新的newSocket
'''
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind(('', 10086))
serverSocket.listen(10)
newSocket, clientAddr = serverSocket.accept()
#发
sendData = input('>>')
newSocket.send(sendData.encode('gbk'))
#收
'''
此时的recv会导致阻塞。
一旦对应客户端断开了,不阻塞,并返回''的字符串
'''
recvData = newSocket.recv(1024)
print(recvData)
ewSocket.close()
serverSocket.close()
服务端收发消息多线程
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()
用网络调试助手模拟客户端
Paste_Image.png服务端收到结果
G:\tools\python3.5\python.exe E:/workspace/day28/03服务端收发消息多线程.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退出......
网友评论