1、什么是C/S架构

Client客户端 软件    Server服务端软件

一个C/S架构就是,实现服务端软件与客户端软件基于网络通信。

互联网中处处是C/S架构:

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

栗子:

  如12306网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)

  腾讯作为服务端为你提供视频播放,你下载腾讯视频客户端观看

C/S架构与socket的关系:

  我们学习socket就是为了完成C/S架构的开发

2、互联网协议是什么?分别介绍 五层协议中的每一层的功能?

互联网协议:世界上所有计算机之间通信的标准协议,就像英语是世界上通用的语言一样

简单的说,计算机之间的通信标准就是互联网协议

按功能不同,人们将互联网协议分为osi七层、tcp/ip五层、tcp/ip四层

 

osi七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

tcp/ip五层:应用层、传输层、网络层、数据链路层、物理层

tcp/ip四层:应用层、传输层、网络层、网络接口层

五层:

应用层:  软件如:qq,浏览器

传输层:  建立端口到端口的通信  0-65535 0-1023为系统占用端口     两种协议:tcp ucp

网络层:  引入一套新的地址来区分不同的广播域/子网,这套地址即网络地址(ip协议)

数据链路层:  定义了电信号的分组方式  以太网协议(ethernet)  mac地址指网卡地址    广播

物理层:  主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

3、基于TCP协议通信,为何建立连接需要三次握手,而断开连接却需要四次挥手

建立连接  三次握手:client发送请求建立通道;server收到请求并同意,同时也发送请求建通道;client收到请求并同意,建立完成

断开连接  四次挥手:client发送请求断开通道;server收到请求并同意,同时还回复client上一条消息;server也发送请求断开通道;client受到消息结束

4、为何基于TCP协议的通信比基于UDP协议的通信更可靠

TCP:可靠,对方给了确认收到信息,才发下一个,如果没有收到确认信息就重发

UDP:不可靠一直发数据,不需要对方回应

5、流式协议指什么协议,数据报协议指的是什么协议?

流式协议:TCP协议,可靠传输

数据报协议:UDP协议,不可靠传输

也就是TCP和UDP的区别:

    TCP是面向连接的,可靠的字节流服务
    UDP是面向无连接的数据报服务

6、什么是socket?简述基于tcp协议的套接字通信流程

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/ip

协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。

23 网络编程--本章练习题

 

 服务端:创建socket对象,绑定ip端口bind(),设置最大链接数listen(),accept()与客户端的connect()创建双向管道
,send()   recv()    close()
客户端:创建socket对象,connect() 与服务端accept()创建双向管道,send()  recv()  close()

7、什么是粘包?socket中造成粘包的原因是什么?那些情况会发生粘包现象?

粘包:

数据粘在一起

主要因为:接收方不知道消息之间的界限,不知道一次性提取

多少字节的数据造成的数据量比较小,时间间隔比较短,就合并成了一个包,
这是底层的一个优化算法(Nagle算法)

 

原因:
1 发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会当做一个包发出去,产生粘包)
服务端:
from socket import *
phone = socket(AF_INET,SOCK_STREAM)
phone.setsockopt(SOL_SOCKET,SOCK_STREAM,1)
phone.bind(('127.0.0.1',8080))
phone.listen(5)
print('start running...')

coon,addr = phone.accept() #等待连接

data1 = coon.recv(10)
data2 = coon.recv(10)

print('------------>',data1.decode('utf-8'))
print('------------>',data2.decode('utf-8'))
coon.close()
phone.close()

客户端:

from socket import *
import time
phone = socket(AF_INET,SOCK_STREAM)
phone.connect(('127.0.0.1',8080))

phone.send('hello'.encode('utf-8'))
phone.send('helloworld'.encode('utf-8'))
phone.close()
2 接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包) 

 服务端:

from socket import *
phone = socket(AF_INET,SOCK_STREAM)
phone.setsockopt(SOL_SOCKET,SOCK_STREAM,1)
phone.bind(('127.0.0.1',8080))
phone.listen(5)
print('start running...')

coon,addr = phone.accept() #等待连接

data1 = coon.recv(2) #一次没有接收完整
data2 = coon.recv(10)  #下一次接收的时候会先取旧的数据,然后取新的
# data3 = coon.recv(1024)  #接收等5秒后的信息
print('------------>',data1.decode('utf-8'))
print('------------>',data2.decode('utf-8'))
# print('------------>',data3.decode('utf-8'))
coon.close()
phone.close()

客户端:

from socket import *
import time
phone = socket(AF_INET,SOCK_STREAM)
phone.connect(('127.0.0.1',8080))

phone.send('hello'.encode('utf-8'))
time.sleep(5)
phone.send('haiyan'.encode('utf-8'))
phone.close()

8、基于Socket开发一个聊天程序,实现两端互相发送和接收消息

8.1、tcp协议实现

TCP协议:
服务端:
import socket
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1',8081)
MAX_RECV_SIZE = 1024
server_socket.bind(ip_port)
server_socket.listen(5)
while True :
    conn, client_addr = server_socket.accept()
    while True:
        data = conn.recv(MAX_RECV_SIZE).decode('utf-8')
        print(data)
        msg = input('(q 退出)>>').strip()
        if not  msg:break
        if msg == 'q':
            exit()
        conn.send(msg.encode('utf-8'))

客户端:
import socket
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1',8081)
MAX_RECV_SIZE = 1024
client_socket.connect(ip_port)
while True:
    msg = input('(q 退出)>>').strip()
    if not msg:continue
    if msg == 'q':
        exit()
    client_socket.send(msg.encode('utf-8'))
    data = client_socket.recv(MAX_RECV_SIZE)
    print(data.decode('utf-8'))
View Code

相关文章:

  • 2021-12-10
  • 2021-08-10
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-25
  • 2022-12-23
  • 2021-09-03
猜你喜欢
  • 2022-03-05
  • 2021-04-04
  • 2021-12-30
  • 2022-01-30
  • 2022-12-23
  • 2021-05-22
相关资源
相似解决方案