socket 套接字编程

目录

  • SOCKET

    • 一、基于TCP协议的socket套接字编程

      • 1.1 什么是socket
      • 1.2 套接字分类
      • 1.3 套接字工作流程
    • 二、基于udp协议的套接字编程
    • 三、UDP协议和TCP协议的区别
      • 3.1 udp协议的特点
      • 3.2 UDP和TCP的区别

SOCKET

一、基于TCP协议的socket套接字编程

1.1 什么是socket

? socket是应用层和传输层之间的一个抽象层,我们经常把socket称为套接字,它是一组接口,把TCP/IP层的复杂操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

? 在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

1.2 套接字分类

  • 基于文件类型的套接字家族:AF_UNIX,两个套接字进程只能运行在同一台机器上,现在基本不用这个
  • 基于网络类型的套接字家族:AF_INET,这是使用最广泛的一个,可以在不同机器上使用

1.3 套接字工作流程

先从服务器端说起,服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。下面直接用代码举例:

  • 基于TCP协议的简单套接字编程
# 简单的tcp通信服务端
# 以买手机打电话举例,socket.SOCK_STREAM表示建立tcp连接,socket.SOCK_DGRAM表示建立udp连接
# 导入socket模块
import socket
# 实例化一个socket对象(买了个手机)
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定ip地址(插电话卡),参数传元组:(ip,端口号)
# soc.bind(('127.0.0.1',8080))  # ip写127.0.0.1,只能自己访问
soc.bind(('192.168.11.176',8080))  # 如果写本机ip,局域网外部可以访问
# 监听(手机开机),这个5是半连接池的大小
soc.listen(5)
# 等待客户端连接(等待别人给我打电话)
print('start>>>')
conn,addr = soc.accept()   # conn:通路(三次握手建立的双向连接),addr:(客户端的ip,端口)
# 通信:收/发消息
data = conn.recv(1024)  # 一次最大接收1024字节数
print('来自客户端的数据>>>',data)
# 发送数据,数据必须是bytes格式
conn.send(data.upper())  # 把接收到的客户端的数据变成大写发送回去
# 关闭通路(挂断电话)
conn.close()
# 关闭连接(销毁手机)
soc.close()
# 简单的tcp通信客户端

import socket
# 创建一个socket对象
soc = socket.socket()  # 不传参默认是tcp协议
# 连接服务端
soc.connect(('192.168.11.176',8005))  # 指定服务端ip和端口
# 通信:发/收消息
soc.send(b'zyl')  # 发送数据,必须是bytes格式,也可以用soc.send('zyl'.encode('utf8'))
data = soc.recv(1024)  # 接收数据
print('收到服务端的数据>>>',data)
# 关闭连接
soc.close()
  • 加入连接和通信循环的基于TCP协议的套接字编程
# 服务端

import socket
# 生成一个socket对象
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定地址和端口号
soc.bind(('127.0.0.1',8005))  # 127.0.0.1只能自己访问
# 监听(半连接池的大小,不是连接数)
soc.listen(5)
# 等待客户端连接
while True:  # 连接循环
    print('等待客户端连接')
    conn,addr = soc.accept()  # 卡住,如果没有客户端连接,会一直卡在这,当有客户端连接,才继续往下走
    print('有个客户端连接上了',addr)
    while True:  # 通信循环
        try:
            # windows如果客户端断开,会报错,所以加了try
            # linux如果客户端断开,不会报错,会收到空,所以当data为空时,也break
            # 等待接收,最大收取1024个字节
            data = conn.recv(1024)   # 会卡住,当客户端有数据过来,才会执行
            if len(data) == 0: # 处理linux客户端断开,在window下这段代码根本不会执行(即便是客服端发了空,也不会走到这行代码)
                break
            print(data)
            conn.send(data.upper())
        except Exception:
            break
    # 关闭通路
    conn.close()
# 关闭连接
soc.close()
# 客户端

import socket
# 创建一个socket对象
soc = socket.socket()
soc.connect(('127.0.0.1',8005))

while True:  # 通信循环
    in_s = input('请输入要发送的数据>>>').strip()
    # 发送的数据必须是b格式,in_s.encode('utf-8')  把字符串编码成b格式
    # 把b格式转成字符串
    # ss=str(b'hello',encoding='utf-8')
    # ss=b'hello'.decode('utf-8')
    # #把字符串转成b格式
    # by=bytes('hello',encoding='utf-8')
    # by='hello'.encode('utf-8')
    soc.send(in_s.encode('utf8'))  # 发送数据给服务端
    data = soc.recv(1024)   # 接收服务端发送的数据
    print('收到服务端数据>>>',data)

# 关闭连接
soc.close()

二、基于udp协议的套接字编程

这里就直接写加入通信循环后的服务端和客户端,因为udp协议不需要建立连接

# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8005))
while True:  # 通信循环
    data,addr = server.recvfrom(1024)  # udp协议无需等待连接和监听
    print(data)
    server.sendto(data.upper(),addr)  # 返回处理好的数据给客户端
    
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
while True:  # 通信循环
    msg = input('请输入要发送的数据>>>').strip()
    # 直接发送数据
    client.sendto(msg.encode('utf8'),('127.0.0.1',8005))  # 发送bytes格式的数据和地址
    # 接收数据
    data = client.recvfrom(1024)
    print(data)

三、UDP协议和TCP协议的区别

3.1 udp协议的特点

  • 不需要建立连接,不需要监听,可以直接发送数据,不需要回执,客户端和服务端谁端口都不影响发送,它只管发送,所以不可靠
  • 可以发送空内容,没有粘包问题,但是会丢包,不管客户端或服务端是否收到,它只管发,所以不可靠

3.2 UDP和TCP的区别

TCP UDP
可靠连接 不可靠连接
基于数据流的传输 基于数据报的传输
粘包 不粘包
不丢包 丢包

原文地址:https://www.cnblogs.com/zhuangyl23/p/11503344.html

时间: 2024-11-14 02:38:17

socket 套接字编程的相关文章

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

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

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

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

socket套接字编程

socket套接字编程 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发         详见网络通信原理   socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Soc

socket套接字编程 HTTP协议

socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字)  >数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字编程  服务端流程  

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一个UDP协议的服务器 server.bind(("127.0.0.1",8080)) while True: data,addr = server.recvfrom(1024) server.sendto(data.upper(),addr) server

基于TCP协议的socket套接字编程

基于TCP协议的socket套接字编程 一.什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. [ 注意:也有

基于UDP协议的socket套接字编程

基于UDP协议的socket套接字编程 一.UDP套接字简单示例 1.1 服务器 import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议->UDP server.bind(('127.0.0.1', 8080)) while True: data, client_addr = server.recvfrom(1024) print('===>', data, client_addr) ser

Linux之socket套接字编程20160704

介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是 两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层,网络层,网络访问层. 其中应用层包括: 超文

Python网络编程—socket套接字编程(UDP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) UDP套接字编程 服务端流程 1.创建数据报套接字 sockfd = socket