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

 

相关文章
|
域名解析 网络协议 安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
2349 13
|
网络协议 Unix Linux
# 2个类轻松构建高效Socket通信库
本文介绍了一种通过两个类`EpollEventHandler`和`IEpollEvent`构建高效Socket通信库的方法。该库支持TCP、UDP和Unix域套接字,采用I/O多路复用技术(如epoll),提升并发处理能力。通过抽象基类和具体事件类的设计,简化了API使用,便于开发者快速上手。文章还提供了服务端与客户端的实例代码,展示其在实际项目中的应用效果。此Socket库适应嵌入式环境,功能定制性强,有助于减少外部依赖并提升维护效率。
366 95
# 2个类轻松构建高效Socket通信库
|
10月前
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
921 16
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
538 0
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
672 10
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
533 12
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
533 6
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
541 0
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
336 4
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
218 3