码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程

时间:2019-07-20 13:02:58      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:特点   python   sock   space   oid   功能   两台   family   问题   

两个运行中的程序如何传递信息,通过文件两台机器上的两个运行程序是如何传递信息,通过网络
网卡:是实际存在的硬件
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()

 

 

 

 

网络编程

标签:特点   python   sock   space   oid   功能   两台   family   问题   

原文地址:https://www.cnblogs.com/jianxiang/p/11217191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!