#客户端
import socket
import threading
import tkinter
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 5550)) flag = False
class Connection:
def __init__(self):
self.win = tkinter.Tk() # 创建主窗口
self.win.title('登陆界面')
self.win.geometry("400x400+200+20")
self.labelName = tkinter.Label(self.win, text='账号').grid(row=0, column=0)
self.labelPasswd = tkinter.Label(self.win, text='密码').grid(row=2, column=0) self.name = tkinter.Variable()
self.word = tkinter.Variable() self.entryName = tkinter.Entry(self.win, textvariable=self.name).grid(row=0, column=1)
self.entryPasswd = tkinter.Entry(self.win, show='*',width =20,textvariable= self.word).grid(row=2, column=1) self.text = tkinter.Text(self.win, height=10, width=20)
self.text.grid(row=5, column=1)
self.labeltext = tkinter.Label(self.win, text='消息').grid(row=5, column=0) self.button1 = tkinter.Button(self.win, text="连接", command=self.connect).grid(row=8, column=1)
self.win.mainloop() def connect(self): username = self.name.get()
password = self.word.get()
userinfo = username + '$' + password
sock.send(userinfo.encode())
info = sock.recv(1024).decode() if info == '0':
printStr = "账号或密码失败\n"
self.text.insert(tkinter.INSERT, printStr)
return
else:
printStr = "welcome to server!\n"
self.text.insert(tkinter.INSERT, printStr) global flag
flag = True
self.win.destroy() #连接成功关闭窗体 class Communicate:
def __init__(self):
self.win = tkinter.Tk() # 创建主窗口
self.win.title('聊天室')
self.win.geometry("400x300+200+20") self.mesg = tkinter.Variable() # 发送的信息
self.labelmesg = tkinter.Label(self.win, text='说话').grid(row=4, column=0)
self.entrymesg = tkinter.Entry(self.win, textvariable=self.mesg).grid(row=4, column=1) self.text = tkinter.Text(self.win, height=10, width=40)
self.text.grid(row=5, column=1)
self.labeltext = tkinter.Label(self.win, text='消息').grid(row=5, column=0) button2 = tkinter.Button(self.win, text="发送", command=self.sendThreadFunc).grid(row=8, column=2) th2 = threading.Thread(target=self.recvThreadFunc)
th2.setDaemon(True)
th2.start()
self.win.mainloop() def sendThreadFunc(self):
try:
myword = self.mesg.get()
self.mesg.set('')
sock.send(myword.encode())
if myword =='exit':
printStr = "你的聊天结束\n"
self.text.insert(tkinter.INSERT, printStr)
sock.close()
except ConnectionAbortedError:
printStr = "服务器终止了连接\n"
self.text.insert(tkinter.INSERT, printStr)
sock.close()
except ConnectionResetError:
printStr = "服务器崩了\n"
self.text.insert(tkinter.INSERT, printStr)
sock.close() def recvThreadFunc(self):
while True:
try:
otherword = sock.recv(1024).decode()
otherword = otherword +'\n'
if otherword:
self.text.insert(tkinter.INSERT, otherword)
else:
pass
except ConnectionAbortedError:
printStr = "服务器终止了连接\n"
self.text.insert(tkinter.INSERT, printStr)
sock.close()
break
except ConnectionResetError:
printStr = "服务器崩了\n"
self.text.insert(tkinter.INSERT, printStr)
sock.close()
break def shut_down(self):
self.win.destroy() #--------------------------用户窗体 if __name__ =='__main__':
deng = Connection()
if flag :
liao = Communicate()
#服务器端
import socket
import threading sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 5550)) sock.listen(5)
print('Server', socket.gethostbyname('localhost'), 'listening ...') mydict = dict()
mylist = list() account = {'123':'123','456':'456','root':'xiuwenL'}
name = ['123','456','789'] # 把whatToSay传给除了exceptNum的所有人
def tellOthers(exceptNum, whatToSay):
for c in mylist:
#if c.fileno() != exceptNum:
try:
c.send(whatToSay.encode())
except:
pass def subThreadIn(myconnection, connNumber,nickname):
#nickname = myconnection.recv(1024).decode()
mydict[myconnection.fileno()] = nickname
mylist.append(myconnection)
print('connection', connNumber, ' has nickname :', nickname)
tellOthers(connNumber, '【系统提示:' + mydict[connNumber] + ' 进入聊天室】')
while True:
try:
recvedMsg = myconnection.recv(1024).decode()
if recvedMsg:
if recvedMsg =='exit': #用户退出
mylist.remove(myconnection)
print(mydict[connNumber], 'exit, ', len(mylist), ' person left')
tellOthers(connNumber, '【系统提示:' + mydict[connNumber] + ' 离开聊天室】')
myconnection.close()
return print(mydict[connNumber], ':', recvedMsg)
tellOthers(connNumber, mydict[connNumber] + ' :' + recvedMsg) except (OSError, ConnectionResetError):
try:
mylist.remove(myconnection)
except:
pass
print(mydict[connNumber], 'exit, ', len(mylist), ' person left')
tellOthers(connNumber, '【系统提示:' + mydict[connNumber] + ' 离开聊天室】')
myconnection.close()
return while True:
connection, addr = sock.accept()
while True:
try:
# connection.settimeout(5)
suc = False
buf = connection.recv(1024).decode()
buf = buf.split('$')
if buf[0] in account.keys() and buf[1] in account.values() :
print('Accept a new connection', connection.getsockname(), connection.fileno())
connection.send(b'1')
suc = True else:
connection.send(b'0') if suc : #只有登陆成功才加入线程
# 为当前连接开辟一个新的线程
mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno(),buf[0]))
mythread.setDaemon(True)
mythread.start()
break
except:
connection.close()

python-socket作业的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

  4. Python socket编程之二:【struct.pack】&【struct.unpack】

    import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...

  5. Python Socket,How to Create Socket Server? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  6. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  7. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  8. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

  9. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  10. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题

    今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...

随机推荐

  1. 通用性能测试过程模型GAME(A)

    1.3.1  Goal(定义目标) 制定一个明确而详细的测试目标是性能测试开始的第一步,也是性能测试成功的关键. 本步骤的开始时间:需求获取阶段 本步骤的输入:性能需求意向 本步骤的输出:明确的性能测 ...

  2. 工作中php处理HTTP请求的缺陷总结

    之前遇到过php在处理一部分业务的时候总是感觉有短板,有些东西总是不能随人心意.比如执行时间问题,一个进程需要读取多条数据放入数组循环执行处理流程,就会很慢,容易超时,这个超时问题 可以用php设置s ...

  3. 1-2、superset国际化

    最近由于工作需要研究开源可视化项目superset,由于其国际化做不怎么好,故而记录下国际化的过程,本篇本着『授人以鱼不如授人以渔』的原则,只叙述国际化的过程及方法,不提供直接的国际化文件. 为了方便 ...

  4. 用vue2.0实现点击选中active,其他选项互斥的效果

    在正常的js中.我们如果要实现点击选中active然后其他取消的效果,我们可以定义一个类,当点击的时候给给多有的dom取消active的类,给当前元素加上这个类名,说的很啰嗦,直接来看代码说话吧(表示 ...

  5. 用Java向数据库中插入大量数据时的优化

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: public void ex ...

  6. SQL 使用序列

    SQL 使用序列 序列是根据需要产生的一组有序整数:1, 2, 3 ... 序列在数据库中经常用到,因为许多应用要求数据表中的的每一行都有一个唯一的值,序列为此提供了一种简单的方法. 本节阐述在 My ...

  7. 2D绘图引擎比较

    这个问题很普遍.最近在研究这个问题,在网上搜了一些资料,再结合自己的经验,谈谈自己的一些想法. 一.双缓存能提高绘图效率吗? 网上有篇文章:绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率 ...

  8. 微信开发 获取用户openId 与路由控制

    w实践,满足当前需求. www.w.com www.w.com/w1.php $wxurl='https://open.weixin.qq.com/connect/oauth2/authorize?a ...

  9. win10 计算器calc命令打不开

    解决方法: 1.用管理员身份运行WindowsPowerShell: 2.用控制台命令Get-AppxPackage读取微软应用列表: 3.找到NAME那里有Windows calculator的,这 ...

  10. PHP Ajax跨域解决

    PHP Ajax 跨域问题最佳解决方案 本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是serve ...