网络编程

Posted jianxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。

两个运行中的程序如何传递信息,通过文件两台机器上的两个运行程序是如何传递信息,通过网络
网卡:是实际存在的硬件
mac地址: 每一块网卡都有一个全球唯一的mac地址
交换机:是连接多台机器的物理设备,只认识mac地址
- 交换机实现arp协议 - 单播 组播 广播 - 通过ip地址获取一台机器的mac地址
协议:两台物理机之间对发送内容,长度等的约束
网关:一个局域网的网络出口,访问局域网之外的区域都需要经过路由器和网关
路由器 :完成局域网与局域网之间的联系
- 能识别ip地址 - 网段 - 网关ip - 访问局域网外部服务器的一个出口ip
ip地址:在网上定位一台机器
- ipv4 - ipv6
port:在网上定位一台机器上的一个服务- 0---65535

tcp协议

技术图片

tcp协议的特点
- 面向连接的 可靠 全双工通信
- 建立连接:三次握手
- 断开连接:四次挥手
- 建立连接后
- 发送每一条数据后都有回馈
- 为了保证数据的完整性,还有重传机制
- 长连接时:会一直占用双方的端口,对数据的长度没有限制
UDP协议
特点:
- 面向数据的 不可靠 无连接协议
- 可能会丢失数据
- 能够传递的数据的长度是有限的,与传输数据的设置有关

应用场景
 - TCP 文件的上传下载(缓存视频,发送邮件)
 - UDP 即使通信(QQ,微信)
 osi五层协议
协议          
物理设备 
应用层  
 http  https ftp smtp python代码
 
传输层 tcp udp
 四层交换机、四层路由器
网络层 ipv4/ipv5 三层交换机 路由器
数据链路层 arp  mac地址 网卡 交换机
物理层    
 

 

socket 套接字
socket 历史
- 基于文件的同一台机器两个服务通信
- 基于网络的多台机器之间的多个服务通信
在python中socket模块完成了socket的功能
socket对于程序员来说,已经是网络操作的底层
tcp基本格式
server.py
import socket
sk=socket.socket()  #创建对象
sk.bind((127.0.0.1,9000))  #绑定关系
sk.listen()  #监听连接
conn,addr=sk.accept() # 接受用户连接
ret=conn.recv(1024) # 接受客户信息
print(ret)
conn.send(bhi)  #发送客户信息
conn.close()
sk.close()

client.py

import socket
sk=socket.socket() #创建对象创建对象
sk.connect((127.0.0.1,9000)) #尝试连接服务
sk.send(bhello)
ret=sk.recv(1024)  #接受服务端信息
print(ret)
sk.close()

修改版

server.py

import socket
sk=socket.socket()
sk.bind((127.0.0.1,9000))
sk.listen()
print(***20)
while True:
    conn,addr=sk.accept()
    while True:
        ret=conn.recv(1024).decode(utf-8)
        if ret.upper() ==Q:break
        print(ret)
        inp=input(">>>:")
        conn.send(inp.encode(utf-8))
        if inp.upper() ==Q:break
    conn.close()
sk.close()

client.py

import socket
sk=socket.socket()
sk.connect((127.0.0.1,9000))
while True:
    inp=input(">>>:")
    sk.send(inp.encode(utf-8))
    if inp.upper() ==Q:break
    ret=sk.recv(1024).decode(utf-8)
    if ret.upper() ==Q:break
    print(ret)
sk.close()

UDP的基本用法

server.py

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind((127.0.0.1,9000))
while True:
    msg,_addr=sk.recvfrom(1024)
    print(msg.decode(utf-8))
    msg = input(>>>).encode(utf-8)
    sk.sendto(msg,_addr)
sk.close()

client.py

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
while True:
    inp=input(>>>:).encode(utf-8)
    sk.sendto(inp,(127.0.0.1,9000))
    ret=sk.recv(1024).decode(utf-8)
    print(ret)
sk.close()

粘包问题

server.py

import struct
import socket
sk=socket.socket()
sk.bind((127.0.0.1,9000))
sk.listen()
conn,addr=sk.accept()
ret=conn.recv(1024)
print(ret)  # 出现了粘包
#解决粘包
# byte_len=conn.recv(4)
# size=struct.unpack(‘i‘,byte_len)[0]
# msg1=conn.recv(size)
# print(msg1)
# byte_len=conn.recv(4)
# size=struct.unpack(‘i‘,byte_len)[0]
# msg2=conn.recv(size)
# print(msg2)
sk.close()

client.py

import struct
import socket

sk=socket.socket()
sk.connect((127.0.0.1,9000))

sk.send(bhelllo)
sk.send(bword)
#解决粘包
# msg=b‘helllo‘
# bytes_len=struct.pack(‘i‘,len(msg))
# sk.send(bytes_len)
# sk.send(msg)
# msg=b‘word‘
# bytes_len=struct.pack(‘i‘,len(msg))
# sk.send(bytes_len)
# sk.send(msg)
sk.close()

serversocket模块

server.py

import socketserver

class Myserver(socketserver.BaseRequestHandler):
    def handle(self):  # 自动触发了handle方法,并且self.request == conn
        msg = self.request.recv(1024).decode(utf-8)
        self.request.send(1.encode(utf-8))
        msg = self.request.recv(1024).decode(utf-8)
        self.request.send(2.encode(utf-8))
        msg = self.request.recv(1024).decode(utf-8)
        self.request.send(3.encode(utf-8))

server = socketserver.ThreadingTCPServer((127.0.0.1,9000),Myserver)
server.serve_forever()

client.py

import socket
import time
sk = socket.socket()
sk.connect((127.0.0.1,9000))
for i in range(3):
    sk.send(bhello,yuan)
    msg = sk.recv(1024)
    print(msg)
    time.sleep(1)

sk.close()

 

 

 

 

以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章

Linux高级网络编程系列教程

Linux高级网络编程系列教程

面向对象编程面向组件编程面向方面编程面向服务编程

编程范式:命令式编程(Imperative)声明式编程(Declarative)和函数式编程(Functional)

少儿编程教育未来前景如何?我想加入少儿编程这行。

TCP/IP网络编程——理解网络编程和套接字编程