socket

TCP/IP协议

要理解socket必须的得理解tcp/ip,它们之间好比送信的线路和驿站的作用,比如要建议送信驿站,必须得了解送信的各个细节。

TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中

应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

传输层:TCP,UDP

网络层:IP,ICMP,OSPF,EIGRP,IGMP

数据链路层:SLIP,CSLIP,PPP,MTU

socket

而socket是工作在传输层到应用层之间的

socket就在应用程序的传输层和应用层之间,设计了一个socket抽象层,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层

在tcp/ip协议中,tcp通过三次握手建立起一个tcp的链接,大致如下

     第一次握手:客户端尝试连接服务器,向服务器发送syn包,syn=j,客户端进入SYN_SEND状态等待服务器确认

    第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

   第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

第一次握手:客户端需要发送一个syn j 包,试着去链接服务器端,于是客户端我们需要提供一个链接函数

     第二次握手:服务器端需要接收客户端发送过来的syn J+1 包,然后在发送ack包,所以我们需要有服务器端接受处理函数

     第三次握手:客户端的处理函数和服务器端的处理函数

     三次握手只是一个数据传输的过程,但是,我们传输前需要一些准备工作,比如将创建一个套接字,收集一些计算机的资源,将一些资源绑定套接字里面,以及接受和发送数据的函数等等,这些功能接口在一起构成了socket的编程

 举例

服务器端

import socket
ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ser.bind(('127.0.0.1',8081))
import subprocess
ser.listen(5)

while True:
    conn, addre = ser.accept()
    while True:
        try:
            print(addre)

            msg=conn.recv(1024)
            if not msg:
                conn.close()
                break
            cmd=msg.decode('utf-8')
            p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)

            result_lines = p.stdout.read()

            err=p.stderr.read()
            if  err:
                conn.send(err)
            print(result_lines.decode('GBK'))
            if not result_lines:
                conn.send('0'.encode('utf-8'))
            conn.send(result_lines)
        except Exception as a:
            print(a)
            conn.close()
            break


# ser.close()

客户端

import socket
caller=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
caller.connect(('127.0.0.1',8081))
while True:
    cmd=input('输入命令,输入q退出')
    if cmd=='q':
        break
    caller.send(cmd.encode('utf-8'))
    msg=caller.recv(1024)
    print(msg.decode('GBK'))

caller.close()

服务器端:

其过程是首先服务器方要先启动,并根据请求提供相应服务:

(1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口(如FTP的端口可能为21)接收客户请求;

(2)等待客户请求到达该端口;

(3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

(4)返回第(2)步,等待另一客户请求。

(5)关闭服务器

客户端:

(1)打开一通信通道,并连接到服务器所在主机的特定端口;

(2)向服务器发服务请求报文,等待并接收应答;继续提出请求......

(3)请求结束后关闭通信通道并终止。

从上面所描述过程可知:

(1)客户与服务器进程的作用是非对称的,因此代码不同。

(2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。

原文地址:https://www.cnblogs.com/duGD/p/10940394.html