1.TCP

TCP通信模型中,在通信开始之前,⼀定要先建⽴相关的连接,才能发送数据,类似于⽣活中,"打电话"。TCP编程分为客户端和服务器端两部分组成,所以我们需要首先完成服务器端的编程,之后完成客户端的编程,再使用客户端连接服务器端。

TCP是有状态的,安全的,可靠的,有连接的协议。TCP建立连接时,要经过三次握手,连接断开时要经过四次挥手。在未连接时,服务器等待客户端的连接,当客户端连接上时,向客户端发送输入的信息。

2.TCP服务器的搭建流程

(1)、socket创建⼀个套接字; (2)、bind绑定ip和port;(3)、listen使套接字变为可以被动链接;(4)、accept等待客户端的链接;(5)、recv/send接收发送数据。

import socket
import time
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(("", 8080))
# 表示监听的数量 在Linux下是无效的
server.listen(10)
print("服务器开始监听了……")
# 等待客户端的连接 返回的是一个元组包含客户端对象和它的套接字 这个客户端对象用于向客户端发送信息
# 其中laddr ===>local address  raddr ===>remote address
data = server.accept()
server.send()
# print(data)
time.sleep(10)
# 关闭服务器
server.close()

用网络调试助手连接后返回如下结果

服务器开始监听了……
(<socket.socket fd=440, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.14.30', 8080), raddr=('192.168.14.30', 51853)>, ('192.168.14.30', 51853))

3.服务器端发送数据和接受数据

服务器端

import socket
import time
# 获取一个基于TCP协议的socket对象
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(("", 8080))
# 表示监听的数量 在Linux下是无效的
server.listen(10)
print("服务器开始监听了……")
client_socket, client_address = server.accept()
client_socket.send("本服务器来自于阎王殿,告诉你一个不幸的消息,你命不久矣".encode("utf-8"))
msg = client_socket.recv(1024).decode("utf-8")
print("收到来自于{} {}客户端的信息:".format(client_address[0], client_address[1]), msg)
# print(data)
time.sleep(10)
# 关闭服务器
server.close()

客户端

import socket
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
try:print("客户端开始连接了……")client.connect(("192.168.14.30", 8080))print("连接成功")msg = client.recv(1024).decode("utf-8")print("收到来自于服务器{} {}的信息:".format("192.168.14.30", 8080), msg)client.send("怎么可能,我堂堂大罗金仙,寿命永恒,怎会死亡".encode("utf-8"))
except Exception as e:print("连接失败,错误信息是", e)
finally:client.close()

客户端连接上服务器时,客户端输出信息如下:

客户端开始连接了……
连接成功
收到来自于服务器192.168.14.30 8080的信息: 本服务器来自于阎王殿,告诉你一个不幸的消息,你命不久矣

服务器端输出信息如下:

服务器开始监听了……
收到来自于192.168.14.30 50805客户端的信息: 怎么可能,我堂堂大罗金仙,寿命永恒,怎会死亡

当客户端断开后,服务器端会报错,这需要抛出错误,让程序正常结束

4.多线程的实现

服务器端

def main():import socketfrom threading import Threadserver = socket.socket()server.bind(("", 8080))# 绑定服务器的ip 当然也可将服务器的套接字当成一个参数传入server.listen(10)socket_client, socket_address = server.accept()socket_client.send("你已连接到服务器,请注意您的言谈举止".encode("utf-8"))t1 = Thread(target=send_msg, args=[socket_client])t2 = Thread(target=rec_msg, args=[socket_client])t1.start()t2.start()server.close()def send_msg(client):try:while True:client.send("\n".encode("utf-8"))client.send(input("").encode("utf-8"))except Exception as e:print("退出连接")finally:close_resource(client)def rec_msg(client):try:while True:print(client.recv(1024).decode("utf-8"))except Exception as e:print("退出连接")finally:close_resource(client)def close_resource(client):if client is not None:client.close()

客户端

# 传入服务器的套接字
def main(ip):import socketfrom threading import Threadclient = socket.socket()client.connect(ip)print("连接成功")print(">:", client.recv(1024).decode("utf-8"))t1 = Thread(target=send_msg, args=[client])t2 = Thread(target=rec_msg, args=[client])t1.start()t2.start()def send_msg(client):try:while True:client.send("\n".encode("utf-8"))client.send(input("").encode("utf-8"))except Exception as e:print("退出连接")finally:close_resource(client)def rec_msg(client):try:while True:print(client.recv(1024).decode("utf-8"))except Exception as e:print("退出连接")finally:close_resource(client)def close_resource(client):if client is not None:client.close()main(("192.168.14.30", 8080))

由于客户端的退出会导致服务器端出错这里做了抛出错误的处理。

Python网络编程-----TCP相关推荐

  1. Python网络编程——TCP与UDP

    Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...

  2. Python网络编程—TCP套接字之HTTP传输

    HTTP协议 (超文本传输协议) 1.用途 : 网页获取,数据的传输 2.特点: 应用层协议,传输层使用tcp传输 简单,灵活,很多语言都有HTTP专门接口 无状态,协议不记录传输内容 http1.1 ...

  3. [Python 网络编程] TCP、简单socket模拟ssh (一)

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层网络进程访问应用层:为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务:提供用户身份验证表 ...

  4. python网络编程—TCP协议(二)

    一.TCP协议的原理图 每个客户端与服务端通讯是互不干扰的 二.注意点 1.tcp服务器─般情况下都需要绑定,否则客户端找不到这个服务器 2.tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定 ...

  5. python网络编程—TCP协议(一)

    一.TCP协议示意图: listen():监听客户端的连接,客户端有链接,listen马上就有返回. accept():连接之后,会返回客户端的信息(ip地址.端口号),如果没有连接则一直堵塞.连接成 ...

  6. python网络编程---TCP服务器

    0x01 环境 python2 pycharm 0x02 程序 客户端程序: # -*- coding:UTF-8 -*- import socket ''' target_host='www.bai ...

  7. python网络编程---TCP客户端

    0x01 环境 python2. pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_host='www.baidu.com' tar ...

  8. python网络编程自学_五分钟搞定Python网络编程实现TCP和UDP连接

    Python网络编程实现TCP和UDP连接, 使用socket模块, 所有代码在python3下测试通过. 实现TCP#!/usr/bin/env python3 # -*- coding: utf- ...

  9. Python网络编程基础之ip地址,端口号,TCP,socket

    Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...

最新文章

  1. VBA word 文件类型html,vba设置word文档的格式
  2. Win64 驱动内核编程-24.64位驱动里内嵌汇编
  3. 简化PHP开发的10个工具
  4. Codeforces Round #297 (Div. 2)D. Arthur and Walls 搜索bfs
  5. Python 处理带中文 Excel 文件
  6. iOS开发技巧 - Size Class与iOS 8多屏幕适配(一)
  7. java初始化该字符串值_java字符串数组初始化和赋值
  8. linux 文件重命名_如何在 Linux 上重命名一组文件 | Linux 中国
  9. 进程管理工具(Supervisor)笔记
  10. Collections类
  11. 使用printf函数输出其ascii。_输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。...
  12. E72上安装fring使用skypeout拨打电话
  13. yv12转nv12,nv12转I420
  14. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_4_方法引用_通过super引用父类的...
  15. java csv api_CSVAPIforJava
  16. python图像化计算器
  17. 混沌:Logistic模型
  18. 学习《华为基本法》(大结局):法的修订与接班人
  19. LU分解、LDLT分解和Cholesky分解
  20. HDMI接口是什么?HDMI接口的基础知识讲解

热门文章

  1. 1069 微博转发抽奖 (20 分)
  2. C语言~指针进阶(1)
  3. vb图标圣诞主题ico_40个图标集(以及更多!)将圣诞节带入您的设计
  4. 华为交换机的端口隔离功能
  5. 软件测试涨工资啦!你知道吗?看看你有没有达到涨薪条件?
  6. 干货!关于混合信号测试系统的那些事
  7. Android实现跑马灯效果及问题解决
  8. 在sql中截取地址中的门牌号
  9. 2019年6月19日 星期三 今日计划
  10. 关于CMSIS-DAP