This a free and simple method to send messages, used to send data using TCP port. This concept can be used to send any data from one computer to another as long as each computer or device has the client side (Transmit Data) and server side (Receive Data) code onboard, or to send data one way if necessary.

With this code running on both ends the computer will be able to send and receive messages back and forth.

from datetime import datetime as d
import tkinter as UI
from tkinter import *
from tkinter import messagebox
from socket import gethostbyaddr, gethostname, socket, gethostbyname, AF_INET, SOCK_DGRAM, SOCK_STREAM
from socket import socket, AF_INET, SOCK_DGRAM
import threading
import playsound  
import os

#create globals
data = bytes()
conversasion_que = Text
server_ip = Entry
port = Entry
dir_path = os.getcwd()
print(dir_path)

#open file to get port information
try:
    with open(dir_path + r"\data\vars.txt", "r") as varFile:
        f = varFile.readlines()
        PORT_NUMBER = int(f[0])
except FileNotFoundError:
    messagebox.showinfo(title = "No File", message = "No file named vars.txt")

class Controller(UI.Tk):
    def __init__(self, *args, **kwargs):
        UI.Tk.__init__(self, *args, **kwargs)

        container = UI.Frame(self)
        container.grid(row=0, column=0, columnspan=10, sticky=NSEW)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (easy_messenger, messenger_setup):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky=NSEW)

        self.show_frame(easy_messenger)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class Get_External_Classes(UI.Frame):
    def call_send_message(self, message, ip, f):
        easy_messenger.clientside(message, ip)

#This code is only used to create the gui
class easy_messenger(UI.Frame):
    def __init__(self, parent, controller):
        UI.Frame.__init__(self, parent)
        global data
        global conversasion_que
        global server_ip
        global PORT_NUMBER
        
        label = Label(self, text="Easy Messenger App", font="italic 12 bold")
        label.grid(row=1, column=1, padx=75, columnspan=7, sticky=NSEW)

        label = Label(self, text="Name : ", font="italic 12 bold")
        label.grid(row=2, column=1, padx=10, columnspan=1, sticky=W)

        user_name = Entry(self, width=20)
        user_name.grid(row=2, column=1, sticky=E, pady=5, padx=5, ipadx=10, ipady=1)
        # user_name.insert(END, "Name")

        label = Label(self, text="Ports : " + str(PORT_NUMBER), font="italic 12 bold")
        label.grid(row=2, column=2, padx=25, columnspan=1, sticky=W)

        label = Label(self, text="IP : ", font="italic 12 bold")
        label.grid(row=2, column=3, padx=25, columnspan=1, sticky=W)

        server_ip = Entry(self, width=20)
        server_ip.grid(row=2, column=3, sticky=E, pady=5, padx=5, ipadx=10, ipady=1)
        
        messenger_input = Text(self, height=2)
        messenger_input.grid(row=5, column=1, columnspan=3, sticky=NSEW, pady=5, padx=5, ipadx=1, ipady=1)

        conversasion_que = Text(self)
        conversasion_que.grid(row=4, column=1, columnspan=3, sticky=NSEW, pady=5, padx=5, ipadx=1, ipady=1)

        send_message = Button(self, text="Send Message", font="None 12 bold", height=2, borderwidth=6, relief="groove", wraplength="100",
                               command=lambda: Get_External_Classes.call_send_message(self, "FROM : " + user_name.get() + " / Time: " + d.now().strftime("%I:%M %p") + "\nMessage: " + messenger_input.get(1.0, END), "IP : " + easy_messenger.get_Host_name_IP(), conversasion_que.insert(END, "FROM : " + user_name.get() + " / Time: " + d.now().strftime("%I:%M %p") + "\n Message: " + messenger_input.get(1.0, END))))
        send_message.grid(row=6, column=1, columnspan=3, sticky=NSEW, pady=10, padx=5)
        send_message.configure(background="green", foreground="yellow")

#Code used to receive data sent by client
    def serverside ():
        global data
        global conversasion_que
        global PORT_NUMBER 

        SIZE = 1024
        
        hostName = gethostbyname( '0.0.0.0' )
        print(gethostname())

        mySocket = socket( AF_INET, SOCK_DGRAM )
        mySocket.bind( (hostName, int(PORT_NUMBER)) )
        print ("Test server listening on port {0}\n".format(str(PORT_NUMBER)))

        while True:
            (data,addr) = mySocket.recvfrom(SIZE)
            if data.decode() == "Message Recieved!":
                messagebox.showinfo(title="MSG Recieved!", message="Message recieved by server")
                print(data)
                return
                
            if data[0:5].decode() == "IP : ":
                messengers_cpu = data[5:].decode()
                conversasion_que.insert(END, "Message From IP Address : " + messengers_cpu + "\n")
            else:    
                conversasion_que.insert(END, data)
            playsound.playsound(dir_path + "\sounds\pristine-609.mp3")
            
            # print(data)

    
    thread_ = threading.Thread(target=serverside)
    thread_.start()

#Code used send messages     
    def clientside (f, f1):
        global server_ip
        SERVER_IP  = str(server_ip.get())
        SIZE = 1024
        global PORT_NUMBER 

        print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER))

        mySocket = socket( AF_INET, SOCK_DGRAM )
        # message = f
        if True:
            mySocket.sendto(f1.encode(),(SERVER_IP, PORT_NUMBER))
            mySocket.sendto(f.encode(),(SERVER_IP, PORT_NUMBER))
            

    def get_Host_name_IP():
        try:
            host_name = gethostname()
            host_ip = gethostbyname(host_name)
            print("Hostname :  ",host_name)
            print("IP : ",host_ip)
            return(host_ip)
        except:
            print("Unable to get Hostname and IP")

print(easy_messenger.get_Host_name_IP())

class messenger_setup(UI.Frame):
    def __init__(self, parent, controller):
        UI.Frame.__init__(self, parent)



if __name__ == "__main__":
    app = Controller()
    photo = PhotoImage(file = dir_path + "\images\message_bubbles.png")
    app.title("Network Messenger")
    app.iconphoto(True, photo)
    app.mainloop()
    
  
   

Leave a Reply

Your email address will not be published. Required fields are marked *