首页 > 其他分享 >socket

socket

时间:2024-05-15 14:07:48浏览次数:15  
标签:UDP socket kill 进程 接字 服务端 客户端

Socket层
【一】Scoket层在哪
还是用图来说话,一目了然。
【二】什么是socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面
对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
也有人将socket说成ip+port
ip是用来标识互联网中的一台主机的位置
而port是用来标识这台机器上的一个应用程序
ip地址是配置到网卡上的
而port是应用程序开启的
ip与port的绑定就标识了互联网中独一无二的一个应用程序
而程序的pid是同一台机器上不同进程或者线程的标识
【三】套接字发展史及分类
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。
因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。
一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。
这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是
基于文件型的
基于网络型的。
【1】基于文件类型的套接字家族
套接字家族的名字:
AF_UNIX
unix一切皆文件
基于文件的套接字调用的就是底层的文件系统来取数据
两个套接字进程运行在同一机器
可以通过访问同一个文件系统间接完成通信
【2】基于网络类型的套接字家族
套接字家族的名字:
AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现
所有地址家族中,AF_INET是使用最广泛的一个
python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
【三】套接字工作流程
一个生活中的场景。
你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。
等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
【0】服务端流程
先从服务器端说起。
服务器端先初始化Socket
然后与端口绑定(bind),对端口进行监听(listen)
调用accept阻塞,等待客户端连接。
在这时如果有个客户端初始化一个Socket
然后连接服务器(connect)
如果连接成功,这时客户端与服务器端的连接就建立了。
客户端发送数据请求,服务器端接收请求并处理请求
然后把回应数据发送给客户端,客户端读取数据
最后关闭连接,一次交互结束
socket()模块函数用法
【1】服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
【2】客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
【3】公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
【4】面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
【5】面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
【四】基于TCP的套接字
【1】方法简介
tcp是基于链接的
必须先启动服务端
然后再启动客户端去链接服务端
tcp服务端
tcp客户端
【2】打电话模型
socket通信流程与打电话流程类似
我们就以打电话为例来实现一个low版的套接字通信
(1)服务端
(2)客户端
【3】打电话模型升级版
加上链接循环与通信循环
(1)服务端改进版
客户端改进版
【五】基于UDP的套接字
udp是无链接的,先启动哪一端都不会报错
【1】方法简介
(1)UDP服务端
(2)UDP客户端
【2】示例模版
(1)UDP服务端
(2)UDP客户端
【3】QQ聊天模拟
qq聊天(由于udp无连接,所以可以同时多个客户端去跟服务端通信)
(1)UDP服务端
(2)UDP客户端
[1]客户端一
[2]客户端二
【六】基于TCP协议的简单套接字(打电话模型)
【1】初代(一次信息)
(1)服务端
(2)客户端
(3)问题
信息只能传输一次,无法做到持续发送信息
【2】二代(多次信息-循环结束条件)
(1)服务端
(2)客户端
【3】三代(多次信息-信息为空)
(1)服务端
(2)客户端
(3)问题
客户端强制终止程序时,服务端会产生一系列问题
【4】四代(检测用户信息为空)
(1)服务端
(2)客户端
【5】五代(完善版)
(1)说明
服务端应该满足的特点
服务端一直提供服务
在建立连接与结束链接之间再加上一层 循环
服务端并发提供服务
(2)服务端
(3)客户端
【七】基于UDP协议的简单套接字
【1】UDP协议
UDP协议 -----> 数据报协议
【2】空数据的处理
TCP协议是水流式协议:传入的数据不能为空,因为水是一直流的,在传输过程中不会对数据进行操作
UDP协议是数据报协议:传入的数据可为空,在传输过程中UDP会对数据进行内部的拼接和处理
【3】断开链接的影响
TCP协议是水流式协议:在建立链接过程中,服务端和客户端的链接是一直存在的,断开一方都会对另一方造成影响
UDP协议是数据报协议:在建立链接过程中,是通过解析对方数据中的ip和端口,再向另一方返回数据的,所以一方发生问题并不会影响到另一方
【4】模版
(1)服务端
(2)客户端
【5】应用(聊天室)
客户端输入消息
将数据上传到服务器
服务器解析收到的数据,根据接收到的数据进行返回数据
【补充】端口占用问题
【1】问题引入
有的同学在重启服务端时可能会遇到
这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址
【2】解决方法
(1)方法一(Windows/MacOS)
(2)方法二(Linux)
发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决
编辑文件,加入以下内容
参数说明
然后执行 /sbin/sysctl -p 让参数生效。
【补充】端口冲突问题
【1】问题引入
有些时候重启服务会遇到如下问题
这个问题的原因是当前服务没有正常被杀死,导致端口被占用,无法再在当前端口上启动服务
【2】解决办法
(1)Windows系统
[1]进入cmd窗口
进入windows中的命令行窗口(win+R之后输入cmd就可以进去)
[2]过滤当前端口号进程
输入以下命令查看当前启动服务的端口号
此时你应该能看到一串进程,最后位置的数字即为进程号
[3]杀死当前进程
杀死进程
Shell
复制代码
1
taskkill /pid 进程号 /F
(2)MacOS系统
[1]进入到终端窗口
[2]过滤当前端口号进程
Shell
复制代码
1
ps aux|grep 端口号
[3]杀死当前进程
Shell
复制代码
1
kill 进程号 -9
[4]补充:kill 命令的用途
kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。
我们来看一下 man page 对它的解释:kill - send a signal to a process.从官方的解释不难看出,kill 是向进程发送信号的命令。
当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。
事实上如果我们不给 kill 命令传递信号参数,它默认传递终止进程运行的信号给进程!这是 kill 命令最主要的用法
一般情况下,终止一个前台进程使用 Ctrl + C 就可以了。
对于一个后台进程就得用 kill 命令来终止。
我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。
kill 命令格式
使用kill -l命令列出所有可用的信号。
最常被使用的信号是1/9/15:
Shell
复制代码
1
2
3
4
5
6
1(HUP):重新加载进程。
9 (KILL):杀死进程。
15(TERM):完美地停止一个进程。
kill pid //同下-15默认的安全停止进程
kill -15 pid //
kill -9 pid //彻底杀死进程

标签:UDP,socket,kill,进程,接字,服务端,客户端
From: https://www.cnblogs.com/zenopan101861/p/18193766

相关文章

  • 架构,七层协议,socket
    Ⅰ软件开发架构【一】架构分类【1】C/S架构C:client(客户端)S:server(服务端)'''类比学习: 客户端相当于是需要体验服务的客人 服务端相当于是对外提供服务的店面 我们手机上下载的各种app其实就是各大厂家的客户端 打开app使用该功能的时候就是相当于是基于网络去到......
  • java.net.SocketException: Connection reset
    今天在学习socket编程的时候遇到了一个bug:java.net.SocketException:Connectionreset先来看一下自己的代码:服务端:publicclassServerSocketDemo{publicstaticvoidmain(String[]args){try{//建立一个ServerSocketServerS......
  • linux socket 多个 socket 复用同一个 ip 和 port
    在Linux系统中,对于UDPsocket,与TCPsocket相比,其行为略有不同。UDP是无连接的协议,通常不需要建立连接,因此它的端口复用规则也有所不同。默认情况下,每个UDPsocket绑定到一个唯一的IP地址和端口组合。然而,从Linux内核版本3.9开始,引入了SO_REUSEADDR和SO_REUSEPORT......
  • 调试-网络-如何查看tcp socket recv buffer size
    客户端与服务器建立tcp连接后,在服务器上执行ss-imdst目标IP地址来检查skmemrb值:tcpESTAB00192.168.99.124:ssh192.168.99.......
  • Java使用Socket传输数据
    importsun.swing.UIAction;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.*;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.net.Socket;import......
  • 基于webapi的websocket聊天室(三)
    上一篇处理了超长消息的问题。我们的应用到目前为止还是单聊天室,这一篇就要处理的多聊天室的问题。思路第一个问题,怎么访问不同聊天室这个可以采用路由参数来解决。我把路由设计成这样/chat/{room}。访问不同路径就代表进入不同聊天室。第二个问题,怎么创建不同的聊天室原......
  • 基于webapi的websocket聊天室(二)
    上一篇-基于webapi的websocket聊天室(一)消息超传缓冲区的问题在上一篇中我们定义了一个聊天室WebSocketChatRoom。但是每个游客只分配了400个字节的发言缓冲区,大概100字。如果需要发送更多内容呢?难道直接增大缓冲区?这是一个办法。但还有其他办法。多次接受消息可以多次调......
  • SpringBoot3集成WebSocket
    标签:WebSocket,Session,Postman。一、简介WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工、双向的通信通道,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,在WebSocket的API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创......
  • 基于webapi的websocket聊天室
    上一次我已经讲了在webapi主机上面加入websocket中间件。这次就更进一步,搭建一个websocket局域网聊天室。传送门-->webapi添加添加websocket中间件聊天室websocket通信其实和win32api里面的消息循环差不多,只不过一个消息来自操作系统,一个来自网络。但核心都是一个阻塞的while......
  • 实时行情数据源接口websocket接入方法
    ​支持如下产品对接:外汇、国际期货、国内期货、国际金银、数字货币、股指期货、美股、印度股、港股、台股、A股产品代码获取地址:http://39.107.99.235:1008/market/market.php产品代码:比特币btcusdt以太坊ethusdt恒指期货HSI德指期货DAX英镑美元fx_sgbpusd欧......