2.网络编程--练习

.面向连接与无连接的区别?
套接字:最初用于一台主机进程与进程之间的通信,后来用于网络之间的通信。任何类型的通信开始之前,网络程序必须创建套接字,即通信端点!
1.面向连接,在通信开始之前,必须先建立一个连接。无连接,在通信开始之前,不需要先建立连接。
2.面向连接通信的主要通信协议是TCP,提供序列化、可靠的、不重复的数据交付,没有记录边界。就是说每个消息可以拆分成多个片段,且每个消息片段都确保能够到达目的地,然后后将它们按顺序组合在一起,再形成完整的消息交付给对方。
无连接通信的主要协议是UDP,在数据传输过程中,无法保证数据的顺序性、可靠性、重复性,但是它保存了记录边界。就是说消息是整体发送的,而非片段。
3.面向连接在网络传输时,使用TCP/IP协议组合;在非网络传输时,使用TCP/AF_LOCAL或TCP/AF_UNIX协议组合。
无连接在网络传输时,使用UDP/IP协议组合。
4.面向连接使用的套接字的类型是SOCK_STREAM,无连接使用的套接字类型是SOCK_DGRAM;
补充:TCP,全称transmission control protocol,传输控制协议;UDP,全称User Datagram Protocol,用户数据报协议
补充:那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程序:“我已经拿到了!(一个“ACK”包)。如果数据包发的送者在5秒内没有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个使用UDP协议的程序员来说是非常必要的。
    无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。
二、举例说说C/S架构

服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。其存在的目的就是等待客户端的请求,并响应他们(提供服务),然后等待更多的请求。

补充:CS与BS的区别:CS双向通信。任务分别在客户端和服务端运行,减少服务端压力。但是客户端需要客户端软件,因此在维护成本上很大。

B/S结构,即Browser/Server(浏览器/服务器)结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。
补充:分布式:一个业务分拆多个子业务,部署在不同的服务器上;集群:同一个业务,部署在多个服务器上
三、socket编程实现半双工与全双工聊天
单独一篇文章

四、网络互连和套接字:实现一个TCP C/S,令其能够识别date、os、ls命令
#!/usr/bin/env python
# coding: utf-8
import socket
from time import ctime
import os
import re

HOST = ''
PORT = 50006
ADDR = (HOST, PORT)

#获取指定路径的文件列表,默认为当前文件列表
def list_dir(path=os.curdir):
    files = os.listdir(path)
    filenames = []
    for file in files:
        filenames.append(file)
    return '\n'.join(filenames)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ADDR)
s.listen(5)
while True:
    conn, addr = s.accept()
    print('Connected by ', addr)
    while True:
        data = conn.recv(1024)
        s_data = ''
        if not data: break
        data = data.decode('utf-8')
        #判断指令为time
        if data == 'date':
            s_data = '[%s]'%ctime()
        #判断指令为os
        elif data == 'os':
            s_data = '[%s]'%os.name
        else:
            #判断指令为ls
            if data == 'ls':
                s_data = list_dir()
            else:
                #判断指令为ls path
                patt = 'ls\s([^\s]+)'
                m = re.match(patt,data)
                if m:
                    path = m.group(1)
                    if os.path.exists(path):
                        s_data = list_dir(path)
                    else:
                        s_data = 'not exist path'
                else:
                    s_data = 'this is no order' + data
        conn.send(s_data.encode('utf-8'))
    conn.close()
s.close()

 

客户端:
import socket

HOST = 'localhost'
PORT = 50006
ADDR = (HOST, PORT)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(ADDR)
    while True:
        data = input('>>> ')
        if not data:break
        s.send(data.encode('utf-8'))
        data = s.recv(1024)
        if not data:break
        data = data.decode('utf-8')
        print(data)

 




















posted on 2018-04-27 11:01  myworldworld  阅读(171)  评论(0)    收藏  举报

导航