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. Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

  2. Java并发编程笔记之Timer源码分析

    timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的任务,在newScheduledThreadPool出来之前我们一般会用Timer和TimerTask来做,但是Timer存在一 ...

  3. Python sqlalchemy的基本使用

    示例代码 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base fr ...

  4. rtf格式 C#设置字间距 CharacterSpacing

    richtextbox空间中操作行间距段间距都可以用发送消息解决,但是字间距却鲜有人关注,无法通过PARAFORMAT2消息解决,只能直接操作rtf格式 字间距主要就是要控制 expand expan ...

  5. 将文件内容隐藏在bmp位图中

    首先要实现这个功能,你必须知道bmp位图文件的格式,这里我就不多说了,请看:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html 接 ...

  6. Angular2入门:TypeScript的类 - 定义、继承和作用域

    一.定义和继承 二.public.private和protected

  7. Apache RocketMQ在linux上的常用命令

    Apache RocketMQ在linux上的常用命令 进入maven安装后的rocketmq的bin目录  1.启动Name Server  2.启动Broker 3.关闭Name Server 4 ...

  8. KM算法及其应用

    在二分图匹配中有最大匹配问题,使用匈牙利算法或者网络流相关算法解决,如果给每条边增加一个权值,求权值和最大的匹配方案就叫做最大权匹配问题.其实之前所说的最大匹配就是权值为1的最大权匹配. 求最大权完备 ...

  9. SpringBoot入门之集成Druid

    Druid:为监控而生的数据库连接池.这篇先了解下它的简单使用,下篇尝试用它做多数据源配置.主要参考:https://github.com/alibaba/druid/wiki/常见问题 https: ...

  10. struts2、hibernate以及spring是如何配置的

    第一次使用这3大框架进行网站编写的人没有一个清楚的流程,建起网站来会比较头疼,今天来讲讲3大框架的配置 基本流程: 用户点击页面之后,服务器收到一个请求,请求经过web.xml的拦截器过滤后进入act ...