python TCP socket套接字编程以及注意事项

时间:2022-09-14 09:44:53

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是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住,
    • python TCP socket套接字编程以及注意事项
    • 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. 基于TCP协议的socket套接字编程

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

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

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

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

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

  9. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

随机推荐

  1. CODEVS3037 线段覆盖 5[序列DP 二分]

    3037 线段覆盖 5   时间限制: 3 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Description 数轴上有n条线段,线段的 ...

  2. Maven 实战

    http://www.cnblogs.com/chowmin/category/599392.html

  3. Simple colum formatting in Yii 2 GridView

    A very important widget in the business apps development is the GridView control. In this post I wil ...

  4. 在Spring的bean中注入HttpServletRequest解密

    我们可以在Spring的bean中轻松的注入HttpServletRequest,使用@Autowired HttpServletRequest request;就可以了. 但是,为什么我们可以直接这 ...

  5. java笔试一

    JAVA相关基础知识2.String是最基本的数据类型吗?基本数据类型包括byte.int.char.long.float.double.boolean和short.java.lang.String类 ...

  6. makefile里有哪些target?

    make help or grep ^[a-z].*\:$ Makefile | sed s,:,,g

  7. CentOS 设置网络(修改IP&修改网关&修改DNS)

    CentOS修改IP地址 # ifconfig eth0 192.168.1.80 这样就把IP地址修改为192.168.1.80(如果发现上不了网了,那么你可能需要把网关和DNS也改一下,后面会提到 ...

  8. [BZOJ]4405: [wc2016]挑战NPC(带花树)

    带花树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  9. Spring boot整合Mybatis

    时隔两个月的再来写博客的感觉怎么样呢,只能用“棒”来形容了.闲话少说,直接入正题,之前的博客中有说过,将spring与mybatis整个后开发会更爽,基于现在springboot已经成为整个业界开发主 ...

  10. META-INF文件夹中的MANIFEST&period;MF 的作用

    manifest文件是用来描述jar包的,它描述了该jar包的代码是谁的,什么版本,使用什么版本的类库等等....具体如下: 1.基础格式 manifest 文件的格式是很简单的,每一行都是 名-值 ...