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. FTP上传心得

    最近出了一个问题就是在本地上传FTP没有一点问题 可是部署到服务器上.上传的时候总是false.解决办法 ftp.enterLocalPassiveMode();boolean storeFile = ...

  2. 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 3.Programming assignments:Jazz improvisation with LSTM

    Improvise a Jazz Solo with an LSTM Network Welcome to your final programming assignment of this week ...

  3. CSS--最最最基础操作

    CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. h1 {color:red; font-size:14px;} css的四种引入方式 1.行内式  行内式是在标记的style属性中设定 ...

  4. 手把手教您定制化Centos6.x安装界面

    1.获取安装界面代码      挂载image/install.img:mount image/install.img /mnt/5 -o loop      复制挂载后的代码至self_intall ...

  5. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  6. Linux常用命令-vim

    vim的基本模式 1普通模式Normal mode 输入vim命令后进入的就是普通模式. 2插入模式Insert mode 这是内容修改编辑的模式, 在普通模式进入插入模式方法 按i或insert 在 ...

  7. kibana从入门到精通-Kibana配置详解

    配置 Kibana Kibana server 启动时从 kibana.yml 文件中读取配置属性.Kibana 默认配置 localhost:5601 .改变主机和端口号,或者连接其他机器上的 El ...

  8. leetcode — generate-parentheses

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  9. 如何编写package.json配置NodeJS项目的模块声明

    在NodeJS项目中,用package.json文件来声明项目中使用的模块,这样在新的环境部署时,只要在package.json文件所在的目录执行 npm install 命令即可安装所需要的模块. ...

  10. netty源码解解析(4.0)-7 线程模型-IO线程EventLoopGroup和NIO实现(二)

    把NIO事件转换成对channel unsafe的调用或NioTask的调用 processSelectedKeys()方法是处理NIO事件的入口: private void processSelec ...