TCPServer.py

 #coding:utf-8

 import socket
#s 等待链接
#c 实时通讯
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#socket.AF_INET代表ipv4,socket.SOCK_STREAM代表tcp套接字
s.bind(('',23333))
#绑定ip端口 如果为空,那就是所有网络号都可以
s.listen(5)
#最大同时5个人链接 print('[+]服务端开启') while True:
try:
c,c_addr = s.accept()
#这里只能接受一个人链接,如果要链接多个客户端,需要开启多线程
#先接受客户端的连接
#阻塞形式
#client 通讯操作的套接字
#c_addr 是客户端的地址 print('有人来链接了:',c_addr)
while True:
data = c.recv(1024).decode('utf-8')
#客户端断开链接 会发送一个空字符串,长度为0
#data存储的是最大1024字节的数据
#要decode解码,以utf8的形式
if not data:
#判断接受到的数据,是不是为空,如果为空的话 就表示客户端已经断开链接
# print(type(data))
# print('----------')
# print(len(data))
# print('----------')
print('[+] 这个人走了')
break
#跳出循环,断开链接
print('这个人说',data)
msg = input('>>>')
#回复客户端
if msg == 'quit':
#如果 msg为 quit 就与客户端主动断开链接
print('[+] 与这个人主动断开链接.....')
break
c.send(msg.encode('utf-8'))
#发送的时候加码,以uff8的形式
c.close()
#断开与客户端的连接
except KeyboardInterrupt:
#ctrl+c终止程序 防止卡主
print('检测到异常 即将推出')
break print('[+] 服务器关闭')
s.close()

TCPclient.py

 #coding:utf-8

 import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#创建一个客户端链接,socket.AF_INET代表ipv4,socket.SOCK_STREAM代表tcp套接字
client.connect(('127.0.0.1',23333))
#客户端链接
print('[+] 链接成功')
#链接成功显示
while True:
msg = input('>>>')
if msg == 'quit':
#如果输入的信息是quit 就退出链接
break
if len(msg) == 0:#如果直接输入的一个回车的话
#就重新输入,因为不能发送空 ,发送空的花 客户端会卡住
continue
client.send(msg.encode('utf-8'))
#客户端发送信息msg 以utf8格式发送数据
data = client.recv(1024).decode('utf-8')
if not data:
#如果数据为空/0
#服务器主动断开s
break
print('[+] 服务器主动断开了链接......') print('服务器发来:',data) print('[+] 链接关闭...') client.close()

#注意事项:

  • 网络中传输数据的格式是二进制,所以传输的数据都要编码和解码,默认是UTF-8
  • 代码中发送和接受的数据最大为1024字节,如果大于这个数据,数据会留在缓冲区,等待下一次发送,如果要一次性发送,需要用到循环语句
  • 客户端和服务器如果断开连接的话,会发送一个空字符串,长度为0,然后对方用一个判断语句来判断是否断开链接
  • 发送的数据不能为空,假如直接按回车的话 会发送空,是不行的,程序会卡住,input对于用户输入的换行是不会读入的,因为我们都知道input是以换行作为输入结束的标志的。
    • 对于空消息:tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住,
    • QQ也是这样的,不能发送为空的内容

TCP套接字模型

  • 服务器套接字创建模型:

    • s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    • s.bind( ('', 8000) ):绑定该套接字有效地址和端口

      • 参数是一个元组

    • s.listen(5) 开启服务器

    • c,c_addr = s.accept() 阻塞等待客户端连接

      • c:客户端来访套接字来与客户端进行交流

      • c_addr:客户来访地址,(ip,port)

    • while:具体和这个客户端进行沟通

      • c.send(msg)

        • 发送数据

        • msg == byte

      • data = c.recv(1024): -> bytes

        • 接收数据

        • 接收到的也是个二进制

      • 取决于客户端发来的数据如果为空,那么就可以关闭与他的连接了。

    • c.close()

      • 关闭套接字 释放资源

    • s.close()


    • 客户端套接字模型:

      • c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      • c.connect( (ip,port) )

        • 47.104.224.67

        • 8000

      • c.recv() 接收

      • c.send() 发送

      • c.close()

        • 关闭套接字 断开连接 释放资源

  • 单进程模型下,我们写的代码,同一时间只能处理一个用户的来访信息

    • TCP是要构成连接的

python TCP socket套接字编程以及注意事项的更多相关文章

  1. UDP,TCP的套接字编程的Python实现

    UDP,TCP的套接字编程的Python实现 套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型 ...

  2. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  3. socket套接字编程 HTTP协议

    socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接 ...

  4. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  5. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  6. socket 套接字编程

    今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...

  7. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  8. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  9. Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法

    转自:http://blog.csdn.net/chuanchuan608/article/details/17915959 目前正在学习python,使用的工具为python3.2.3.发现3x版本 ...

随机推荐

  1. python基础学习笔记 - 备忘

    基础中的基础 Python标识符 命名规则: Python标识符区分大小写. 可以包括英文.数字以及下划线,但不能以数字开头. 以下划线开头的标识符是有特殊意义的: a)         以单下划线开 ...

  2. volatile 关键字了解与使用

    前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...

  3. Xcode 8.X Command Line Tools

    Summary Step 1. Upgrade Your System to macOS Sierra Step 2. Open the Terminal Application Step 3. Is ...

  4. WINDOWS内核编程(一)Hello Drv的实现

    我们开始编写第一个驱动程序,首先我们需要进行项目的创建,在以前的随笔中,我们已经学会了如何去建立双机调试环境. 我们打开VS2017,建立如图所示的项目,取名为:MyFirstDriver.点击确定 ...

  5. PHP官方网站及PHP手册

    每个人都知道php.net,我们或早或晚的都会来到这里并不断的访问它.它是PHPer的主要参考网站,拥有大量有用的信息,但是这些信息却不是那么显而易见. 比较有用的官方PHP资源: PHP官方函数手册 ...

  6. Docker系列之Docker容器(读书笔记)

    一.介绍 容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统和排在上面的应用. 二.容器 2.1 启动容器 启动容器有两种方式,一种是基于镜像新建一 ...

  7. [TJOI 2018]智力竞赛

    Description 题库链接 给出一张 \(m\) 个点的有向图.问可重最小路径覆盖是否 \(\leq n+1\) .若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值. \( ...

  8. [NOI 2017]蚯蚓排队

    Description 题库链接 蚯蚓幼儿园有 \(n\) 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从 \(1\) 到 \(n\) 的连续正整数编号.每只蚯蚓的长度 ...

  9. [牛客小白月赛4 H] 相邻的糖果

    Description 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果. 对你的要求如下: ·任何m个相邻的盒子内糖果数 ...

  10. C++ QT中自定义控件的简单创建

    为了给控件添加自定义的方法以及重绘控件,我们需要自定义控件来达到自己希望的结果,网上的自定义控件文章比较少,并且过程比较粗略. 此教程以中文版的QT Creator进行介绍 首先我们创建一个新的项目, ...