python聊天程序tkinter_Python3 Tkinter简易聊天室(一)初步认识socket

规划

首先根据需求,在正式了解python相关内容之前,根据自己的开发经验(我Java,C居多),大致我们做以下规划,

Server:

socketServer:多线程监听端口,并保存连接的客户端,在有客户端掉线时,及时剔除

可以读取和保存用户信息,用户单独出一个类

可以保存和读取聊天记录

Client:

发送登录和注册信息

接收server发过来的聊天记录

管理员登录的时候还可以发送消息过去

由于需求规定,需要在win下运行

初步了解PythonSocket编程

这里跳过大量使用搜索引擎搜索的过程,直接说明结果吧。

socket server多线程编程根据以往的经验并不是一个可以快速开发的东西。现在搜索到了select这个函数, 这里是官网手册 ,

This module provides access to the select() and poll() functions available in most operating systems, devpoll() available on Solaris and derivatives, epoll() available on Linux 2.5+ and kqueue() available on most BSD. Note that on Windows, it only works for sockets; on other operating systems, it also works for other file types (in particular, on Unix, it works on pipes). It cannot be used on regular files to determine whether a file has grown since it was last read.

在win下,这个函数只能用于socket。

阅读IBM这篇教程 会发现socket编程都很类似,下面通过跟随这篇教程用简单的例子来说明用法

Python Sockets模块

基础的sockets模块

python提供了两个基础的sockets模块:Socket,提供了标准的BSD Sockets接口;SocketServer提供了服务器类来简化服务器上的开发,异步,你可以自己添加很多模块在上面。

Socekt模块

这个模块有你用来搭建服务器和客户端需要的所有的东西。实际上,在本次开发中,只用它来写server和client。

Socket 模块提供了 UNIX 程序员所熟悉的基本网络服务(也称为 BSD API)。这个 API 与标准的 C API 之间的区别在于它是面向对象的。在C中,socket描述符是从socket调用中获得的,然后会作为一个参数传递给BSD API函数。在Python中,socket 方法会向应用socket方法的对象返回一个socket对象。

以下函数均可以在 官方socket文档 里找到更详细的说明

类方法名

描述

socekt.socekt(family,type)

创建并返回一个新的socekt对象

socekt.getfqdn(name)

将使用点号分隔的 IP 地址字符串转换成一个完整的域名

socket.gethostbyname(hostname)

将主机名解析为一个使用点号分隔的 IP 地址字符串

socket.fromfd(fd, family, type)

从现有的文件描述符创建一个 socket 对象

|实例方法|说明|

|sock.bind( (adrs, port) )|将 socket 绑定到一个地址和端口上,注意有两层括号,bind传入的是一个元组|

|sock.accept()|返回一个客户机 socket(带有客户机端的地址信息)|

|sock.listen(backlog)|将 socket 设置成监听模式,能够监听 backlog 外来的连接请求|

|sock.connect( (adrs, port) )|将 socket 连接到定义的主机和端口上|

|sock.recv( buflen[, flags] )|从 socket 中接收数据,最多 buflen 个字符|

|sock.recvfrom( buflen[, flags] )|从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号|

|sock.send( data[, flags] )|通过 socket 发送数据|

|sock.sendto( data[, flags], addr )|通过 socket 发送数据|

|sock.close()|关闭 socket|

|sock.getsockopt( lvl, optname )|获得指定 socket 选项的值|

|sock.setsockopt( lvl, optname, val )|设置指定 socket 选项的值|

类方法和实例方法之间的区别在于,实例方法需要有一个socket实例(从socket返回)才能执行,而类方法 则不需要。

SocketServer模块

SockerServer模块是python封装好了的socket服务器。下面演示了一个简单的helloworld服务器,凡是连接上的,都会自动回复一个helloworld.

首先,类hwRequestHandler继承自 SocketServer.StreamRequestHandler 类,并定义了handle函数来处理客户端的连接请求。接下来就是通过 SocketServer.TCPServer 建立服务器的监听,当然需要传入服务器的ip地址和要监听的端口,调用 serve_forever 函数来启动这个服务器。

但是在本系列文章中,我们不采用这个方法,还是利用前面的socket模块来做。

import SocketServer

class hwRequestHandler( SocketServer.StreamRequestHandler ):

def handle( self ):

self.wfile.write("Hello World!\n")

server = SocketServer.TCPServer( ("", 2525), hwRequestHandler )

server.serve_forever()

Reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值