Socket网络编程和工作流程

1、Socket处于什么位置呢?

如图,socket这套通信编程接口处于TCP/UDP协议之上,介于应用层和传输层之间。用上socket,你不需要关心数据包是怎么封包、拆包、怎么进行数据校验的了,你只需要通过几条命令,简单的跟远程服务器连起来,发数据就行了。

 2、什么是Socket?

Socket又被翻译成"套接字",是基于TCP/IP协议封装出来的一套编程接口,Socket把底层复杂的TCP/IP协议的各种细节给你隐藏了,封装成了简单的可操作的编程API接口,提高开发人员写网络通信软件的开发效率。如果你想写一个像qq、微信这样的CIS架构的通信软件,就可以基于Socket,而不是自己生写原生的TCP/IP协议底层的东西。**注意Socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口

3、Socket工作流程?

 直接上手代码一个简单的Socket连接

文字流程

Socket 协议类型:
    Tcp --- socket.SOCK_STREAM
    Udp --- socket.SOCL_DGRAM
    Raw --- ip层 socket.SOCK_RAW
地址簇:
    面向文件的socket通信
        本机进程间通讯

    面向网络协议 的socket通信
        ip v4 socket.AF_INET
        ip v6 socket.AF_INET6

Socket 工作流程:

    server端:
                1、买个手机  初始化一个socket实例   ,类 s= socket.socket()
                2、 买个电话卡  ,号码 ,卡绑定到手机上面   # 绑定 IP+端口  s.bind(ip,port)
                3、 开机  监听端口 s.listen()
                4、 等电话  等待连接  s.accept()

     client端:
                1、有个手机
                2、绑定电话号
                3、开机
                4、拨号

'''
Socket 协议类型:
    Tcp --- socket.SOCK_STREAM
    Udp --- socket.SOCL_DGRAM
    Raw --- ip层 socket.SOCK_RAW
地址簇:
    面向文件的socket通信
        本机进程间通讯

    面向网络协议 的socket通信
        ip v4 socket.AF_INET
        ip v6 socket.AF_INET6


Socket 工作流程:

    server端:
                1、买个手机  #初始化一个socket实例   ,类 s= socket.socket()
                2、 买个电话卡  ,号码 ,卡绑定到手机上面   # 绑定 IP+端口  s.bind(ip,port)
                3、 开机  #监听端口 s.listen()
                4、 等电话  # 等待连接  s.accept()


     client端:
                1、有个手机
                2、绑定电话号
                3、开机
                4、拨号
'''
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #ipv4 +TCP  第一步:实例化
s.bind(('0.0.0.0',9000)) #绑定  #第二步:绑定ip 和 端口
s.listen(2) #第三步:显示运行挂起多少个连接
print('------------开始等待客户端连接进来---------------')
client_conn,client_addr = s.accept()  #等待客户端连接,当一个连接进来,你就会为这个连接生成一个专门的实例
'''
s.accept() 会生成一个客户端的实例连接conn和一个客户端的地址addr,所以我们用两个变量来接收他!
    client_conn相当于一个连接,可以发送消息也可以接收消息
    1、在这里我们发送消息时,需要调用该连接
'''
print(client_conn,client_addr)
client_conn.send('你好!我是小贝!!'.encode())  #encode()不写默认为utf-8--------发数据给客户端!
'''
注:发送消息的时候,只能发送字节类型,字符串类型在每台电脑都是不同的,发送字符串类型很容易在别的电脑上面出现乱码!!
'''

data =client_conn.recv(1024)  #接收客户端的数据,recv()括号内书写要接收的字节数!这里是1024字节
print(data.decode())

client_conn.close()     #关闭跟客户端的连接
s.close()#把整个服务器给关掉-----关掉socket服务器!



import socket
cli=socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #ip + TCP协议
cli.connect(('localhost',9000))#接收服务器地址和端口
''''
注:这里括号内的是一个元组,连接socket的服务器的地址和端口
连接服务器后,需要接收消息recv!
'''
data=cli.recv(1024) #说明接收的字节数最大为1024个字节
print(data) #显示的是接收的服务器端的数据
print(data.decode())    #因为接收的数据是未解码的,只有解码之后才能显示为中文

cli.send('你好!我叫小李!!'.encode())#默认为utf-8

cli.close()

代码结果图:

总结:

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信  

Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。 Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制

主要类型如下:

1.流套接字(SOCK_STREAM)

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议  。

2.数据报套接字(SOCK_DGRAM)

数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理  。

3.原始套接字(SOCK_RAW)

原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接   。

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127217108
今日推荐