前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HoneyTalk——我和我女朋友的专属情侣聊天器

HoneyTalk——我和我女朋友的专属情侣聊天器

作者头像
聪明的瓦肯人
修改2019-12-28 11:12:03
1.9K0
修改2019-12-28 11:12:03
举报
文章被收录于专栏:工科生日常工科生日常
其实这并不是什么大不了的东西 就是想写点东西 练练手 骗骗人 顺带着唬一唬你们 说道这个聊天器 不知道你们还记不记得这个

特别烂的Arduino聊天器 聪明的瓦肯人,公众号:工业光线嘘~~听说有逼格的人都基于Arduino搭建个人聊天室了!

见过烂的 没见过这么烂的

当然 这本身就不是什么主流玩意儿 一些软件适配做的非常糟糕 也是在情理之中

Arduino聊天室是一个匿名群聊应用 但是今天的应用是一对一 专属情侣聊天 话不多说 还不快来看看

1 情侣聊天 最重要的是什么? 当然是隐私 隐私是什么 隐私就是隐藏在个人心中的私事 由此看来 今天我们在社交软件上说的 每一句话都掌握在第三方机构中 这还得了

so 我们急需重新定义个人聊天 尤其是情侣聊天 让人民群众掌握自己的信息 才是最大的幸福

所以 为了拯救人民于水深火热之中 今天我(们)重磅推出 C2C聊天应用 HoneyTalk (以下简称HT)

HoneyTalk分为 He和She 实际上 HT是伪C2C,真S2C 因为其中一端就是服务端 直接将服务端作为客户端的方式 绕过了第三方服务器 在最大程度上保护了隐私 所有数据只有对话双方知道 当然这种方式增加了联通的复杂性 这是因为以现状来看 如果你想要联通任何人 每人既需要服务端用来等待连接 也需要客户端发起连接 非常不方便 目前看来 只适合情侣聊天这种单一简单场景 我们先来看看界面

显而易见

这高贵的0.9透明度

彰显着年轻人的不拘一格 交互界面非常简单 其中蓝色界面是服务端界面 粉色界面是客户端界面

1区是对话显示区

2区是消息发送区 设计初衷一目了然 男生是服务端 女生是客户端

但不仅仅如此

你们一定以为

作为服务器的男生一定占据着主动

而女生则处处被动

确切的说

服务器是否运行确实决定了软件是否运行

但是

作为宠妻狂魔

我......呃呃呃

emmmm~

不对呀

嘴巴不受控制了

(不好意思,这是未来的事)

反正

我是不可能让我广大女朋友吃亏的

只要广大女朋友

能说服你的直男启动服务器

我小瓦就能帮你扳回一局

这是为什么呢?

这是因为我小瓦赋予了

客户端非常高的权限

什么意思?

首先

服务器一旦启动

男生没有发起对话的权利

这一点很好理解

服务器总是在等待连接

只有当你心爱的女朋友

开心了、伤心了、寂寞了

打开了HT发起连接

服务器才响应启动对话界面

可是很不幸

今天这个渣男非常不耐烦

企图关掉对话界面

嘿嘿嘿!

不好意思你没有这个权限

渣男不但没有权限

而且这个危险的行为

会立刻被你女朋友知晓

可是如果情况恰恰相反

你的女朋友今天看你不爽

难得理你

她只需轻轻地抬起她的玉指

就可以了结此次对话

所有对话界面都将关闭

可是你还想你侬我侬

怎么办?

不要急,办法总比困难多

这时候

你必须马上送上

兄弟

听我一句话

不在乎那点钱

保命要紧

2

介绍完了基本情况

再来点实在的

关于怎么用的问题

当你下载了文件后

首先你需要注意的是

由于程序需要调用.ico图标

所以你必须保证.ico图片与程序在同一目录下

然后

服务端很简单

双击HoneyTalkHe.exe

等待一段时间,显示基本信息

之后会隐藏在后台运行

要想关闭得去任务管理器进程界面

而客户端

双击HoneyTalkShe.exe

等待之后出现如下

你需要输入地址与端口

局域网下

你得去问问渣男地址

端口我已设好

只能是8888

公网下

渣男得去做socket内网穿透

地址与端口视情况而定

每一次填好后然后回车

最后等待连接

成功后就能快乐的私密的聊天了

最后

请不要重复启动

那样你将打开一个无用界面

3

送上代码是我一向的原则

本次练手小项目

结合了Socket网络编程与GUI编程

这其中有一些坑得亲自去踩才有意义

公众号发送“HT”获得软件

或者

github地址:https://github.com/xjc-jim/HoneyTalk

服务端:

代码语言:javascript
复制
#!/usr/bin/env python3
# 文件名:socket_fuWu.py
# 开发者:聪明的瓦肯人
# 微信公众号:工业光线
# 个人主页:http://www.tech-xjc.com

import socket
import time
import win32api
import win32gui
from tkinter import *
import threading
from tkinter import scrolledtext
from tkinter.messagebox import showerror
from tkinter.messagebox import showinfo

#回调函数事件
event = '<Return>'     
error = '注意:对面的渣男试图关闭对话框,已被拦截!'

# 创建 socket 对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#获取本机电脑名
myname = socket.gethostname()
#获取本机ip
myaddr = socket.gethostbyname(myname)

print(myname)
print(myaddr)
s.bind((myaddr,8888))

s.listen(1)
print("waiting......")
print('5秒后将隐藏窗口!')
time.sleep(5)

#隐藏控制台窗口
ct = win32api.GetConsoleTitle()
hd = win32gui.FindWindow(0,ct)
win32gui.ShowWindow(hd,0)                           
class GUI(object):
    def __init__(self,root):
        self.root = root
        self.root.geometry('270x360')
        self.root.resizable(width=False, height=False)
        self.root.title('HoneyTalk_HE')
        self.root.iconbitmap('boy.ico')
        self.root['background'] = 'lightskyblue'
        self.root.attributes('-alpha',0.9)
        # 检测关闭按钮
        self.root.protocol('WM_DELETE_WINDOW',self.close)
        self.entry = Entry(self.root)
        self.entry.place(x=10,y=325)
        # 检测回车
        self.entry.bind("<Return>",self.callback)
        self.button = Button(self.root,text = 'send',command = self.sending)
        self.button.place(x=165,y=322)
        self.button0 = Button(self.root,text = 'More',command = self.more)
        self.button0.place(x=215,y=322)
        self.sock = sock
        self.out = scrolledtext.ScrolledText(self.root)
        self.out.place(x=10,y=0,width=250)
        #设置tag即插入文字的大小,颜色等
        self.out.tag_config('tag0',foreground = 'hotpink') 
        self.out.tag_config('tag1',foreground = '#1E90FF')

    def close(self):
        try:
            showerror('警告','渣男好大的胆,你无权关闭对话框!')
            self.sock.send(error.encode('utf-8'))
        except:
            self.sock.send(error.encode('utf-8'))
            pass
        return
        
    def sending(self):
        content = self.entry.get()
        
        if content != '':
            self.out.config(state = 'normal')
        self.out.insert(END,'HE:'+content+'\n\n','tag1')
        self.out.see(END)
        self.out.config(state = 'disable')
        
        try:
            self.sock.send(content.encode('utf-8'))
            self.entry.delete(0,END)
        except:
            sock.shutdown(2)
            sock.close()
            pass

    #回调函数
    def callback(self,event):                   
        content = self.entry.get()
        
        if content != '':
            self.out.config(state = 'normal')
        self.out.insert(END,'HE:'+content+'\n\n','tag1')
        self.out.see(END)
        self.out.config(state = 'disable')
        
        try:
            self.sock.send(content.encode('utf-8'))
            self.entry.delete(0,END)
        except:
            pass

    def more(self):
        try:
            showinfo(title='关于',message='1.作者:聪明的瓦肯人 \n2.公众号:工业光线(GongYe_Light) \n3.个人主页:http://www.tech-xjc.com \n4.公众号发送“honeytalk”获得详细介绍 \n5.网络问题会造成回复延迟 \n6.正常使用时请勿重复启动 \n7.请先启动该服务器再启动客户端 \n')
        except:
            pass
    
def create():
    global gui
    global root
    root = Tk()
    gui = GUI(root)
    
def rec():
    while True:
        try:
            msg = sock.recv(1024)
            gui.out.config(state = 'normal')
            con = bytes.decode(msg)
            gui.out.insert(END,'SHE:'+con+'\n\n','tag0')
            gui.out.see(END)
            gui.out.config(state = 'disable')
        except:
            sock.shutdown(2)
            sock.close()
            break
    # 退出mainloop
    root.quit()
    

if __name__ == '__main__':
    while True:
        sock,addr = s.accept()

        t1 = threading.Thread(target = rec,name = 'rec')
        t1.setDaemon(True)
        
        create()
        t1.start()
        root.mainloop()
        # 彻底关掉界面
        root.destroy()

客户端:

代码语言:javascript
复制
#!/usr/bin/env python3
# 文件名:socket_keHu.py
# 作者:聪明的瓦肯人
# 微信公众号:工业光线
# 个人主页:http://www.tech-xjc.com

# 导入 socket 等模块
import os
import time
import socket
import sqlite3
import win32api
import win32gui
from tkinter import *
import threading
from tkinter import scrolledtext
from tkinter.messagebox import showinfo

adr = input('>>请输入局域网或公网地址:')
port = input('>>请输入局域网或公网端口:')
#回调函数事件
event = '<Return>'  
error = '注意:对面的渣男试图关闭对话框,已被拦截!'

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# 连接服务,指定主机和端口
try:
    s.connect((adr, int(port)))
    print('连接成功!')
    print('5秒后隐藏窗口!')
    time.sleep(5)
    
    #隐藏控制台窗口
    ct = win32api.GetConsoleTitle()
    hd = win32gui.FindWindow(0,ct)
    win32gui.ShowWindow(hd,0)   
except:
    print('连接失败,地址端口错误或服务器未启动!')
    print('5秒后关闭程序')
    time.sleep(5)
    os._exit(0)

class GUI(object):
    def __init__(self,root):
        self.root = root
        self.root.geometry('270x360')
        self.root.resizable(width=False, height=False)
        self.root.title('HoneyTalk_SHE')
        self.root.iconbitmap('girl.ico')
        self.root['background'] = 'pink'
        self.root.attributes('-alpha',0.9)
        self.root.protocol('WM_DELETE_WINDOW',self.close)
        self.entry = Entry(self.root)
        self.entry.place(x=10,y=325)
        self.entry.bind("<Return>",self.callback)
        self.button = Button(self.root,text = 'Send',command = self.send)
        self.button.place(x=165,y=322)
        self.button0 = Button(self.root,text = 'More',command = self.more)
        self.button0.place(x=215,y=322)
        self.out = scrolledtext.ScrolledText(self.root)
        self.out.place(x=10,y=0,width=250)
        #设置tag即插入文字的大小,颜色等
        self.out.tag_config('tag0',foreground = 'hotpink') 
        self.out.tag_config('tag1',foreground = '#1E90FF')

    def close(self):
        #showinfo('提示','确认关闭程序吗?')
        s.close()
        os._exit(0)

    def send(self):
        content = self.entry.get()
        
        if content != '':
            self.out.config(state = 'normal')
        self.out.insert(END,'SHE:'+content+'\n\n','tag0')
        self.out.see(END)
        self.out.config(state = 'disable')
        
        try:
            s.send(content.encode('utf-8'))
            self.entry.delete(0,END)
        except:
            pass

    def callback(self,event):
        content = self.entry.get()
        
        if content != '':
            self.out.config(state = 'normal')
        self.out.insert(END,'SHE:'+content+'\n\n','tag0')
        self.out.see(END)
        self.out.config(state = 'disable')
        
        try:
            s.send(content.encode('utf-8'))
            self.entry.delete(0,END)
        except:
            pass

    def more(self):
        showinfo(title='关于',message='1.作者:聪明的瓦肯人 \n2.公众号:工业光线(GongYe_Light) \n3.个人主页:http://www.tech-xjc.com \n4.公众号发送“honeytalk”获得详细介绍 \n5.网络问题会造成回复延迟 \n6.正常使用时请勿重复启动 \n7.请先启动服务器再启动该客户端 \n')
    
def create():
    global gui
    global root
    root = Tk()
    gui = GUI(root)
    root.mainloop()

def rec():
    while True:
        try:
            msg = s.recv(1024)
            gui.out.config(state = 'normal')
            con = msg.decode('utf-8')
            
            if con == error:
                gui.out.insert(END,con+'\n\n')
            else:
                gui.out.insert(END,'HE:'+con+'\n\n','tag1')

            gui.out.see(END)
            gui.out.config(state = 'disable')
        except:
            gui.out.config(state = 'normal')
            gui.out.insert(END,'啊哦~!服务器疑似下线!请敦促男友重启!然后再重启客户端!\n\n')
            gui.out.see(END)
            gui.out.config(state = 'disable')
            break

if __name__ == '__main__':
    t1 = threading.Thread(target = create,name = 'create')
    t1.start()
    try:
        rec()
    except:
        pass

over!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 工科生日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档