python-socket作业
#客户端
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作业的更多相关文章
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- python socket发送魔法包网络唤醒开机.py
python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...
- Python socket编程之二:【struct.pack】&【struct.unpack】
import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...
- Python Socket,How to Create Socket Server? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket,How to Create Socket Cilent? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- python socket之tcp服务器与客户端demo
python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...
- python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...
随机推荐
- Hibernate_day03--Hibernate多对多操作
Hibernate多对多操作 多对多映射配置 以用户和角色为例演示 第一步 创建实体类,用户和角色 第二步 让两个实体类之间互相表示 (1)一个用户里面表示所有角色,使用set集合 具体: User. ...
- 复习及总结--.Net线程篇(1)
老是没耐心写这些东西,最近想想也工作两年了,该对自己的东西做个整理了,不知道这次能坚持写几篇,总得来说尽量督促自己吧 言归正传,.net中的多线程主要可以使用两种方法进行调用 1,异步调用 2,Thr ...
- vue2.0非父子间进行通讯
在vue中,父组件向之组件通讯使用的是props,子组件向父组件通讯使用的是$emit+事件,那非父子间的通讯呢,在官方文档上只有寥寥数笔, 概念很模糊,这个空的vue实例应该放在哪里呢,光放文档并没 ...
- 部分常用dos命令
Microsoft Windows XP [版本 ] (C) 版权所有 - Microsoft Corp. C:\Documents and Settings\Administrator>d: ...
- 应急分析异常通信的小思路和自己写的小工具(查询CNAME和A记录)
一.背景: 在很多时候,应急会发现.卧槽,异常连接,只有一个域名或者IP. 怎么办?上防火墙看记录,查域名对应的记录累成狗,自己把之前的代码改了改,写了个小工具,一条命令查询DNS相关记录,也可以指定 ...
- eclipse控制台不限制显示的行数
在Preferences中搜索Console,设置Limit console output没有限制即可.
- python3个人习惯的gitignore
简介 就是普通的.gitignore # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C ext ...
- java递归构建菜单树
package testSimple; import java.util.ArrayList; import java.util.List; public class BuildTree { publ ...
- 该死的Kafka,远程连接Kafka超时以及解决办法
关于消息的发布与订阅,之前一直使用的是activeMQ基于JMS的消息队列进行操作的,最近听说有一个更高效的消息的发布与订阅技术,就是Kafka. 关于kafka的介绍,在这里就不做过多讲解了,因为我 ...
- 2018 又一个假期 over 了
五一假期三天 在家窝三天 早上起床仍感觉没休息好 其实确实没休息好 假期的时间总不愿意拿来补觉用.周末准备去体检,真心恐惧医院的味道,硬着头皮还得上啊.