一、TCP/IP简介
(摘录自百度百科)
1. TCP/IP协议
Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
2.TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。
从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。
TCP/IP协议并不完全符合OSI的七层参考模型,OSI(Open System Interconnect)是传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层(网络接口层)、网络层(网络层)、传输层(传输层)、会话层、表示层和应用层(应用层)。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。由于ARPANET的设计者注重的是网络互联,允许通信子网(网络接口层)采用已有的或是将来有的各种协议,所以这个层次中没有提供专门的协议。实际上,TCP/IP协议可以通过网络接口层连接到任何网络上,例如X.25交换网或IEEE802局域网。
注意tcp本身不具有数据传输中噪音导致的错误检测功能,但是有实现超时的错误重传功能;
二、TCP编程
#SocketTcpServer.py
import socket
import threading
import time
# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(5)
print('TCPServer is waiting for connection...')
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
#SocketTcpClient.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Jaber', b'Katy', b'Betty', b'huangxin']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
#server(未连接时的状态)
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketTcpServer.py
TCPServer is waiting for connection...
#server(连接成功后的状态)
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketTcpServer.py
TCPServer is waiting for connection...
Accept new connection from 127.0.0.1:55380...
Connection from 127.0.0.1:55380 closed.
#client
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketTcpClient.py
Welcome!
Hello, Jaber!
Hello, Katy!
Hello, Betty!
Hello, huangxin!
Process finished with exit code 0
三、UDP编程
#SocketUcpServer.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 8888))
print('Bind UDP on 8888...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)
#SocketUcpClient.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 8888))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()
#server(未连接时的状态)
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketUdpServer.py
Bind UDP on 8888...
#server(连接成功后的状态)
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketUdpServer.py
Bind UDP on 8888...
Received from 127.0.0.1:52492.
Received from 127.0.0.1:52492.
Received from 127.0.0.1:52492.
#client
"C:\Program Files\Python36\python.exe" C:/Users/Administrator/PycharmProjects/HomeWorkByNetwork/SocketUdpClient.py
Hello, Michael!
Hello, Tracy!
Hello, Sarah!
Process finished with exit code 0

309

被折叠的 条评论
为什么被折叠?



