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

网络编程

时间:2018-09-22 18:19:09      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:bin   api   from   osi模型   .so   模型   广播   技术分享   用户   

一、ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
二、在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
三、一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。
ARP协议通过"一问一答"实现交互,但是""""都有讲究,""是通过广播形式实现,""是通过单播形式。

传输层:TCP与UDP协议

TCP(传输控制协议)是一种可靠的通信协议,需要经过三次握手的环节,确立连接关系之后,才可以进行传输;终止连接(四次挥手);为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即ACK),如果在某个时限内未收到相应的 ACK,将重新传送数据包。

UDP(用户数据报协议)不一定提供可靠的数据传输,不需要建立连接关系,它只管传输。

TCP与UDP区别:
    1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;
    2、TCP提供可靠的服务;也就是说,通过TCP连接传输的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,但不保证可靠交付;
    3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);
    4、每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信;
    5、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

 

socket是一种操作系统提供的进程间通信机制;在操作系统中,通常会为应用程序提供一组应用程序接口(API),称为套接字接口(socket API);应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。

基于TCP协议的socket

tcp是基于连接的,必须先启动服务端,再启动客户端去连接服务端。

server端

import socket
sk = socket.socket()              # 比喻买手机
sk.bind(("127.0.0.1", 8080))    # 把地址绑定到套接字;比喻绑定手机卡,接收的是元祖("ip", "port")
sk.listen()                     # 监听链接;比喻等着他人给我打电话
conn, addr = sk.accept()        # 接收客户端链接;比喻接受他人的电话,定义接收变量conn(链接)/addr(对方地址)

ret_client = conn.recv(1024)    # 接收客户端信息;比喻听他人说话,必须有参数(一般为1024的整数倍)
print(ret_client)               # 打印客户端信息
conn.send(b"i‘m server")        # 向客户端发送信息

ret_client = conn.recv(1024).decode("utf-8")    # 接收中文信息
print(ret_client)
conn.send(bytes("我就是,有屁快放。", encoding="utf-8"))

conn.close()    # 关闭客户端套接字;比喻挂电话
sk.close()      # 关闭服务器套接字(可选);比喻关手机

client端

import socket
sk = socket.socket()               # 比喻买手机
sk.connect(("127.0.0.1", 8080))    # 比喻播他人的电话
sk.send(b"i‘m client")

ret_server = sk.recv(1024)
print(ret_server)

sk.send(bytes("喂喂喂,我找server。", encoding="utf-8")).decode("utf-8")
ret_server = sk.recv(1024)
print(ret_server)

sk.close()

使用while循环可持续对话

技术分享图片
# server端
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))
sk.listen()
conn, addr = sk.accept()
while True:
    ret_client = conn.recv(1024).decode("utf-8")
    if ret_client == "拜拜":
        break
    print(ret_client)
    my_info = input(">>>")
    conn.send(bytes(my_info, encoding="utf-8"))
conn.close()
sk.close()


# client端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 8080))
while True:
    my_info = input(">>>")
    sk.send(bytes(my_info, encoding="utf-8"))
    ret_server = sk.recv(1024).decode("utf-8")
    print(ret_server)
    if ret_server == "拜拜":
        break
sk.close()
View Code

小练习:

client 每隔10秒把时间戳发给server
server 接收时间戳,将其转换成格式化时间

技术分享图片
# server端
import socket
import time
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))
sk.listen()
conn, addr = sk.accept()
while True:
    ret_client = conn.recv(1024).decode("utf-8")
    if ret_client:
        print(time.ctime(float(ret_client)))


# client端
import socket
import time
sk = socket.socket()
sk.connect(("127.0.0.1", 8080))
while True:
    timestamp = time.time()
    sk.send(bytes(str(timestamp), encoding="utf-8"))
    time.sleep(10)
View Code

 基于UDP协议的socket

server端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)    # 创建一个服务器的套接字
ip_port = ("127.0.0.1", 8888)
udp_sk.bind(ip_port)    # 绑定服务器套接字
msg, addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b"i‘m server", addr)    # 对话(接收与发送)
udp_sk.close()    # 关闭服务器套接字

client端

import socket
ip_port = ("127.0.0.1", 8888)
udp_sk = socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b"i‘m client", ip_port)
msg, addr = udp_sk.recvfrom(1024)
print(msg)

基于UDP协议的socket实现聊天

技术分享图片
# server端
import socket
ip_port = ("127.0.0.1", 8888)
udp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server_sock.bind(ip_port)

while True:
    msg, addr = udp_server_sock.recvfrom(1024)
    print("来自[%s:%s]的一条消息:\033[36;1m%s\033[0m" % (addr[0], addr[1], msg.decode("utf-8")))
    reply_msg = input("回复消息: ").strip()
    udp_server_sock.sendto(reply_msg.encode("utf-8"), addr)


# client端
import socket
ip_port = ("127.0.0.1", 8888)
udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
        msg = input("请输入消息,回车发送,输入q结束聊天: ").strip()
        if msg.lower() == "q":
            break
        else:
            udp_client_socket.sendto(msg.encode("utf-8"), ip_port)
            accp_msg, addr = udp_client_socket.recvfrom(1024)
            print("来自[%s:%s]的一条消息:\033[36;1m%s\033[0m" % (addr[0], addr[1], accp_msg.decode("utf-8")))
View Code

 

 

 

 

 

 

123

 

网络编程

标签:bin   api   from   osi模型   .so   模型   广播   技术分享   用户   

原文地址:https://www.cnblogs.com/believepd/p/9690487.html

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