网络编程:基于socket的TCP/IP通信。

简介: 网络编程:基于socket的TCP/IP通信。

网络编程:基于socket的TCP/IP通信。

 

网络编程是计算机科学中的一个重要领域,它涉及编写在网络上进行通信的程序。TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议套件,而基于socket的编程是实现TCP/IP通信的一种常见方式。下面将介绍基于socket的TCP/IP通信的基本概念、服务器端和客户端的实现步骤以及简单的示例代码。

1. 基本概念

Socket:在网络编程中,socket是一个端点,它允许两台机器上的程序进行通信。每个socket都有一个唯一的地址和端口号,用于区分不同的连接。

TCP(传输控制协议):一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立连接,并通过序列号、确认应答、超时重传等机制确保数据的可靠传输。

IP(互联网协议):负责网络层的数据传输,将数据包从源主机发送到目的主机。IP地址用于唯一标识网络中的每一台设备。

2. TCP/IP通信过程

服务器端:

创建一个socket。

绑定socket到一个IP地址和端口号上。

监听该端口上的连接请求。

接受连接请求,创建新的socket来与客户端通信。

接收和发送数据。

关闭socket连接。

客户端:

创建一个socket。

连接到服务器端的IP地址和端口号。

发送和接收数据。

关闭socket连接。

3. 示例代码

服务器端(Python)

import socket

 

# 创建socket对象

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 

# 绑定IP地址和端口号

host = '127.0.0.1' # 本地主机

port = 12345 # 端口号

server_socket.bind((host, port))

 

# 监听连接

server_socket.listen(5) # 最多同时连接5个客户端

 

print("服务器启动,等待连接...")

 

# 接受连接

client_socket, addr = server_socket.accept()

print("连接地址: %s" % str(addr))

 

# 接收数据

data = client_socket.recv(1024).decode('utf-8')

print("从客户端接收到的数据: %s" % data)

 

# 发送数据

client_socket.sendall("服务器已收到消息!".encode('utf-8'))

 

# 关闭连接

client_socket.close()

server_socket.close()

客户端(Python)

import socket

 

# 创建socket对象

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 

# 连接到服务器

host = '127.0.0.1' # 服务器IP地址

port = 12345 # 服务器端口号

client_socket.connect((host, port))

 

# 发送数据

client_socket.sendall("你好,服务器!".encode('utf-8'))

 

# 接收数据

data = client_socket.recv(1024).decode('utf-8')

print("从服务器接收到的数据: %s" % data)

 

# 关闭连接

client_socket.close()

4. 注意事项

在实际部署中,服务器端的IP地址应改为公网IP或局域网内的可访问IP,端口号也应根据实际需要选择。

监听端口号时,需要确保该端口号未被其他程序占用。

在处理网络数据时,要注意数据的编码格式,确保发送和接收时的编码一致。

考虑到网络延迟和丢包等问题,可能需要实现重试机制或超时机制。

在生产环境中,还需要考虑安全性问题,如使用TLS/SSL进行加密通信等。

 

网络编程:基于socket的TCP/IP通信。(扩展)

网络编程深入:基于Socket的TCP/IP通信进阶

在深入探讨基于Socket的TCP/IP通信时,我们不仅要理解其基本概念和简单实现,还需要掌握更多高级特性和最佳实践,以确保网络通信的可靠性、效率和安全性。以下将从异常处理、多线程/多进程服务器、非阻塞与异步IO、SSL/TLS加密通信、以及心跳机制等方面进行详细阐述,并补充相应的Python代码示例。

1. 异常处理

在网络编程中,异常处理是至关重要的,因为网络请求可能会因为多种原因失败,如连接超时、对方主机不可达等。在Python中,可以使用try...except语句块来捕获并处理这些异常。

服务器端异常处理示例:

import socket

 

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = '127.0.0.1'

port = 12345

 

try:

server_socket.bind((host, port))

server_socket.listen(5)

print("服务器启动,等待连接...")

while True:

try:

client_socket, addr = server_socket.accept()

print("连接地址: %s" % str(addr))

data = client_socket.recv(1024).decode('utf-8')

if data:

print("从客户端接收到的数据: %s" % data)

client_socket.sendall("服务器已收到消息!".encode('utf-8'))

else:

raise IOError("客户端已断开连接")

except IOError as e:

print(f"发生错误: {e}")

finally:

client_socket.close()

except socket.error as e:

print(f"服务器启动失败: {e}")

finally:

server_socket.close()

2. 多线程/多进程服务器

为了提高服务器的并发处理能力,可以使用多线程或多进程技术。Python的threading和multiprocessing模块分别支持多线程和多进程编程。

多线程服务器示例:

import socket

import threading

 

def handle_client(client_socket, addr):

print(f"连接地址: {addr}")

try:

while True:

data = client_socket.recv(1024).decode('utf-8')

if not data:

break

print(f"从客户端接收到的数据: {data}")

client_socket.sendall("服务器已收到消息!".encode('utf-8'))

finally:

client_socket.close()

 

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = '127.0.0.1'

port = 12345

server_socket.bind((host, port))

server_socket.listen(5)

 

print("服务器启动,等待连接...")

try:

while True:

client_socket, addr = server_socket.accept()

client_thread = threading.Thread(target=handle_client, args=(client_socket, addr))

client_thread.start()

except KeyboardInterrupt:

print("服务器关闭")

finally:

server_socket.close()

3. 非阻塞与异步IO

非阻塞和异步IO是提高网络应用性能的关键技术。Python的asyncio库提供了对异步IO的支持。

异步服务器示例(简化版):

import asyncio

 

async def handle_client(reader, writer):

addr = writer.get_extra_info('peername')

print(f"连接地址: {addr}")

data = await reader.read(1024)

message = data.decode()

addr = writer.get_extra_info('peername')

print(f"接收自{addr}的数据: {message}")

 

print(f"发送回{addr}的消息: 服务器已收到消息!")

writer.write("服务器已收到消息!".encode())

await writer.drain()

 

writer.close()

 

async def main():

server = await asyncio.start_server(

handle_client, '127.0.0.1', 12345)

 

addr = server.sockets[0].getsockname()

print(f'Serving on {addr}')

 

async with server:

await server.serve_forever()

 

目录
相关文章
|
2月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
76 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
3月前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
91 11
|
3月前
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
41 3
|
3月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
102 5
|
3月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
72 1
|
3月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
176 3
|
3月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
181 2
|
3月前
|
传感器 自动驾驶 物联网
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
101 4
|
3月前
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
68 0
|
4月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
41 0