这次学习涉及以下几个问题:

1,同时运行两个python程序的方法

2,socket编程初探

3,多线程编程初探

4,GUI编程tix部分控件的属性

5,Python的list类型

1、同时运行两个程序的方法

有这个问题的原因是:socket编程,通常是两个程序进行试验,server和client。之前搞了好长时间,使用vscode调试的时候发现一个IDE只能运行一个程序。

问题解决也很简单:开两个vscode。。。

2、socket编程

socket最基本的编程模型:Server-Client模型(TCP链接)。

2.1 基本模型

2.2 服务端代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py
import socket            # 导入 socket 模块
import sys
s = socket.socket()          # 创建 socket 对象
host = socket.gethostname()  # 获取本地主机名
port = 33222                # 设置端口
s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接
while True:conn, addr = s.accept()     # 建立客户端连接print(conn)print(addr)recvbuff = conn.recv(1024).decode()print(recvbuff)sendbuf = '已经链接'conn.send(sendbuf.encode())s.close()                # 关闭连接
conn.close()
sys.exit()

2.3 客户端代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:client.pyimport socket               # 导入 socket 模块c = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 33222                # 设置端口号c.connect((host, port))
c.send('我是土豆!'.encode());
print(c.recv(1024).decode())
c.close()

2.4 运行结果

服务端:

客户端:

3、多线程编程

由于本次练习的程序需要GUI窗口和socket编程两个过程(模块)。以我的知识,为了不让两个过程冲突,我认为需要使用多线程编程。

  1. 第一个是主程序:窗口及其控件的处理
  2. 第二个是线程:   socket数据收发的处理

调用thread模块中的start_new_thread()函数来产生新线程。语法如下:

thread.start_new_thread ( function, args[, kwargs] )

参数说明:

  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个tuple类型。
  • kwargs - 可选参数。

4、控件属性

由于要对对话框进行简单的设置,我这次需要用到以下几个控件属性

justify

定义对齐方式,可选值有:LEFT,RIGHT,CENTER,默认为 CENTER。

relief

边框样式,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。

width

设置标签宽度,默认值是 0,自动计算,单位以像素计。

height

标签的高度,默认值是 0。

5、list对象

作为Server端接收方,要在Lable上显示从Client收到的数据,而且是积累数据。有几种方法:

  1. Lable能自己记住历史数据;
  2. 自己写一个类似于链表的东西记录历史数据;
  3. 面向对象的语言一般都有自己成熟的类似链表的类;

本次是学习,所以就找了下Python是否有自己成熟的类或者对象,List符合要求

序列(List)是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

Python有6个序列的内置类型,但最常见的是列表和元组。

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]

这个东西基本可以使用:先把Server每次从Client收到的数据存到List,显示的时候顺序打出来,放到Lable的text框中

6、一个socket对话框的代码示例

服务端代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py
import _thread
from tkinter import  GROOVE, RAISED, RIDGE, SUNKEN, LEFT, StringVar, tix
import socket            # 导入 socket 模块
import sys   recvbuff = 'hello world! \n你好,世界'
listbuff = []conn = socket.socket()
def recvfun():s = socket.socket()          # 创建 socket 对象host = socket.gethostname()  # 获取本地主机名port = 33222                # 设置端口s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接global conn global listbuffconn, addr = s.accept()     # 建立客户端连接while True:  l_test_buff = '' recvbuff = conn.recv(1024).decode()recvbuff = str(addr)+':'+recvbuff+'\n'listbuff.append(recvbuff)for recb1 in listbuff:l_test_buff = l_test_buff + recb1l_text.set(l_test_buff)return#创建线程处理收到的消息
_thread.start_new_thread(recvfun)#def windows_init():
mywin = tix.Tk()
mywin.title("socket window Server")#定义StringVar
l_text = StringVar()
l_text.set(recvbuff)
#初始化数据
text = "hello world! \n你好,世界"
l_text.set(text)#button2 myclean实现 清除Entry内容,并回复成原状
def myclearn():text = "hello world! \n你好,世界"l_text.set(text)e_00.delete(0, "end")return#FLAT、SUNKEN、RAISED、GROOVE、RIDGE
#l_00 = tix.Label(root, font=("微软雅黑", 12), width=40, height=10, relief=SUNKEN, bg='#FFFFFF')    .set(recvbuff)
#justify 定义对齐方式,可选值有:LEFT,RIGHT,CENTER,默认为 CENTER。
l_00 = tix.Label(mywin, font=("微软雅黑", 12), relief=SUNKEN, justify=LEFT, width=40, height=10, textvariable=l_text)
l_00.pack(pady=20)e_00 = tix.Entry(mywin, font=("微软雅黑", 12))
e_00.pack(pady=20)#服务端暂时没用
def sendmsg():text = e_00.get()#l_text.set(text)conn.send(text.encode())returnb1 = tix.Button(mywin, text="发送", command=sendmsg)
b1.pack(pady=10, side='left')b2 = tix.Button(mywin, text="清空", command=myclearn)
b2.pack(before=b1, side='left', padx=70, pady=10)# 进入消息循环
mywin.mainloop()#return
#窗口#_thread.start_new_thread(windows_init)#windows_init()

客户端代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py
import _thread
from tkinter import  GROOVE, RAISED, RIDGE, SUNKEN, StringVar, tix
import socket            # 导入 socket 模块
import sys   recvbuff = 'hello world! \n你好,世界'def recvfun():s = socket.socket()          # 创建 socket 对象host = socket.gethostname()  # 获取本地主机名port = 33222                # 设置端口s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接while True:conn, addr = s.accept()     # 建立客户端连接recvbuff = conn.recv(1024).decode()recvbuff = str(addr)+':'+recvbuffl_text.set(recvbuff)#print(recvbuff)#sendbuf = '已经连接!'conn.send(sendbuf.encode())return#_thread.start_new_thread(recvfun)#def windows_init():
mywin = tix.Tk()
mywin.title("socket window Client")#定义StringVar
l_text = StringVar()
l_text.set(recvbuff)
#初始化数据
text = "hello world! \n你好,世界"
l_text.set(text)c = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 33222    # 设置端口号
c.connect((host, port))#button2 myclean实现 清除Entry内容,并回复成原状
def myclearn():text = "hello world! \n你好,世界"l_text.set(text)e_00.delete(0, "end")global cc.close()return#FLAT、SUNKEN、RAISED、GROOVE、RIDGE#l_00 = tix.Label(root, font=("微软雅黑", 12), width=40, height=10, relief=SUNKEN, bg='#FFFFFF')    .set(recvbuff)l_00 = tix.Label(mywin, font=("微软雅黑", 12), relief=SUNKEN,  width=40, height=10, textvariable=l_text)
l_00.pack(pady=20)e_00 = tix.Entry(mywin, font=("微软雅黑", 12))
e_00.pack(pady=20)def sendmsg():  global c          text = e_00.get()c.send(text.encode());returnb1 = tix.Button(mywin, text="发送", command=sendmsg)
b1.pack(pady=10, side='left')b2 = tix.Button(mywin, text="清空", command=myclearn)
b2.pack(before=b1, side='left', padx=70, pady=10)# 进入消息循环
mywin.mainloop()#return
#窗口#_thread.start_new_thread(windows_init)#windows_init()

运行结果:

左边Server,右边Client

Pyton学习(5)--socket编程,一个简单的对话框相关推荐

  1. python socket编程 实现简单p2p聊天程序

    转载自:https://www.cnblogs.com/wuxie1989/p/7204887.html python socket编程 实现简单p2p聊天程序 目标是写一个python的p2p聊天的 ...

  2. java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信

    Socket编程之简单客户端与服务器端通信 socket 通常用来实现客户端和服务端的连接,socket 是Tcp/Ip协议的一个十分流行的编程界面,一个socket 由一个Ip地址和一个端口号唯一确 ...

  3. Socket编程之简单介绍 - 蓝天下的雨 - 博客园

    Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 2013-03-19 15:27 by 蓝天下的雨, 878 ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. 【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器

    1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Da ...

  6. 如何用socket构建一个简单的Web Server

    2019独角兽企业重金招聘Python工程师标准>>> 背景 现代社会网络应用随处可见,不管我们是在浏览网页.发送电子邮件还是在线游戏都离不开网络应用程序,网络编程正在变得越来越重要 ...

  7. Socket编程之简单介绍

    一:套接字编程相关知识点 Socket概念:套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机进行,也可以跨网络进行. 网络中的进程是通过socket来通信的.socket ...

  8. Linux学习之socket编程(一)

    socket编程 socket的概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为sock ...

  9. C# Socket编程实现简单的局域网聊天器

    前言 最近在学习C# Socket相关的知识,学习之余,动手做了一个简单的局域网聊天器.有萌生做这个的想法,主要是由于之前家里两台电脑之间想要传输文件十分麻烦,需要借助QQ,微信或者其他第三方应用,基 ...

最新文章

  1. javascript中的字典
  2. java 延迟实例化_延迟初始化Spring Bean的几种方式
  3. 让自己的代码生成对应的chm帮助文档
  4. python writelines_Python文件writelines()方法
  5. [leetcode]Symmetric Tree
  6. import python file in currently folder
  7. HDU 1269 迷宫城堡 (强连通分量,常规)
  8. 拖动滑块验证 php,基于JS组件实现拖动滑块验证功能
  9. python的pyaudio教程入门_Python音频操作工具PyAudio上手教程
  10. 【STM32F429】第6章 ThreadX操作系统移植(IAR)
  11. 关于在SW中怎么放样凸台基体
  12. v-show和v-if有什么区别
  13. win11提示找不到gpedit.msc命令
  14. 车牌识别EasyPR--开发详解
  15. 临床试验中lm是什么职位_除了CRX职位,临床试验中还有这些岗位
  16. java触发器linux,Auto activation triggers for Java(代码提示)功能扩展
  17. ImportError: cannot import name ‘get_num_classes’ from ‘torchmetrics.utilities.data’
  18. 又要去迪士尼了。。。
  19. 目标检测论文解读复现之十八:基于注意力机制的光线昏暗条件下口罩佩戴检测
  20. 马化腾“互联网+中国”峰会演讲

热门文章

  1. 理财入门:反常识--股票暴跌收益会更高(简单介绍,这篇主要是劝不要盲目投机)
  2. linux查找cuda安装路径,ubuntu 16.04 cuda安装在哪儿
  3. 2017计算机专业在职研究生,2017年计算机在职研究生考试科目
  4. java图片怎么定义属性_Java读写图片XMP元数据XMPMeta(自定义属性信息)
  5. jsp的内置对象简介
  6. 浅谈js基本数据类型与引用数据类型的引用
  7. 同花顺_代码解析_技术指标_R
  8. c语言键盘输入屏幕输出ppt,c语言健盘输入与屏幕输出.ppt
  9. LiteFlow v2.7.1版本发布新版官网上线
  10. [架构之路-193]-《软考-系统分析师》-2-应用数学 - 项目周期与关键路径(PERT图、甘特图、单代号网络图、双代号网络图)