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. package.json文件中dependencies和devDependencies的区别

    在工作和学习中,我经常会用的npm 下载各种包,有时就会遇到各种npm 的形式,现在就捋一捋 首先要先了解   package.json文件中dependencies和devDependencies的 ...

  2. interface21 - web - DispatcherServlet(DispatcherServlet初始化流程)

    前言 最近打算花点时间好好看看spring的源码,然而现在Spring的源码经过迭代的版本太多了,比较庞大,看起来比较累,所以准备从最初的版本(interface21)开始入手,仅用于学习,理解其设计 ...

  3. MySQL分布式jdbc连接

    参考文档: https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-multi-host-connections.html 服务器故障转移 连 ...

  4. SaltStack快速入门-配置管理

    1:定义远程配置时描述位置,salt配置用的是一种yaml的描述语法,saltstack也是可以分环境的,比如测试环境.生产环境,默认是base,base也是必须存在的,修改内容如下: file_ro ...

  5. 在JS中统计函数执行次数与执行时间

    假如想统计JS中的函数执行次数最多的是哪个,执行时间最长的是哪个,该怎么做呢? 1. 统计函数执行次数 2. 统计函数执行时间 3. 如何控制函数的调用次数 4. 如何控制函数的执行时间 一.统计函数 ...

  6. SpringMVC4+Hibernate5+SQLServer 2014 整合(包括增删改查分页)

    前言 前面整合完了SpringMVC+MyBatis,自然也少不了SpringMVC+Hibernate,严格来说Hibernate才是我们真正想要的ORM框架么.只记得最初学习hibernate时, ...

  7. SPI OLED 驱动

    根据之前说过的 SPI 驱动的框架,在我们添加 SPI 设备驱动的时候需要与 SPI Master 完成匹配,通过 spi_register_board_info 进行注册. 构造设备 static ...

  8. Linux C++开发学习(一)

    一.简单输出 简单的小程序 1.安装g++ sudo install g++ 2.编写c++程序,helloworld.cpp #include<iostream> using names ...

  9. WPF 使用 Direct2D1 画图入门

    本文来告诉大家如何在 WPF 使用 D2D 画图. 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WP ...

  10. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...