网络编程

一,,结构介绍

1  c/s架构

c/s就是Client和Server的缩写,中文就是,客户端与服务端架构,这种架构也是从用户层面

来划分的

这里的客户端一般泛指客户端应用程序exe先安装才能应用

2   b/s架构

B/s就是Browser(浏览器),其实你也可以将其理解为是Client的一种,只是这个客户端不需要安装

程序,而是通过HTTP请求来实现的

二,网络基础

在网络上一个程序要如何才能找到另一个程序,

通过ip地址就可以实现

ip:ip地址就是指互联网协议地址它为互联网上的每一个网络和每一台主机分配一个逻辑地址,

以此来区分和物理地址的差异

IP地址是一个32位的二进制,通常被分割为4个“8”位的二进制

端口:英文:port可以理解为是设备与外界通讯交流的出口

在同一个时间内只有一个程序占用一个端口

端口的范围0--65535

一般都用8000之后的端口,

IP地址精确到一台电脑,二端口精确到具体的程序

TCP协议:面向连接的协议,可靠地,传输效率低,全双工通信,面向字节流,

UDP协议:不可靠,无连接的服务,传输效率低的,(发送前时延小),面向报文,尽最大努力服务

无拥塞控制

arp协议:通过ip找mac地址

mac:MAC地址是厂家指定的,全球唯一,不会重复

三   套接字(socket)

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的

1,,基于文件类型的套接字家族

AF_UNIX

unix一切皆文件,

2,,基于网络类型的套接字家族

AF_INET

 

osi七层模型

应用层,表示层,对话层,传输层,网络层,数据链路层,物理层

但是一般我们都关注于五层

        存储:

应用层,          程序

传输层,  tcp、udp

网络层,    ip

数据链路层,  mac   arp

物理层    二进制,网线网卡

四,,socket初级使用

基于tcp协议的socket

tcp是基于链接的,所以必须先启动服务端,然后再启动客户端去链接服务端

server

复制代码
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
coon,cli=sk.accept()
ret=coon.recv(1024)
print(ret)
coon.send(b'ni')
coon.close()
sk.close()
复制代码

client

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
ret=sk.recv(1024)
print(ret)
sk.close()

 

 这种问题的解决方案:

 

 

 

 

复制代码
import socket
sk=socket.socket()

sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 

#端口的重复使用

sk.bind(('127.0.0.1',8080))
sk.listen()
coon,cli=sk.accept()
ret=coon.recv(1024)
print(ret)
coon.send(b'ni')
coon.close()
sk.close()
复制代码

 基于tcp的聊天程序

server

复制代码
import socket
sk=socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8080))
sk.listen()
coon,cli=sk.accept()
while 1:
    ret=coon.recv(1024).decode('utf-8')
    print(ret)
    if ret=='bye':
        break
    info=input('>>>')
    coon.send(bytes(info,encoding='utf-8'))
coon.close()
sk.close()
复制代码

client

复制代码
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while 1:
    info=input('>>>')
    sk.send(bytes(info,encoding='utf-8'))

    ret=sk.recv(1024).decode('utf-8')
    print(ret)
    if ret=='bye':
        break
sk.close()
复制代码

 上面说的都是基于tcp协议的,下面看看基于udp协议的

import socket,time
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8090))
msg,addr=sk.recvfrom(1024)
msg=msg.decode('utf-8')
sk.sendto(bytes(time.strftime(msg,time.localtime()),encoding='utf-8'),addr)
sk.close()

 

import socket,time
sk=socket.socket(type=socket.SOCK_DGRAM)
dd=('127.0.0.1',8090)
sk.sendto(bytes('%Y-%m-%d',encoding='utf-8'),dd)
msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.close()
C:\Users\hc\AppData\Local\Programs\Python\Python36\python3.exe C:/s9/day30/client.py
2018-01-26

Process finished with exit code 0

 

posted @   许光宗  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示