为什么要有套接字编程?

在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单,对OSI协议进行了封装,使我们只需要调用相应的接口就可以进行信息的接收与发送,而不用关注底层协议的实现

什么是套接字编程?

套接字是在应用层与底层之间的一个虚拟层,其中有一系列的接口,通过套接字的接口进行底层协议的设置,实际上就相当于把复杂的协议进行了隔离,只是留下接口进行设置,极大的降低了编程难度

套接字编程不知在python中使用,在其它语言中也是网络编程的实现方式,只不过调用的语法不太相同

如何使用套接字编程?

要进行套接字编程实现计算机间的信息传递至少需要两台电脑,根据C/S构架,需要编写一个客户端一个服务端

服务端的编写:

我们在进行服务端的编写时,可以参考我们使用手机的过程

import socket
import time
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 相当于买一台手机
server.bind(("127.0.0.1",8088)) # 为手机绑卡
server.listen(5) # 将手机开机进入随时可以监听电话的状态

while True:
   conn,address = server.accept()  # 等待电话的接入,获取来电显示
   while True:
       try:
           res = conn.recv(1024) # 听对方说的话
           print(res.decode("utf-8"))
           if not res:
               conn.close()  # 挂断电话
               break
           # time.sleep(10)
           conn.send(res.upper())  # 随着电话说话
       except ConnectionResetError as e:
           print(e)
           conn.close()
           break
   print("开始等待下一个客户端的链接")  

客户端的编写

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 创建一个socket对象
client.connect(("127.0.0.1",8088))  # 给服务器打电话
while True:
   msg = input("请输入信息:")
   if not msg:
       continue
   if msg in ["q"]:
       client.close()
       break
   try:
       client.send(msg.encode("utf-8"))
       msg = client.recv(1024)
       print(msg)
   except ConnectionResetError as e:
       print(e)
       client.close()
       break

在进行通讯时容易出现的问题

非正常退出的问题

当客户端进行非正常退出时:

当我们的客户端与服务端进行通讯时,客户端经常会非正常退出,此时服务端再对客户端发送数据或者接受客户端的请求服务端就会报错而导致服务器停止运行,这种事情时万万不能发生的,所以要尽量避免发生这种情况,我们需要在服务端使用异常处理机制进行处理,在检测到异常后主动与客户端断开连接。

当服务器非正常退出时:

当客户端与服务端进行通讯时,如果服务器非正常退出,此时再对服务器发送信息就会在客户端报错,导致客户端停止运行,此时也需要在客户端使用异常处理机制,在检测到异常后直接断开与服务器的链接

正常退出情况

当客户端正常退出时:

在客户端正常退出时会向服务器发送一条信息,此条信息会在服务器端显示为空字符串,此时我们只需要对接收的字符串进行判断就可以,当字符串为空时就断开与客户端的链接

当服务器进行正常退出时:

当服务器进行正常退出后,不会像客户端发送任何信息,我们只需要跟服务器异常退出时一样进行异常检测就可以,检测到异常后直接断开与服务器的链接即可

发送信息为空的情况

当客户端发送为空的字符串时,由于socket的优化机制,当检测到发送的消息为空时就默认不会进行发送,但是在客户端进行了发送,客户端进入recv等待的状态,服务器由于为检测到信息,所以还是在recv状态,此时就会进入死循环,所以我们需要对客户端发送的信息进行判断,如果是空时就直接进行循环,不进行发送

当服务器发送的字符串为空时,也会发生同样的情况,所以需要在服务端也进行判断。

day31 socket套接字编程的更多相关文章

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

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

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

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

  3. socket套接字编程 HTTP协议

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

  4. socket 套接字编程

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

  5. Linux之socket套接字编程20160704

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

  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. socket套接字编程(1)——基本函数

    TCP交互流程: 服务器:1. 创建socket:2. 绑定socket和端口号:3. 监听端口号:4. 接收来自客户端的连接请求:5. 从socket中读取字符:6. 关闭socket. 客户端:1 ...

  9. 19、网络编程 (Socket套接字编程)

    网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...

随机推荐

  1. nginx与php之间的交互方式

    1.  2种方式 TCP的socket  跟 UNIX的socket 2.TCP的socket  首先进入容器然后修改nginx下的配置文件 3. 修改/usr/local/nginx/conf/ng ...

  2. 头条编程题 万万没想到之抓捕孔连顺 JavaScript

    [编程题] 万万没想到之抓捕孔连顺 时间限制:1秒 空间限制:131072K 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 ...

  3. JVM(十一),垃圾回收之老年代垃圾收集器

    十一.垃圾回收之老年代垃圾收集器 1.Serial Old收集器(标记整理算法-单线程-Client模式下) 2.Paraller Old收集器(标记整理算法-多线程-) 3.CMS收集器(标记清除算 ...

  4. 弱势图解AC自动机

    本篇文章主要详细介绍$AC$自动机的$fail$指针: 如果有什么不完善的地方,请联系我$qwq$ 前置知识: 1.建议学一下$kmp$算法 2.$Trie$ 导入: AC自动机是用来解决多模板匹配问 ...

  5. Go程序的一生是怎样的?

    Go 程序是怎样跑起来的 原创: 饶全成 码农桃花源  刚开始写这篇文章的时候,目标非常大,想要探索 Go 程序的一生:编码.编译.汇编.链接.运行.退出.它的每一步具体如何进行,力图弄清 Go 程序 ...

  6. vim 代码块排版

    http://cookoo.iteye.com/blog/32275 方法: 1. 按v进入visual状态,选择多行,用>或<缩进或缩出 2. 通常根据语言特征使用自动缩进排版:在命令状 ...

  7. python 二维数组 转 矩阵

    x = numpy.array([[,,],[,,],[,,]]) print x print x.shape 输出 [[ ] [ ] [ ]] (3L, 3L) [Finished .2s]

  8. Java中final、finally、finalize

    简述 final 可以用来修饰类.方法.变量,分别有不同的意义: final 修饰的 class 代表不可以继承扩展: final 的变量是不可以修改的:final 的方法也是不可以重写的(overr ...

  9. 【Eureka】 作为服务注册中心,Eureka比Zookeeper好在哪里

    著名的 CAP 理论指出,一个分布式系统不可能同时满足 C(一致性) A(可用性) 和 P(分区容错性).由于分区容错性 P 是在分布式系统中必须保证的,因此我们只能在 A 和 C 之间进行权衡. Z ...

  10. cmd ora-12560协议适配器错误

    这个问题我解决了很久,其实问题的关键在于我在本机安装了一个Oracle11g数据库以及安装了一个Oracle Client,导致在使用sqlplus / as sysdba链接时出现报协议适配器的错误 ...