zoukankan      html  css  js  c++  java
  • day29 socket

    socket

    socket 通信简单述说
    
    网络通信的步骤
    1)确定对端的ip地址
    2)确定应用程序的端口
    3)确定通信协议
    
    网络通信的过程其实就是一个(源端)不断封装数据包和(目的端)不断拆包的过程
    
    socket编程   tcp  udp 协议:
    tcp/ip 即传输控制协议/网间协议 定义了主机如何连接到internet 及数据如何在它们之间传输的标准
    tcp/ip协议是指因特网整个tcp/ip协议簇, 不同于ios7层模型, tcp/ip协议参考模型把所有的tcp/ip协议归类到四个抽象层中: 应用层(TFTP  HTTP SNMP FTP SMTP DNS Telent)    传输层(tcp  udp) 网络层(IP IGMP ICMP)  数据链路层
    上层建立在下层服务上,下层为上层提供服务
    
    我们利用ip地址+协议+端口号唯一标识: 网络中一个进程。能够唯一标识网络中的一个进程后,它们就能通过socket通信了
    我们把socket翻译为套接字
    socket是应用层 与传输层(tcp/ip协议簇通信)的一个抽象层,是一组接口,它把tcp/ip复杂的操作抽象为几个简单的接口供应用层调用,实现进程间的网络通信
    应用程序两端通过套接字向网络发出请求  或应答网络请求  可以把socket理解为网络把手(hand)
    socket 起源于 Unix, 在Unix一切皆文件哲学思想下 socket是打开--读/写--关闭模式的实现
    服务器和客户端维护一个文件,在建立连接打开后可以向自己文件写入内容,供对象的读取或读取对方的文件内容,通信结束后关闭文件
    流程描述
    
    1) 服务端根据地址类型(ipv4 ipv6)socket类型协议创建socket
    
    2)服务端为socket绑定ip+端口
    
    3)服务端监听端口请求随时接收客户端发来的连接,这时服务端的socket没有被打开。
    
    4) 客户端创建socket
    
    5)客户端创建socket 根据服务端ip地址和端口号连接服务器的socket
    
    6) 服务端的socket接收客户端的socket请求,被动打开,开始接收客户端的请求,直到客户端返回连接信息,这时socket进入阻塞状态,阻塞就是accept() 方法,一直等到客户端返回连接信息后才返回,开始接收下个客户端请求
    
    7)客户端连接成功后 向服务端发送连接状态信息
    
    8)服务端accept方法返回 连接成功
    
    9)客户端向socet 写入信息(或服务端向客户端写入信息)
    
    10)服务端(客户端)读取信息
    
    11) 客户端关闭
    
    12) 服务端关闭

    简单的

    import socket
    ip_addr = ("127.0.0.1",6666)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(ip_addr)
    s.send("kehuduan".encode("utf-8"))
    data = s.recv(1024)
    print(data.decode("utf-8"))
    socket_client
    import socket
    ip_addr = ("127.0.0.1",6666)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind (ip_addr)
    s.listen(5)
    conn,addr = s.accept()
    msg = conn.recv(1024)
    print("----->",msg)
    conn.send("server".encode("utf-8"))
    conn.close()
    s.close()
    python_server

    简单的web

    #!/usr/bin/env python
    #encoding:utf-8
    
    
    import socket
    ip_addr = ("192.168.2.22",8083)
    
    def hand_request(client):
        buf = client.recv(1024)
        client.send("HTTP/1.1 200 OK
    
    ".encode("utf-8"))
        client.send("yslysl".encode("utf-8"))
    
    def main():
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.bind(ip_addr)
        s.listen(5)
    
        while True:
            conn,addr = s.accept()
            hand_request(conn)
            conn.close()
    main()
    web

    模拟10086

    import socket
    
    ip_addr = ("127.0.0.1",8888)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(ip_addr)
    
    while True:
        data = s.recv(1024)
        print(data.decode("utf-8"))
        inp = input("please input>>>>>  ").strip()
        s.send(inp.encode("utf-8"))
        if inp == "exit":break
    s.close()
    client
    import socket
    
    ip_addr = ("127.0.0.1",8888)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(ip_addr)
    s.listen(5)
    
    while True:
        conn,addr = s.accept()
        conn.send("欢迎致电10086".encode("utf-8"))
        Flag = True
        while Flag:
            data = conn.recv(1024).strip()
            print(data)
            if data == "exit".encode("utf-8"):
                Flag = False
            elif data == "0".encode("utf-8"):
                conn.send("可能被录音".encode("utf-8"))
            else:
                conn.send("重新输入".encode("utf-8"))
        conn.close()
    server
  • 相关阅读:
    用户管理
    网线制作与分类
    5.虚函数,覆盖,多态,异常处理
    4.类的继承
    3.运算符重载
    7.STL
    6.泛型编程与模板
    C++中>>,<<的重载问题
    2.名字空间和构造函数
    1.C和C++的区别
  • 原文地址:https://www.cnblogs.com/augustyang/p/9530830.html
Copyright © 2011-2022 走看看