• Socket
  • UDP socket
    • UDP Server端
    • UDP Client端
  • TCP socket
    • TCP Server端
    • TCP Client端
  • 总结
  • 代码下载

Socket

Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 具体定义看百科

socket有两种,一种基于UDP,一种基于TCP。UDP是面向非连接的,传递的是数据报,每次传递都要指定目的地址端口;而TCP是面向连接的,经过三次握手协议建立起连接,所以不用每次都指定目的地址端口。当然还有很多的区别,这里就不一一列举。

一般服务器端和客户端各有一个socket,你可以将它看成是一个网络接口,将你的请求转化成底层数据,把收到的数据转化成高级的数据对象。

在Python中用于socket编程的包是socket,这是一个自带的包。

UDP socket

UDP Server端

#coding=utf-8import socket
import time
HOST = 'localhost' #主机,因为是本机所以是localhost,或者127.0.0.1也可以
BUFFSIZE = 1024  #每次读取数据的缓存区大小
PORT = 8802  #端口,也就是客户端要连接的端口
ADDR = (HOST,PORT)  #将主机地址和端口组成一个tuple形式的地址UDPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSerSocket.bind(ADDR)
print('waiting for connect...')
while True:data,addr = UDPSerSocket.recvfrom(BUFFSIZE)print 'Received',data,'from',addr,'in [%s]'%time.ctime()UDPSerSocket.sendto('[%s]:%s'%(time.ctime(),data),addr)UDPSerSocket.close()

说明

  • UDPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)中两个参数,第一个是指定以internet地址连接,第一个参数还有一个值是AF_UNIX,但是一般都不会用到,至少我还没用到过。第二个参数是指定以何种方式传输,socket.SOCK_DGRAM是以数据报的形式传输,也就是对应UDP方式,TCP方式是socket.socket.SOCK_STREAM

  • UDPSerSocket.bind(ADDR)是绑定地址,服务器端的socket必须执行这一步,计算机才知道这个socket对应那个端口,并可以在这个端口监听。

  • 服务器端的socket一般都会有一个while True的循环,用于接收完数据之后马上等待下一个数据。

  • UDPSerSocket.recvfrom(BUFFSIZE)是接收数据的方法,接受到的是一个data数据和发送数据的地址addr。之前我们说过UDP方式是每一次都必须指定地址,所以这里获取到一个地址可以在下一步的发送方法UDPSerSocket.sendto('[%s]:%s'%(time.ctime(),data),addr)中用到。

  • 最后,用完socket之后记得记性close()方法释放


UDP Client端

#coding=utf-8import socket
HOST = 'localhost'
PORT = 8802
ADDR = (HOST,PORT)
BUFFSIZE = 1024UDPcliSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:data = raw_input('>')if not data:break;UDPcliSocket.sendto(data,ADDR)datarecv,addr = UDPcliSocket.recvfrom(BUFFSIZE)if not datarecv:breakprint datarecvUDPcliSocket.close()

说明

  • Client和Server建立socket对象的方法都是一样的,不同的是Client端不需要绑定bind(),因为Client是一般情况下是主动连接的一方,而不是等待的一方。

  • Client端的接收和发送方法和Server是完全一样的。


TCP socket

TCP Server端

#coding=utf-8import socket
import time
HOST = 'localhost'
PORT = 8081
BUFFSIZE = 1024
ADDR = (HOST,PORT)TCPSerSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCPSerSocket.bind(ADDR)
TCPSerSocket.listen(5)while True:print "waiting for connection..."tcpCliSocket,addr = TCPSerSocket.accept()print '...connected from:',addrwhile True:data = tcpCliSocket.recv(BUFFSIZE)if not data:breaktcpCliSocket.send('[%s] %s'%(time.ctime(),data))print [time.ctime()],":",datatcpCliSocket.close()
TCPSerSocket.close()

说明

  • TCP与UDP的Server端建立socket对象差不多,不同的是在socket.socket(socket.AF_INET,socket.SOCK_STREAM)第二个参数指定为socket.SOCK_STREAM,同样也需要绑定地址端口。,还有TCP的ServerSocket还需要一个listen(5)方法,表示监听,不加会报错

  • 我们说TCP是面向连接的,所以在Client端连接到Server后并不会立刻断开,而为了能双方通信,Server会通过tcpCliSocket,addr = TCPSerSocket.accept()收到一个ClientSocket对象,通过操作ClientSocket对象来完成接收、发送操作。

  • TCP接收方法是recv与UDP的recvfrom不同,其实想想还是挺容易理解的,UDP的recvfrom方法除了得到data之外,还能得到addr,所以才有from,而TCP早就已经得到ClientSocket对象,当然也通过accept()得到了addr,所以就没有from咯。TCP的send和UDP的sendto也可如此理解。

  • 当然还是不要忘记执行close()方法,也不要忘了关闭ClientSocket


TCP Client端

#coding = utf-8import socket
import timeHOST = 'localhost'
PORT = 8081
BUFFSIZE = 1024
ADDR = (HOST,PORT)TCPCliSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCPCliSocket.connect(ADDR)while True:data = raw_input('>')if not data:breakTCPCliSocket.send(data)data = TCPCliSocket.recv(BUFFSIZE)if not data:breakprint '%s'%data

说明

  • TCP与UDP的ClientSocket不同之处在于TCPClientSocket要先建立连接,所以要执行connect()方法,为什么?因为TCP是面向连接的。

  • Client端的发送和接收方法与TCP的Server相同,send()recv()

  • Client端不会像Server端那样接收到对方的Socket的,为什么,因为不需要!一般Client是主动连接Server,就是用connect(),那么连接后Client就把自己的ClientSocket传给Server,Server通过它来操作发送接收,而Client也就用ClientSocket接收和发送咯,你可以将ClientSocket看成一个管道,通过这个管道来沟通Server和Client。

总结:

  1. Server端都要用bind()绑定地址和端口。

  2. 区别TCP和UDP的是在建立ServerSocket对象时第二个参数不同,TCP是socket.socket(socket.AF_INET,socket.SOCK_DGRAM),而UDP是socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  3. TCP的Server还需要有listen()方法监听。

  4. TCP的Server端会通过accpet()方法得到addrClientSocket,通过ClientSocketsend()recv()方法实现发送和接收。

  5. UDP的发送和接收方法是sendto()recvfrom,TCP的发送和接收方法是sendrecv,注意区分。

代码下载:

博文中代码点此下载

转载于:https://www.cnblogs.com/sharpdeep/p/10629552.html

【Socket】Python UDP和TCP的socket实例相关推荐

  1. 多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言

    多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言 使用说明介绍 1.功能介绍: 完成了多路网口和串口数据转换的功能. 可实现串口接收到的数据,通过网口发送出 ...

  2. 基于Socket的UDP和TCP编程介绍

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  3. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  4. 基于Socket的UDP和TCP编程介绍-转

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  5. 计算机网络协议(三)——UDP、TCP、Socket

    底层网络知识详解:最重要的传输层 概述 一.UDP协议 二.TCP协议(上) 2.1 TCP的三次握手 2.2 TCP的四次挥手 2.3 TCP状态机 三.TCP协议(下) 3.1 可靠传输 3.2 ...

  6. bsd协议开源框架tcp服务器,搬运RT Thread中BSD Socket实现UDP及TCP例子

    /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * ...

  7. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  8. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点,或称之为句柄.IP地址+端口号就可以唯一确定一个sock ...

  9. python实现syn半扫描_python 使用raw socket进行TCP SYN扫描实例

    1. TCP SYN扫描 端口扫描常用于用于探测服务器或主机开放端口情况,被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务.端口扫描是向一定范围的服务器端口发送对应请求 ...

最新文章

  1. ASP.NET WebAPI String 传值问题
  2. CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界(并查集+第二分块)
  3. c语言循环10次代码,C语言教学(七-上)for循环
  4. 10个问题带你全面理解Linux性能优化
  5. 放假为什么要借周末呢?
  6. web版本 开源压测工具_Web压测工具之Webbench和http_load
  7. RMAN 系列(四) ---- RMAN 备份
  8. Intellij IDEA 备忘录
  9. Dolby与DTS杜比环绕与DTS环绕音响
  10. 你拍一我拍一上学得学计算机,儿歌你拍一我拍一
  11. 如何删除设备和驱动器中的百度网盘
  12. 决策树与R语言(RPART)
  13. php 链接oracle tns,PHP连接Oracle ORA
  14. Vue 子组件接收到父组件传的值之后再渲染页面
  15. COTS应用程序开发框架简介(二)
  16. java猜字母游戏jsp_jsp+servlet实现猜数字游戏
  17. 笔记本通过hdmi连接显示器分辨率设置
  18. js去除数据外面的双引号(不是在直接转数据类型)
  19. wireshark抓包,分析出PNG后解析
  20. php 不恒等,Re: 弱问:Latex里不恒等号(三横一撇) - 精华区 - 数学科学学院(SMS)版 - 北大未名BBS...

热门文章

  1. 建立可扩展的silverlight应用框架 step-7 final
  2. 简单的Socket实现web功能
  3. 双线路切换-冗余备份实验
  4. 青藤云安全张福:我们可以用“免疫系统”对抗黑客入侵吗?
  5. MAC: Homebrew(代替yum)安装
  6. c++数据结构之广义表
  7. 小知识~LocalDB在IIS上如何成功配置
  8. Struts2 interceptor使用经验小结
  9. 《Python 学习手册4th》 第十二章 if测试和语法规则
  10. [转载] C#面向对象设计模式纵横谈——12. Flyweight享元模式