当前位置: 首页 > news >正文

网络编程基础知识总结:Socket与TCP通信

目录

1. 基本概念

2. 操作方法

2.1 服务端操作流程

2.2客户端操作流程

2.3使用说明

3.注意事项


1. 基本概念

  • Socket:网络通信的端点,是应用层与TCP/IP协议族通信的中间抽象层。它提供了统一的接口供应用程序进行网络通信。
  • TCP(传输控制协议):面向连接的协议,保证数据传输的可靠性,数据有序且无丢失。
  • TCP Socket:基于TCP协议的网络通信套接字,用于实现可靠的面向连接的数据传输。

2. 操作方法

2.1 服务端操作流程

1.创建套接字:

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

family(地址族)

  • socket.AF_INET:IPv4,最常用
  • socket.AF_INET6:IPv6
  • socket.AF_UNIX:Unix域套接字(仅限Unix/Linux)

type(套接字类型)

  • socket.SOCK_STREAM:面向连接的TCP协议
  • socket.SOCK_DGRAM:无连接的UDP协议
  • proto:协议编号,通常为0自动选择
  • fileno:文件描述符,通常不使用

2.绑定地址和端口

bind((host, port))

3.监听连接

listen(backlog)
  • backlog:最大等待连接数,决定操作系统为该套接字排队的最大连接数

4.接收连接

conn, addr = accept()
  • 返回一个新的套接字conn用于和客户端通信
  • addr是客户端地址(IP和端口)

5.接收数据

data = conn.recv(bufsize)
  • 接收二进制数据,需要用decode()转换为字符串

6.发送数据

conn.send(data)
  • 发送数据前需用encode()编码成二进制
  • 回声发送:收到客户端消息后,再发回给客户端(echo)

7.关闭连接

conn.close()
  • 关闭和客户端的通信连接

8.服务端总体代码(server.py)

import socketdef start_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('127.0.0.1', 8888)) server_socket.listen(5)print("服务器启动,等待客户端连接...")while True:conn, addr = server_socket.accept()print(f"客户端{addr}已连接")try:data = conn.recv(1024)if not data:print("客户端关闭连接")conn.close()continueprint(f"收到客户端消息: {data.decode()}")response = "服务器已收到消息"conn.send(response.encode())except Exception as e:print(f"通信异常: {e}")finally:conn.close()print(f"与客户端{addr}的连接已关闭")if __name__ == "__main__":start_server()

2.2客户端操作流程

1.创建套接字

socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
  • family:地址族,常用参数
    • socket.AF_INET:IPv4(最常用)
    • socket.AF_INET6:IPv6
  • type:套接字类型
    • socket.SOCK_STREAM:面向连接的TCP协议
    • socket.SOCK_DGRAM:无连接的UDP协议

2.连接服务器

connect((host, port))
  • host:服务器IP地址或域名,例如 '127.0.0.1' 或 'www.example.com'
  • port:服务器监听的端口号,整数类型,如 12345

3.发生数据

send(data)
  • data:要发送的字节数据,必须是bytes类型
  • 如果发送字符串,需要先用encode()转换为字节流
  • 例如:client_socket.send("hello".encode())

4.接收数据

recv(bufsize)
  • bufsize:每次接收的最大字节数,整数,如 10242048
  • 返回值是bytes类型,需要用decode()转换为字符串
  • 示例:data = client_socket.recv(1024)

5.关闭连接

close()

6.客户端总体代码(client.py)

import socketdef start_client():client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_ip = '127.0.0.1'  # 服务端IP,若服务端在远程机器,改成对应IPserver_port = 8888try:client_socket.connect((server_ip, server_port))message = "你好,服务器!"client_socket.send(message.encode())data = client_socket.recv(1024)print(f"收到服务器回复: {data.decode()}")except Exception as e:print(f"连接或通信异常: {e}")finally:client_socket.close()print("客户端连接关闭")if __name__ == "__main__":start_client()

2.3使用说明

  1. 先运行服务端脚本 python server.py,服务端开始监听。
  2. 再运行客户端脚本 python client.py,客户端连接服务端并发送消息。
  3. 服务端收到消息后打印并回复,客户端接收回复并打印。
  4. 双方通信完成后关闭连接。

3.注意事项

  • 数据格式转换

    • 发送和接收的数据是二进制流,字符串需要encode()decode()
    • 复杂Python对象(如字典、列表等)需要序列化(转换为字节流)
      • 推荐使用json模块(跨语言,文本格式)
      • pickle模块(Python专用,二进制格式)
  • 多客户端处理

    • 服务端通常通过循环调用accept()接收多个客户端连接
    • 也可以使用多线程、多进程或异步IO来同时处理多个连接
  • 异常处理

    • 网络通信容易出错,需要捕获异常(如连接中断、超时等)保证程序健壮
  • 关闭顺序

    • 先关闭客户端连接套接字conn,服务器监听套接字server_socket一般在程序结束时关闭

文章转载自:

http://pWddkRxb.jxfsm.cn
http://QvZ2zeZO.jxfsm.cn
http://Rs0JEBxl.jxfsm.cn
http://rL0tKUlK.jxfsm.cn
http://ntg2wH6O.jxfsm.cn
http://LJ2XyyW7.jxfsm.cn
http://3bT6JV4k.jxfsm.cn
http://q27SUfNy.jxfsm.cn
http://osKjHlx0.jxfsm.cn
http://frJSq2nX.jxfsm.cn
http://jcs5YkXE.jxfsm.cn
http://POkO6unw.jxfsm.cn
http://nAnkRYK5.jxfsm.cn
http://tMUUMaKy.jxfsm.cn
http://0mZWWKF1.jxfsm.cn
http://vH3z26OM.jxfsm.cn
http://DTsLMo1i.jxfsm.cn
http://8X0H1MA4.jxfsm.cn
http://7WyNVvRH.jxfsm.cn
http://hAWKsjr0.jxfsm.cn
http://KujJeDaM.jxfsm.cn
http://f99YXIxX.jxfsm.cn
http://LXO4GgBe.jxfsm.cn
http://jFdIVv7B.jxfsm.cn
http://u6VFXTl8.jxfsm.cn
http://kM72xzkZ.jxfsm.cn
http://5POwzRUP.jxfsm.cn
http://gB666VA4.jxfsm.cn
http://KGSyj3oT.jxfsm.cn
http://QzXAiXuj.jxfsm.cn
http://www.dtcms.com/a/377109.html

相关文章:

  • 《TCP协议基础》
  • 1234567
  • 【面试向】物联网IoT
  • 快消26届联合利华校招AI测评及第二轮线上认知能力测评SHL笔试真题及评分要求
  • 我在嘉顺达蓝海的安全日常
  • 洞察 2025:中国身份访问安全厂商格局深度剖析
  • LLMOps平台:开源项目LMForge = GPTs + Coze
  • 开源欧拉_网络插件cilium_HA集群_二进制_IPV4IPV6双栈_Kubernetes-1.33.0
  • 101、23种设计模式之享元模式(10/23)
  • Tomcat原理
  • Linux 内核和用户空间
  • Cookie、Session和Token之间的区别
  • 大模型之词嵌入模型实现文本向量化
  • MySQL慢查询
  • 前端如何判断token是否过期
  • 当没有接口文档时,如何使用Jmeter录制和创建脚本
  • 解锁深度学习黑科技:Embedding向量嵌入探秘
  • Java 大视界 -- 基于 Java 的大数据分布式存储在数字图书馆海量资源存储与管理中的应用
  • 6、Python-Pandas数据处理与分析
  • 实现一个优雅的城市选择器组件 - Uniapp实战
  • WebSocket 双向通信实战:SCADA 移动端实时操控响应优化
  • 校园管理系统练习项目源码-前后端分离-【node版】
  • websocket和socket区别
  • Linux驱动如何向应用层提供sysfs操作接口
  • 人工智能学习:Transformer结构中的前馈全连接层
  • 项目需求分析(2)
  • 灌区泵站远程监控物联网网关解决方案
  • 【114B】基于51单片机GSM自动售货机【Keil程序+报告+原理图】
  • 【前言技术拓展Trip one】 芯片自动化和具身智能
  • Windows-Use实战:AI驱动的Windows自动化