zoukankan      html  css  js  c++  java
  • 初识socket

    初始socket网络编程

    概念

    要想理解socket,就要先来理解TCP,UDP协议。

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,

    TCP/IP是TCP和IP协议的合称,TCP/IP协议是指因特网整个TCP/IP协议族。TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中

    应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
    传输层:TCP,UDP
    网络层:IP,ICMP,OSPF,EIGRP,IGMP
    数据链路层:SLIP,CSLIP,PPP,MTU

    我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,我们经常把socket翻译为套接字,socket是在应用层和传输层(TCP/IP协议族通信)之间的一个抽象层,是一组接口,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

    应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand)
    socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。socket的英文原义是“插槽”或“插座”,就像我们家里座机一样,如果没有网线的那个插口,电话是无法通信的。Socket是实现TCP,UDP协议的接口,便于使用TCP,UDP。

    三次握手简单示意图

    socket通信流程

    python实现

    服务端

    # -*- coding: utf-8 -*-
    # @Time : 2018/9/16 21:16
    # @Author : cxa
    # @File : server.py
    # @Software: PyCharm
    import socket
    
    # 两个参数family type
    # family地址簇:
    # 服务器间的通信
    # AF_INET(ipv4的参数,默认),AF_INET6(ipv6的参数)
    # AF_UNIX(unix间的通信)
    # type:SOCK_STREAM(TCP协议用),SOCK_DGRAM(UDP协议用)
    # -------------------------------------------------------
    
    # 创建socket对象
    sk = socket.socket()
    print("创建socket对象", sk)
    # 绑定IP地址和端口
    address = ('127.0.0.1', 8000)
    sk.bind(address)
    # 监听,最大支持的客端端连接数。这里是3个。
    sk.listen(3)
    print("waiting............")
    
    # accept阻塞,直到有客户端链接过来。
    conn, addr = sk.accept()  # conn 客户端的sk对象。
    
    # conn.send("服务端:你好".encode("utf-8")) #传输的要是字节类型
    conn.send(bytes("服务端:你好", "utf-8"))
    print(conn, addr)
    
    conn.close() #终止一个socket对象
    #sk.close() #关闭服务,一般使用上面的方式关闭
    
    

    客户端

    # -*- coding: utf-8 -*-
    # @Time : 2018/9/16 22:15
    # @Author : cxa
    # @File : client.py
    # @Software: PyCharm
    import socket
    
    # 客户端 和服务器端的sk对象没关系。
    sk = socket.socket()
    address = ('127.0.0.1', 8000)
    sk.connect(address)
    data = sk.recv(1024)  # 设置最大收1024K,阻塞直到接收信息。
    # info=data.decode("utf-8")
    info = str(data, 'utf-8')
    print(info)  # 因为接收的是字节类型,所以需要转成字符串查看。
    
    # 关闭当前通道
    sk.close()
    
    
  • 相关阅读:
    卷积神经网络
    卷积神经网络导览
    初识区块链——用JS构建你自己的区块链
    揭秘菜鸟仓储体系“大脑”:智能波次如何实现仓库降本提效?
    JQuery操作Iframe
    Spring MVC 学习笔记(二)
    SpringMVC各种视图
    Spring MVC 学习笔记(一)
    为什么在MySQL数据库中无法创建外键?(MyISAM和InnoDB详解)
    数据库访问性能优化
  • 原文地址:https://www.cnblogs.com/c-x-a/p/9658085.html
Copyright © 2011-2022 走看看