一、UPD Socket 编程

socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP 一样监听端口,建立连接。

socket.recvfrom(buffsize) : 接收UDP Socket 数据,该方法返回 二元组对象(data,address) ,data 是接收的字节序列对象;address 是发送数据的远程Socket 地址。参数buffsize 指定一次接收的最大字节数,因此如果要接收的数据量大于buffsize ,则需要多次调用该方法进行接收。

socket.sendto(bytes, address) : 发送UDP Socket 数据,将bytes 数据发送到地址为address 的远程Socket ,返回成功发送的字节数。如果要发送的数据量很大,则需要多次调用该方法发送数据。

举例:

# 服务器

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind(('', 8888))

print(' 服务器启动...')

# 从客户端接收数据

data, address = s.recvfrom(1024)

print(' 从客户端接收消息:{0}'.format(data.decode()))

# 给客户端发送数据

s.sendto(' 你好!'.encode(), address)

# 释放资源

s.close()

# 客户端

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 服务器地址

address=('127.0.0.1', 8888)

# 给服务器发送数据

s.sendto(b'Hello', address)

# 从服务器接收数据

data, _ = s.recvfrom(1024)

print(' 从服务器接收消息:{0}'.format(data.decode()))

# 释放资源

s.close()

二、TCP 上传文件

==服务器端:==

import wx

import socket

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None,size=(300,150),title="服务器接收文件")

self.Center()

panel=wx.Panel(self)

self.fileText = wx.TextCtrl(panel,id=-1,pos=(15,5),size=(200,25))

openButton = wx.Button(panel, label="开启服务器")

upButton = wx.Button(panel, label="保存" )

openButton.Bind(wx.EVT_BUTTON, self.acceptFile)

upButton.Bind(wx.EVT_BUTTON, self.saveFile)

box = wx.BoxSizer()

mainbox=wx.BoxSizer(wx.VERTICAL)

mainbox.Add(self.fileText, 1, flag= wx.ALL|wx.CENTER,border=10)

box.Add(openButton, 1, flag=wx.ALL|wx.CENTER,border=10)

box.Add(upButton, 1, flag=wx.ALL | wx.CENTER, border=10)

mainbox.Add(box, 1, flag=wx.ALL | wx.CENTER, border=10)

panel.SetSizer(mainbox)

def acceptFile(self, event):

self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.s.bind(("", 8888))

self.s.listen(5)

print("服务器启动····")

with self.s.accept()[0] as conn:

buffer = []

while True:

data = conn.recv(1024)

if data:

buffer.append(data)

else:

break

self.reust = bytes().join(buffer)

self.fileText.SetValue("接收完全,可选择位置保存!")

def saveFile(self, event):

dlg = wx.FileDialog(self,message="select the Save file style",defaultFile="",)

if dlg.ShowModal() == wx.ID_OK:

filename = ""

paths = dlg.GetPaths()

for path in paths:

filename = filename + path

self.fileText.SetValue(filename)

with open(filename, "wb") as file:

file.write(self.reust)

print("服务器文件保存完成····")

dlg.Destroy()

class App(wx.App):

def OnInit(self):

frame=MyFrame()

frame.Show()

return True

if __name__=="__main__":

app=App()

app.MainLoop()

==客户端:==

import socket

import wx

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None,size=(300,150),title="客户端上传文件")

self.Center()

panel=wx.Panel(self)

self.fileText = wx.TextCtrl(panel,id=-1,pos=(15,5),size=(200,25))

openButton = wx.Button(panel, label="打开")######

upButton = wx.Button(panel, label="上传" )

openButton.Bind(wx.EVT_BUTTON, self.onOpenFile)####

upButton.Bind(wx.EVT_BUTTON, self.upLoad)

box = wx.BoxSizer()

mainbox=wx.BoxSizer(wx.VERTICAL)

mainbox.Add(self.fileText, 1, flag= wx.ALL|wx.CENTER,border=10)

box.Add(openButton, 1, flag=wx.ALL|wx.CENTER,border=10)

box.Add(upButton, 1, flag=wx.ALL | wx.CENTER, border=10)

mainbox.Add(box, 1, flag=wx.ALL | wx.CENTER, border=10)

panel.SetSizer(mainbox)

def onOpenFile(self, event):

dlg = wx.FileDialog(

self, message="Choose a file",

defaultFile="",)

if dlg.ShowModal() == wx.ID_OK:

tmp = ""

paths = dlg.GetPaths()

for path in paths:

tmp=tmp+path

self.fileText.SetValue(tmp)

dlg.Destroy()

def upLoad(self,event):

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.connect(("127.0.0.1", 8888))

with open(self.fileText.GetValue(), "rb") as file:

while True:

data = file.read(1024)

if data:

s.send(data)

else:

break

print("上传完成")

class App(wx.App):

def OnInit(self):

frame=MyFrame()

frame.Show()

return True

if __name__=="__main__":

app=App()

app.MainLoop()

三、TCP 计算圆的面积

==服务器端:==

import socket

import wx

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None,size=(350,250),title="服务器:计算圆的面积")

self.Center()

panel=wx.Panel(self)

self.text = wx.TextCtrl(parent=panel, id=-1, style=wx.TE_MULTILINE,size=(100,150))

mainbox=wx.BoxSizer(wx.VERTICAL)

mainbox.Add(self.text,flag=wx.EXPAND)

panel.SetSizer(mainbox)

# 应用程序

class App(wx.App):

def OnInit(self):

frame=MyFrame()

frame.Show()

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.bind(("127.0.0.1", 8888))

s.listen(5)

with s.accept()[0] as conn:

while True:

data = conn.recv(1024)

if len(data) != 0:

frame.text.LabelText += "你的半径为:" + data.decode() + "\r\n"

msg=str(3.14*float(data.decode())**2)

conn.send(msg.encode())

frame.text.LabelText += "计算结果:" + msg + "\r\n"

else:

break

return True

# 进入main函数运行:循环

if __name__=="__main__":

app=App()

app.MainLoop()

==客户端:==

import socket

import wx

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None, size=(350, 250), title="客户端:计算圆的面积")

self.Center()

panel = wx.Panel(self)

self.text = wx.TextCtrl(parent=panel, id=-1, style=wx.TE_MULTILINE, size=(100, 150))

startbutton = wx.Button(parent=panel, id=1, label="连接服务器")

self.inputtext = wx.TextCtrl(parent=panel, id=3,style=wx.TE_PROCESS_ENTER)

button = wx.Button(parent=panel, id=2, label="发送")

self.Bind(wx.EVT_BUTTON, self.Talk, id=1)

self.Bind(wx.EVT_BUTTON, self.on_button, id=2)

self.Bind(wx.EVT_TEXT_ENTER, self.on_button, self.inputtext)

box1 = wx.BoxSizer()

box1.Add(startbutton, 1, flag=wx.ALL | wx.EXPAND, border=10)

box1.Add(self.inputtext, 1, flag=wx.ALL | wx.EXPAND, border=10)

box1.Add(button, 1, flag=wx.ALL | wx.EXPAND, border=10)

mainbox = wx.BoxSizer(wx.VERTICAL)

mainbox.Add(self.text, flag=wx.EXPAND)

mainbox.Add(box1, flag=wx.EXPAND)

panel.SetSizer(mainbox)

# 连接服务器函数

def Talk(self, event):

s.connect(("127.0.0.1", 8888))

return

# 发送信息给服务器端

def on_button(self, event):

msg = self.inputtext.GetValue()# 获取要发送的文本

s.send(msg.encode())# 给服务器端发送信息

self.text.LabelText += "请输入半径:" + msg + "\r\n"# 将发送信息写入纪录文本框

data = s.recv(1024)# 等待接收服务器端信息

if len(data) != 0:

self.text.LabelText += "服务器计算结果为:" + data.decode() + "\r\n"# 将发送信息写入纪录文本框

class App(wx.App):

def OnInit(self):

frame = MyFrame()

frame.Show()

return True

if __name__=="__main__":

app=App()

app.MainLoop()

本文使用 mdnice 排版

python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...相关推荐

  1. 用python编写一个求偶数阶乘的函数_一行Python代码写阶乘函数

    原标题:一行Python代码写阶乘函数 背景 我以前用Dart写过一行的阶乘函数: fact(double n) => n < 0 ? throw ('n must be bigger t ...

  2. python需要背的英语单词怎么写_学Python必须背的42个常见单词,看看你都会吗?...

    这42个单词是学习Python必须背会的单词,也是代码中常见的单词.希望你能都背下来!! 1. adult  [ˈædʌlt]  成年人 2. authentication [ɔːˌθentɪˈkeɪ ...

  3. 输入两个数、用python求他们的和_从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数C语言编程题:从键盘上输入两个...

    从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数 C语言编程题:从键盘上输入两个 www.zhiqu.org     时间: 2020-11-23 参考代码: #includev ...

  4. python太难学了-为何编程那么难?新手该怎么学Python?

    点击蓝字"python教程"关注我们哟! 为何编程那么难?新手该怎么学Python? 1 因为入门编程并不是一件分分钟就能做到的事情 具体的建议是先把整本书从前到后翻一遍,有印象就 ...

  5. 没有任何基础的可以学python吗-对没有编程基础的人来说,直接学Python入门IT合适吗?...

    原标题:对没有编程基础的人来说,直接学Python入门IT合适吗? 对于0基础的人,直接学 Python 编程合适吗? 小编只能说非常合适,因为在目前的编程语言中,Python的抽象程度是最高的,是最 ...

  6. python入门编程-对没有编程基础的人来说,直接学Python入门IT合适吗?

    原标题:对没有编程基础的人来说,直接学Python入门IT合适吗? 对于0基础的人,直接学 Python 编程合适吗? 小编只能说非常合适,因为在目前的编程语言中,Python的抽象程度是最高的,是最 ...

  7. Python网络编程之socket编程

    什么是Socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

  8. python适合自学编程吗-对没有编程基础的人来说,直接学Python入门IT合适吗?

    原标题:对没有编程基础的人来说,直接学Python入门IT合适吗? 对于0基础的人,直接学 Python 编程合适吗? 小编只能说非常合适,因为在目前的编程语言中,Python的抽象程度是最高的,是最 ...

  9. python的requests库发送携带上传文件的接口_python requests 库请求带有文件参数的接口实例...

    python requests 库请求带有文件参数的接口实例 有些接口参数是一个文件格式,比如fiddler 抓包参数如下显示 这个接口的 form-data fiddler 显示的和不带文件参数的接 ...

最新文章

  1. 深度学习框架盘点和实践!
  2. 2次转管理失败后,我对项目、团队、敏捷转型的新认知
  3. python soup提取叶子标签_python3用BeautifulSoup抓取div标签
  4. artDialog组件应用学习(五)
  5. zabbix3.0 监控php,CentOS 6.8 搭建Zabbix 3.0.3监控系统
  6. 索尼笔记本如何进Bios设置U盘启动
  7. 知乎热议:嵌入式开发中C++好用吗?
  8. 如何在ASP.NET Core中自定义Azure Storage File Provider
  9. 内蒙古高考2021年成绩查询,内蒙古招生考试信息网:2021年内蒙古高考查分入口、查分系统...
  10. php fast cgi nginx,通过fast-cgi连接php-fpm和nginx之间的连接是持久的(保持活动)连接吗?...
  11. 基础编程题之最近公共祖先
  12. 如何在linux内核中读写文件
  13. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量
  14. MAC下ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  15. Redis数据结构及内部编码
  16. [渝粤教育] 西南科技大学 财务会计 在线考试复习资料(3)
  17. Java编写程序获取验证码
  18. 手把手教你用Python网络爬虫实现起点小说下载
  19. leetcode 1184 看起来很吓人,其实很简单的题目
  20. 齐岳DSPE-mPEG2000|二硬脂酸磷脂酰乙醇胺-聚乙二醇2000

热门文章

  1. jQuery之防止【冒泡事件】,阻止默认行为 【return false】 event.stopPropagation event.preventDefault...
  2. CSS样式如何解决IE浏览器不同版本的兼容问题
  3. (转)Web Services使用多态(XmlInclude) ,支持自定义类型
  4. filter导致跨域失效_【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题...
  5. python 连续三个数满足条件_计算满足条件的连续值数(Pandas Dataframe)
  6. cf两边黑屏怎么解决win10_关闭自动睡眠仍然睡眠?Win10过几分钟就会自动睡眠黑屏解决方法...
  7. mysql关于日期的函数_MySQL中关于日期函数汇总
  8. pycharm无缘无故打开Nosetest
  9. 动态规划——数塔问题
  10. [FPGA]基于FPGA的数字跑表