网络编程:基于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()

 

目录
相关文章
|
11天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
37 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
1天前
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
15 2
|
3天前
|
网络协议 Java
谈谈TCP/IP网络编程
【9月更文挑战第1天】在当今数字化的世界中,网络通信是连接各种设备和系统的关键。TCP/IP协议作为互联网通信的基石,被广泛应用于各种网络场景。了解TCP/IP网络编程的概念,并掌握如何在Java中实现TCP/IP通讯,对于开发人员来说是非常重要的。
29 4
|
10天前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
10天前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
10天前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
10天前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。
|
10天前
|
存储 网络协议 安全
C语言 网络编程(五)Socket和端口
Socket 是 TCP/IP 五层网络模型中应用层的编程接口,用于实现不同主机间应用程序的双向通信。它作为网络通信的端点,连接应用层与网络协议栈,提供可靠的流式或非流式数据传输服务。Socket 包括流式(SOCKET_STREAM)、数据报(SOCK_DGRAM)和原始套接字(SOCK_RAW)三种类型,分别适用于不同场景。通过 IP 地址和端口号,Socket 能准确识别并转发数据包至指定进程。端口号分为知名端口(1-1023)、注册端口(1024-49151)和动态端口(49152-65535),确保数据准确交付。
|
14天前
|
Rust 网络协议 安全
揭开Rust网络编程的神秘面纱:全新的Socket体验,让你告别内存泄漏的噩梦!
【8月更文挑战第31天】Rust语言凭借其卓越的内存安全性和高性能,在网络编程领域展现出独特优势。本文将带你探索Rust中的Socket编程,展示如何使用标准库`std::net`模块轻松实现TCP服务器与客户端。通过简洁的代码示例,你将看到Rust如何简化网络通信流程,并通过`async/await`异步模型高效处理并发连接。此外,Rust社区提供的优秀库如`tokio`和`async-std`进一步增强了异步网络编程的能力。无论是从基础示例还是高级应用,Rust都将为你带来耳目一新的网络编程体验。
48 0
|
18天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【8月更文挑战第27天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。