1. 程式人生 > >socket 練習

socket 練習

鏈路層 命令 情況 sed con 機器 col 鏈路 exc

1、什麽是C/S架構?

C指的是client(客戶端軟件),S指的是Server(服務端軟件)

2、互聯網協議是什麽?分別介紹五層協議中每一層的功能?

互聯網協議:計算機界的英語
    OSI七層:
        應用層
        表示層
        會話層
        傳輸層
        網絡層
        數據鏈路層
        物理層
    TCP/IP四層/五層:
        應用層          應用層  :軟件 qq 暴風
        傳輸層          傳輸層  :建立端口到端口的通信 0-65535 0-1023為系統占用端口 tcp ucp
        網絡層          網絡層  :ip+mac 能找到全世界唯一的計算機 ip:找到哪一個局域網 mac:找到那一臺機器
        數據鏈路層      接口層  :定義電信號的分組方式
        物理層                  :發送01010101...電信號

3、基於tcp協議通信,為何建立鏈接需要三次握手,而斷開鏈接卻需要四次揮手

三次握手:client請求,server同意請求, client同意
四次揮手:client請求,server同意,server請求,client同意
因為:server有可能還有數據要發送

4、為何基於tcp協議的通信比基於udp協議的通信更可靠?

tcp: 可靠 對方給了確認收到信息,才發下一個,如果沒收到確認信息就重發
udp: 不可靠 一直發數據,不需要對方回應

5、?流式協議指的是什麽協議,數據報協議指的是什麽協議?

流式協議:TCP協議,可靠傳輸
數據報協議: UDP協議,不可傳輸

6、什麽是socket?簡述基於tcp協議的套接字通信流程

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。 socket == 片面說: ip + 端口
服務端:socket(),bind()綁定,listen()激活,accept(),recv(),send(),close()
客戶端:socket(),connect(),send(),recv(),close()

7、什麽是粘包? socket 中造成粘包的原因是什麽? 哪些情況會發生粘包現象?

粘包:數據粘在一起,主要因為:接收方不知道消息之間的界限,不知道一次性提取多少字節的數據造成的
數據量比較小,時間間隔比較短,就合並成了一個包,這是底層的一個優化算法(Nagle算法)

8、基於socket開發一個聊天程序,實現兩端互相發送和接收消息

server

import socket

chart = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
chart.bind(("127.0.0.1", 8080))
chart.listen(5)

while True:    # 循環鏈接
    conn, addr = chart.accept()    # 返回的是元組(客戶端的信息,ip和端口號)

    while True:    # 通訊循環
        try:
            data = conn.recv(8096).decode("utf-8")
            # if not data: break  # 僅適用於Linux操作系統(客戶端斷開),win 用try...except
            print(data)
            while True:
                msg = input(">>:").encode("utf-8")
                if 0 < len(msg) <= 8096:
                    conn.send(msg)
                    break
                else:
                    print("文字太長")

        except ConnectionRefusedError:
            break

client

import socket

chart = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
chart.connect(("127.0.0.1", 8080))

while True:
    while True:
        msg = input(">>:").encode("utf-8")
        if 0 < len(msg) <= 8096:
            chart.send(msg)
            break
        else:
            print("文字太長")
    data = chart.recv(8096).decode("utf-8")
    print(data)

9、基於tcp socket,開發簡單的遠程命令執行程序,允許用戶執行命令,並返回結果

socket 練習