TCP/UDP套接字网络协议

TCP服务端(以字节串传输信息)

import socket

1、创建套接字

  sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0)

功能:创建一个IPv4的流式套接字,括号中的创建IPv4流式套接字的时候可以不写,有缺省值。

参数:socket_family  地址族类型  AF_INET 表示IPv4网络通信

    socket_type  套接字类型  SOCK_STREAM 流式  SOCK_DGRAM  数据报

    proto     通常为0(选择子协议)

返回值:返回一个套接字对象

2、绑定IP端口

  sockfd.bind(("IP地址",端口号))

  功能:绑定IP地址和端口号

  参数:二元元组

3、将套接字设置为可监听

  sockfd.listen(n)

  功能:将套接字设置为监听套接字,并创建监听队列(只有是监听套接字,才可以连接客户端)

  参数:监听对象的大小  n为大于0的正整数

  一个监听套接字可以连接多个客户端

4、等待客户端的连接

  connfd,addr = sockfd.accept()

  功能:阻塞等待客户端连接,返回客户端的套接字和地址元组

  返回值:connfd  一个新的套接字,用于和客户端通信

      addr  连接的客户端的地址(元组)(ip,port)

  阻塞函数:当程序运行到阻塞函数位置,如果某种预期条件没有达成则暂停继续运行,直到条件达成在继续运行

5、消息接收和发送

  data = connfd.recv(buffersize)

  data为connfd套接字接收到的消息,以字节方式进行传输

  n = connfd.send(b‘adsfafef‘)

  n为发送的字节数

  功能:发送消息

  参数buffersize:每次最多接收的消息大小  bytes

  connfd.sent(b‘hello woeld‘)返回值是发送的字节数

6、关闭套接字

  close()

  功能:关闭套接字,tcp连接断开

  telnet ip port  表示连接tcp服务端

import socket

sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      # 创建tcp套接字
sockfd.bind((‘0.0.0.0‘, 8888))      # 绑定地址
sockfd.listen(5)                    # 设置监听

print("Waiting for connect...")     # 阻塞等待处理连接
connfd, addr = sockfd.accept()      # 等待客户端连接
print("Connect from", addr)         # 打印链接的客户端地址

data = connfd.recv(1024)            # 接收消息
print("收到:", data)
n = connfd.send(b‘over‘)          # 发送字节串
print("发送%d字节" % n)

#  关闭套接字
connfd.close()
sockfd.close()

TCP客户端(以字节串传输信息)

1.创建套接字
  socket()
  * 通信的两端套接字类型相同

2. 发起连接
  sockfd.connect(("IP地址",端口号))
  功能 : 发起连接请求
  参数 : 元组,服务器端的地址

3.发收消息
  sockfd.send(字节串内容)

  sockfd.recv()    # 接收到的是字节串内容
  * 两端收发需要配合

4.关闭套接字
  close()

from socket import *

sockfd = socket()                       # 创建套接字,TCP协议不用填写缺省值
sockfd.connect(("176.122.1.61",8888))   # 发起请求连接IP地址176.122.1.61,端口8888的主机
data = input("发送:")                   # 输入要发送的信息
sockfd.send(data.encode())              # 发送字节串内容
d = sockfd.recv(1024).decode()          # 接收到的是字节串内容
print("接收到:", d)
sockfd.close() 

UDP服务器

UDP是无连接的, 不用accetp和listen

1、创建套接字----》数据报套接字

  sockfd = socket(AF_INET,SOCK_DGRAM)

2、绑定服务端地址

  sockfd.bind()

3、消息的收发

  data,addr = sockfd.recvfrom(buffersize)

    功能:接收udp消息

    参数:每次最多接受消息大小

    返回值:data  接收到的消息  addr  消息发送者的地址(IP号和端口号)

  sockfd.sendto(data,addr)

    功能:udp发送消息

    参数:data要发送的消息  bytes

      addr 客户端地址(地址包括IP和端口号)

    返回值:发送的字节

  每次接收一个报文,如果没有接收完全则丢弃没有收到的内容

4、关闭套接字

  sockfd.close()

""" UDP 套接字服务端"""
from socket import *

sockfd = socket(AF_INET, SOCK_DGRAM)  # 创建套接字
sockfd.bind((‘127.0.0.1‘, 8888))  # 绑定地址

# 收发消息
while True:
  data, addr = sockfd.recvfrom(1024)
  print("收到的消息:", data.decode())
  sockfd.sendto(b‘Receive‘, addr)

sockfd.close()    # 关闭套接字

UDP客户端

1、创建套接字

  sockfd = socket(AF_INET,SOCK_DGRAN)

2、消息收发

  收:data,addr = sockfd.recvfrom(buffersize)

  发:sockfd.sendto(data,addr)

    data,addr = sockfd.recvfrom(1024)

    sockfd.sendto(data.encode(), ("192.168.191.3",8888))

3、关闭套接字

  sockfd.close()

from  socket import *
import sys 

# 命令行输入服务器地址
if len(sys.argv) < 3:
    print(‘‘‘
        argv is error !!
        请在终端输入
        python3 udp_client.py 127.0.0.1 8888
        ‘‘‘)
    raise 

HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT)

sockfd = socket(AF_INET,SOCK_DGRAM)    # 创建套接字

while True:
    data = input("消息:")
    if not data:    # 如果收到空消息则退出
        break
    sockfd.sendto(data.encode(),ADDR)
    data,addr = sockfd.recvfrom(1024)
    print("从服务端收到:",data.decode())

sockfd.close()

补充:  sys.argv

  功能:获取来自命令行的参数,形成一个列表

  以空格作为每一项分隔,如果一项中有空格则用引号表示一个整体

  命令行内容作为字符串传入

TCP流式套接字和UDP数据报套接字区别

  1、流式套接字采用字节流的方式传输数据,而数据报套接字以数据报形式传输

  2、TCP会产生粘包现象,UDP消息是有边界的不会粘包

  3、TCP传输是建立在连接的基础上,保证传输的可靠性,而UDP一次接收一个数据报保证完整

  4、TCP需要依赖listen、accept建立连接,UDP不用

  5、TCP收发消息使用recv、send、sendall。UDP使用recvfrom、sendto

UDP应用之广播

一点发送多点接收

目标地址:广播地址,每个网段类最大的地址

    172.60.50.255 ----》<broadcast>

广播接收

from socket import *
s = socket(AF_INET,SOCK_DGRAM)   # 创建一个数据报套接字
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) # 设置为可以接收广播
s.bind((‘0.0.0.0‘,9999))   # 绑定IP地址
while True:
    try:
        msg,addr = s.recvfrom(1024)
        print("从{}获取信息:{}".format(addr,msg.decode()))
    except KeyboardInterrupt:
        print("接收消息结束")
        break
    except Exception as e:
        print(e)
s.close()

广播发送

from socket import *
from time import sleep
dest = (‘192.168.191.3‘,9999)# 设置广播地址
s = socket(AF_INET,SOCK_DGRAM) # 创建一个数据报套接字
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) #设置套接字可以发送接受广播
while True:
    sleep(1)
    s.sendto("我叫凌逆战!".encode(),dest)
s.close()

原文地址:https://www.cnblogs.com/LXP-Never/p/9430753.html

时间: 2024-07-31 02:55:45

TCP/UDP套接字网络协议的相关文章

TCP/UDP套接字 java socket编程实例

网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. HTTP协议和Socket的区别 http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应.传输的数据是原始格式的数据,eg :json.xml.text等数据格式. socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器. 2.服务器从其连接套接字读取一行字符. 3.服务器将该行字符转换成大写. 4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机. 5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来. [TCP]服务器端代码: import socket

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

《网络编程》基本 UDP 套接字编程

在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 sendto 和 recvfrom.以下是基本 UDP 套接字编程过程: sendto 与 recvfrom 函数 这两个函数的功能类似于 write 和 read 函数,可用无连接的套接字编程.其定义如下: /* 函数功能:发送数据: * 返回值:若成功则返回已发送的字节数,若出错则返回-1: * 函数原

《网络编程》高级 UDP 套接字编程

概述 UDP 是一个无连接.不可靠的数据报协议,任何可靠传输都需由应用程序提供,例如:超时重传.序列号应答机制,但是它在某些场合使用效率高,方便.它支持广播和多播.有关<基本 UDP 套接字编程>参照该文,这里只是在那个基础上,记录一些在 UDP 编程中容易出现的问题. 辅助数据 辅助数据(也称为控制信息)可通过调用 recvmsg 和 sendmsg 函数使用,这里两个函数的定义可参考文章<高级 I/O>,使用 msghdr 结构体中的 msg_control 和 msg_con

Unix网络编程学习笔记之第8章 基于UDP套接字编程

一. UDP C/S的典型函数调用 UDP没有像TCP那样的连接,客户端直接sendto向某服务器发送数据,服务器端一直recvfrom阻塞,以接收任何客户端发送的数据. 二. sendto和recvfrom函数 int sendto(int sockfd, const void* buff, size_t nbytes, int flag, const struct sockaddr* to, socklen_taddrlen); int recvfrom(int sockfd, void*

TCP和UDP套接字编程 (java实现)

在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程接口! 关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可! 我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器. 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再

python开发socket网络编程基础:粘包问题&amp;udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

Python网络编程—UDP套接字广播

广播定义 : 一端发送多点接收 广播地址 : 每个网络的最大地址为发送广播的地址,向该地址发送,则网段内所有主机都能接收. """ 创建udp套接字 设置套接字可以接收广播 选择接收端口 """ from socket import * s=socket(AF_INET,SOCK_DGRAM) #让套接字接收广播 s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) s.bind(("0.0.0.0"