首页 > 编程语言 >TCP/UDP套接字基础编程及拓展

TCP/UDP套接字基础编程及拓展

时间:2024-11-20 11:29:06浏览次数:1  
标签:UDP socket TCP serverSocket serverPort 接字 clientSocket

一、环境

1.1 客户端:windows宿主机

1.2 服务器端:Linux虚拟机

1.3 注意事项

测试套接字编程通信时,先确保C/S能互相ping通,且双方主机防火墙允许目的端口号为“创建的端口号”的数据包通过。

二、代码

2.1 UDP套接字编程

2.1.1 UDPClient.py

from socket import *  # 导入套接字编程所需包

# 一个目的地址由(serverName, serverPort)构成。
serverName = 'Write your server IP address(example:192.168.1.1) or domain name(example:www.zhihu.com)' 
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM) # 该行创建一个客户端套接字。第一个参数指示底层网络使用IPv4;第二个参数指示该套接字是UDP套接字,由操作系统自动创建clientSocket的端口号
message = input('Input lowercase sentence:')
# 下面使用encode()方法将报文由字符串类型编码为字节序列,同时使用sendto方法为报文附上服务器地址(serverName, serverPort)并向进程的clientSocket套接字发送分组
clientSocket.sendto(message.encode(),(serverName, serverPort))
# 下面使用recvfrom()方法,将到达该客户端套接字的分组中的数据放入modifiedMessage中,将该分组的源地址放到变量serverAddress中。
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode()) # 将字节类型的modifiedMessage解码转换为字符串类型并输出。
clientSocket.close() # 关闭创建的套接字

2.1.2 UDPServer.py

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort)) # 该行将端口号12000与该serverSocket套接字绑定
print("Server is ready to receive.")
while True: # 保持服务器该套接字始终工作,接收来自客户端的分组
    message, clientAddress = serverSocket.recvfrom(2048) # 该处代码解释同客户端,其中print(clientAddress)的结果为('IP address', portNumber)
    modifiedMessage = message.decode().upper() # 将接收到的字符串全部转为大写
    serverSocket.sendto(modifiedMessage.encode(), clientAddress) # 将信息发回给客户端

2.2 TCP套接字编程

2.2.1 TCPClient.py

from socket import *

serverName = 'Write your server IP address(example:192.168.1.1) or domain name(example:www.zhihu.com)'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM) # SCOK_STREAM指示该套接字是TCP套接字,由操作系统自动创建clientSocket的端口号
clientSocket.connect((serverName, serverPort)) # 请求建立TCP连接
sentence = input('Input lowercase sentence:')
clientSocket.send(sentence.encode()) # 已建立TCP连接后,后续通过该套接字发送数据均不再需要指明目的服务器地址。
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode())
clientSocket.close()

2.2.2 TCPServer.py

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('',serverPort)) # 该行将端口号12000与该serverSocket套接字绑定,注意,这个serverSocket套接字是我们的欢迎套接字。
serverSocket.listen(1) # 欢迎套接字监听来自客户的TCP连接请求,且参数规定了请求连接的最大数目。
print('Server is ready to recvive')
while True:
    connectionSocket, addr = serverSocket.accept() # 当有TCP连接请求时,欢迎套接字使用accept()方法创建一个专用于服务该请求的connectionSocket连接套接字
    sentence = connectionSocket.recv(1024).decode()
    modifiedSentence = sentence.upper() # 将收到的数据转为大写
    connectionSocket.send(modifiedSentence.encode()) # 将转为大写后的数据发回客户端
    connectionSocket.close() # 关闭该连接套接字。
# 需要注意,欢迎套接字创建完连接套接字后,有关该请求连接客户的所有事项均由连接套接字接管,包括TCP的三次握手及后续的数据传输和连接关闭对话

三、当前问题(待更新解答)

3.1 在UDPServer.py中有一条语句:message, clientAddress = serverSocket.recvfrom(2048)。为什么clientAddress是二元组(IP_address,port _number)?

四、参考资料

计算机网络:自顶向下方法(第8版)

标签:UDP,socket,TCP,serverSocket,serverPort,接字,clientSocket
From: https://www.cnblogs.com/Yu-Xing-Hai/p/18556549/TCP-UDP-Socket-Program

相关文章

  • BUG: udp的"addrlen"由局部变量改为全局变量,udp的数据包就无法发送到目标地址。
    一.BUG描述项目上要用到LWIP的UDP协议传输数据,然后弄了一个了UDP的demo;跑通了之后就对这个demo重新封装。我把套接字长度变量(addrlen)由局部改为全局之后,服务器的UDP就只能接收,不能发送数据了。二.BUG原因点击查看代码/**sockfd:套接字文件描述符*buf:接收缓冲区*len:接收......
  • Linux 下网络套接字(Socket) 与udp和tcp 相关接口
    文章目录1.socket常见API2sockaddr结构体及其子类1.sockaddr结构体定义(基类)2.子类sockaddr_in结构体用于(IPv4)3子类sockaddr_un(Unix域套接字)4.总结画出其结构体3.实现一个简单的tcpEcho服务器和客户端(cpp)3.1客户端3.2服务器3.3测试结果1.socket常......
  • docker pull报错:dial tcp: no such host
    dockerpull报错:dialtcp:nosuchhost0xwang于2024-09-2818:07:39发布阅读量1.1k收藏3点赞数5文章标签:dockertcp/ip容器版权有一段时间没用docker了,今天使用docker下载镜像竟然报错,而且是莫名其妙的错误,奔走相告,避免后来者踩坑!Errorresponsefromdaemon:Get"h......
  • 网络编程-002-UDP通信
    1.UDP通信的简单介绍1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高1.2包大小有限制,不发大于路径MTU的数据包1.3容易丢包1.4可以实现一对多,多对多2.客户端与服务端=发送端与接收端代码框架收数据方一般都是客户端/接收端3.头文件#include<arpa/ine......
  • 基于UDP协议的千兆以太网红外视频传输模块设计与实现
    系列文章目录1.非制冷红外探测器片上非均匀校正(on-chipoffsetcalibrationOOC)技术应用分析2.非制冷红外探测器驱动模块设计与实现文章目录一、前言二、基于Zynq的总体架构设计三、红外视频传输处理软件设计四、红外视频传输存储设计五、PS端软件设计总结前言 ......
  • TCP/IP上三层协议
    TCP/IP上三层的角色同一台设备上的进程间通信有多种方式,如管道、消息队列、共享内存、信号等。而不同设备间的进程通信需要网络通信,由于设备具有多样性,因此协商出了一套通用的网络协议。这个网络协议是分层的,每一层都有各自的作用和职责,接下来将依据“TCP/IP网络模型”对每一......
  • Modbus TCP转Modbus ASCII解决方案
    ModbusTCP和ModbusASCII是两种不同的通信协议。ModbusTCP是一种二进制协议,ModbusASCII是一种基于文本的协议。二者不能直接转换,因为它们的数据表示方式、消息结构、字符编码等都不相同。如果你需要将ModbusTCP转换为ModbusASCII,你需要先解析ModbusTCP消息,然后按照ModbusA......
  • icloudpd
    icloudpd介绍:每天定时同步icloud照片下载到本地。https://github.com/boredazfcuk/docker-icloudpddocker启动后​chmod-R777iCloud​,意思是赋予iCloud文件夹最高权限执行sync-icloud.sh--Initialise​有效期默认为90天,过期之后就会停止同步,这也算苹果的一个安全......
  • TCP_UDP
    TCP,UDPFlood攻击原理TCPFlood攻击配置环境WindowsServer2016配置服务器管理器,创建一个Web服务器并开启该服务器功能kali配置vim/etc/network/interfacesifupeth0开启网络查看Kaliip信息:修改路由器信息:拓扑关系如下所示:GNS3中修改路由器R......
  • 基于UDP的tftp传输服务的客户端
    效果图下载上传:代码:#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include<stdlib.h>#include<......