目录
计算机网络基础知识
网络体系结构
请参考
https://blog.csdn.net/leeezm/article/details/77823108
网络协议&应用层协议&传输层协议
请参考
https://www.cnblogs.com/ImBit/p/5513401.html
MAC地址
请参考
https://baike.baidu.com/item/MAC%E5%9C%B0%E5%9D%80/1254181?fr=aladdin
Socket编程
在计算机通信领域,Socket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 Socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
Socket的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。
Socket编程又可以分为两种形式—TCP与UDP,TCP是带有数据认证的,确保数据从一方能准确的传送到另一方;UDP是不带数据认证的,一方只管发,一方只管收
TCP编程
Server端的流程如下:
a、首先是创建一个TCP的套接字
b、bind()对应的端口和地址
c、然后进行listen(1),1表示不阻塞
d、accept()等待一个客户端连接
e、然后在循环内部用recv进行接收消息
f、接收到退出字符exit则退出while循环,关闭连接、关闭套接字;否则输出接收到的字符串
# !/usr/bin/env python
# encoding: utf-8
import socket
if __name__ == '__main__':
host='127.0.0.1'
port = 60000
s = socket.socket(socket.AF_INET)
#绑定socket
s.bind((host, port))
s.listen(1)
print("Listening at port:", port)
conn, addr = s.accept()
print("Connected by", addr)
while True:
data = conn.recv(1024)
data = data.decode()
if -1 != data.find('exit'):
break
print("receiveed message:", data)
conn.sendall(data.encode())
conn.close()
s.close()
print("main end.")
Client端的流程如下:
a、首先是创建一个TCP的套接字
b、connect ()对应的端口和地址
c、在循环内部用sendall、recv进行发送、接收消息
d、输入退出字符exit则退出while循环,关闭连接、关闭套接字
e、服务器接收到exit同样退出
# !/usr/bin/env python
# encoding: utf-8
import socket
import sys
if __name__ == '__main__':
host='127.0.0.1'
port = 60000
s = socket.socket(socket.AF_INET)
try:
#连接服务器
s.connect((host, port))
except Exception as e:
print(e)
sys.exit()
while True:
c = input('Input the content you want to send:')
#发送数据
s.sendall(c.encode())
#从服务器端接收数据
data = s.recv(1024)
data = data.decode()
print("received:", data)
if -1 != c.lower().find('exit'):
break
#关闭连接
s.close()
print("main end.")
UDP编程
UDP属于无连接协议,相对来说比较简单
Server端的流程如下:
a、首先是创建一个UDP的套接字
b、循环中,用recvfrom阻塞等待消息的到来
c、接收到退出字符exit则退出while循环,关闭套接字;否则输出接收到的字符串
# !/usr/bin/env python
# encoding: utf-8
import socket
if __name__ == '__main__':
host='127.0.0.1'
port = 60000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#UDP
#绑定socket
s.bind((host, port))
while True:
data, addr = s.recvfrom(1024)
data = data.decode()
print("receiveed message:{0}, addr:{1}".format(data, addr))
if -1 != data.find('exit'):
break
s.close()
print("main end.")
Client端的流程如下:
a、首先是创建一个UDP的套接字
b、向这个套接字用sendto发送一些数据,无论是否发送成功
c、输入退出字符exit则退出while循环,关闭连接、关闭套接字
d、服务器接收到exit同样退出
# !/usr/bin/env python
# encoding: utf-8
import socket
if __name__ == '__main__':
host='127.0.0.1'
port = 60000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
c = input('Input the content you want to send:')
s.sendto(c.encode(), (host, port))
if -1 != c.lower().find('exit'):
break
#关闭连接
s.close()
print("main end.")
更高级的用法selectors
封装了系统底层对socket的支持,已经封装好了有epoll(epoll只能在linux上使用)和selector
更多知识请参考
https://www.cnblogs.com/guobaoyuan/p/6841904.html