程序员

Python TCP编程

2017-06-15  本文已影响410人  PythonMaO

1. TCP简介

TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

  1. udp通信模型
    udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信”
UDP
  1. tcp通信模型
    tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"
TCP

2. tcp服务器

生活中的电话机

  1. 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情:
    1.买个手机
    2.插上手机卡
    3.设计手机为正常接听状态(即能够响铃)
    4.静静的等着别人拨打
  2. 如同上面的电话机过程一样,在程序中,如果想要完成一个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退出......
上一篇下一篇

猜你喜欢

热点阅读