UDP,TCP的套接字编程的Python实现

套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型,并设置一些普通参数,例如缓存大小等,除此之外的所有都要运输层自己完成。

需求:

为了学习套接字如何操作运输层的UDP和TCP协议,此处提出一个需求:客户端接收用户输入的信息,并发送到服务器上,并接收由服务器把所有字母大写之后的数据,再显示出来。

整个过程需要以下步骤:

1.客户端提示用户信息输入并将数据发送给服务器

2.服务器接收信息,把字幕转换为大写

3.服务器将修改好的数据再次发送给客户端

4.客户端接收到服务器发送来的数据,并将其显示出来

UDP套接字编程

必须要先运行服务器端程序,保证服务器是处于运行状态的,客户端才能跟服务器进行通信。

UDP不需要先经过三次握手确保建立了连接,所以要在每个要传输的报文上携带目的地址

客户端代码:

# -*- coding:utf-8 -*-
from socket import * #设置服务器主机名或者IP地址
serverName = '127.0.0.1'
#设置主机的接收进程,即端口号
serverPort = 12000
#创建客户端套接字,AF_INET指示底层用IPv4, SOCK_DGRAM指定是UDP套接字不是TCP套接字
clientSocket = socket(AF_INET,SOCK_DGRAM)
#客户端提示用户输入信息
message = raw_input("Input lowercase sentence:")
#发送报文到目的地
#sendto()方法为报文附上目的地址,并且向进程的套接字clientSocket发送结果分组
clientSocket.sendto(message, (serverName, serverPort))
#当有数据到达客户端的套接字时,使用recvfrom()方法接收,指定缓存长度为2048
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
#打印刚刚接收到的信息
print modifiedMessage, serverAddress
#关闭套接字
clientSocket.close()

服务器端代码:

# -*- coding:utf-8 -*-
from socket import * #定义一个端口号
serverPort = 12000
#实例化一个服务器端的套接字,AF_INET指定使用IPv4,SOCK_DGRAM指定使用UDP
serverSocket = socket(AF_INET, SOCK_DGRAM)
#为服务器端套接字绑定一个端口
serverSocket.bind(('', serverPort))
print "The server is ready to receive"
#处于循环监听状态
while True:
#当有数据到达本地的12000端口的套接字处时,使用recvfrom()接收
message, clientAddress = serverSocket.recvfrom(2048)
#对接收到的数据进行处理
modifiedMessage = message.upper()
#使用sendto()发送数据到客户端
serverSocket.sendto(modifiedMessage, clientAddress)

TCP套接字编程

同样,先运行服务器端的程序

TCP需要先经过三次握手在客户端和服务器之间连接连接,然后再传输数据,所以,在建立连接时需要指定目的地址,而在传输数据时就不需要再附带目的地址数据了。

需要注意的是:服务器监听所有客户端发来的连接请求,如果发现有请求,就为其建立一个新的连接来传输数据。

客户端程序:

# -*- coding:utf-8 -*-

from socket import *

#服务器端的IP地址或名称和端口号
serverName = '127.0.0.1'
serverPort = 12000
#实例化套接字,SOCK_STREAM指定使用的是TCP协议
clientSocket = socket(AF_INET, SOCK_STREAM)
#客户端和服务器端建立连接
clientSocket.connect((serverName, serverPort))
#提示用户输入信息
sentence = raw_input("Input lowercase sentence:")
#客户端发送数据到服务器,此处不同于UDP
#此处没有为数据指定地址,是因为已经和服务器建立和连接,可以直接通信了
clientSocket.send(sentence)
#接收返回的数据
modifiedSentence = clientSocket.recv(1024)
#打印显示服务器端发回来的数据
print 'From Server:', modifiedSentence
#关闭客户端套接字连接
clientSocket.close()

服务器端程序:

# -*- coding:utf-8 -*-

from socket import *
#定义端口号变量
serverPort = 12000
#实例化服务端套接字,SOCK_STREAM指定使用TCP协议
serverSocket = socket(AF_INET, SOCK_STREAM)
#为套接字绑定端口号
serverSocket.bind(('', serverPort))
#监听来自客户端的请求,其中参数定义了最大连接数
serverSocket.listen(1)
print 'The server is ready to receive'
#循环监听
while 1:
#服务器监听到来自客户端的请求,使用accept()为其创建一个新的专用的连接。
#此处不同与UDP,TCP在经过公用的三次握手之后,为其建立一个新连接供其传输数据
connectionSocket, addr = serverSocket.accept()
#接收客户端发送来的数据
sentence = connectionSocket.recv(1024)
#操作接收到的数据
capitalizedSentence = sentence.upper()
#发送数据到客户端
connectionSocket.send(capitalizedSentence)
#断开连接
connectionSocket.close()

UDP,TCP的套接字编程的Python实现的更多相关文章

  1. 20181225 基于TCP/IP和基于UDP/IP的套接字编程

    一.TCP/IP的套接字编程 服务器端代码: import  socket​server = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.sock ...

  2. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  3. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  4. 基于UDP协议的套接字编程

    基于udp协议的套接字编程 UDP是无链接的,先启动那一端都不会报错 UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到 一般不用与传输大数据 虽然没有粘包问题,但是不能 ...

  5. python TCP socket套接字编程以及注意事项

    TCPServer.py #coding:utf-8 import socket #s 等待链接 #c 实时通讯 s = socket.socket(socket.AF_INET,socket.SOC ...

  6. 基于tcp的套接字编程

    一,基础版服务器端客户端(一收一发,只有一个客户端链接) 服务器端: #Author : Kelvin #Date : 2019/1/28 22:10 from socket import * ser ...

  7. 基本套接字编程(1) -- tcp篇

    1. Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机 ...

  8. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

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

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

随机推荐

  1. 分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计

    一. 数据采集 源码GitHub地址 : -- SSH : git@github.com:han1202012/DisplayTest.git; -- HTTP : https://github.co ...

  2. android异步向服务器请求数据

    下面就android向服务器请求数据的问题分析如下: 1.在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据: ...

  3. pattern-matching as an expression without a prior match -scala

    https://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html https://docs.scala-lang. ...

  4. BW中DSO的分类及应用

    1.DSO的分类,标准DSO(生成主数据标识.对于相同关键字段的值进行合并.可直接出具报表).写优化的DSO(不生成主数据标识.不合并相同关键字段的值.速度快可用于存储大容量数据).直接写入的DSO, ...

  5. 导出不带.svn的文件夹或者是不含.class的文件

    转载自:http://blog.csdn.net/z278718149/article/details/21537395 如何导出不带.svn的文件夹或者是不含.class的文件 在工作环境中,有的时 ...

  6. [微信开发] 微信JSAPI - 获取用户地理位置信息

    参考博客 http://blog.csdn.net/u013142781/article/details/50503299 主要JS 方法 wx.getLocation 获取地理位置信息传递参数 成功 ...

  7. 【转】Android开发教程 --- Android调用WS

    原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/23/2297950.html Hi,大家好! 上节我们搭建了Java版的WS,那么在Andro ...

  8. ajax实战用法详解

    谦虚使人进步,总结使人提高! 以下5个方法执行一般Ajax请求的简短形式,在处理复杂的Ajax请求时应该使用jQuery.ajax() 1.load(url,[data],[callback])载入远 ...

  9. 安卓开发笔记——ViewPager组件(仿微信引导界面)

    这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGro ...

  10. 面向切面编程AOP,一些通用装饰器

    1.一些装饰器,可以减少重复编写.比较常用的. 用的时候函数上面加上装饰器就可以.这是一些装饰器,加在函数或者方法上,减少了很多重复代码. 除此之外工作中也用一些mixin类大幅减少代码. impor ...