Chat Server code:
#tcp chat server
import socket
from fltk import *
class tcpwin(Fl_Window):
    def __init__(self,x,y,w,h,label):
        Fl_Window.__init__(self,x,y,w,h,label)
        self.begin()
        self.conbut=Fl_Light_Button(10,30,170,40,"Accept Connection")
        self.conbut.callback(self.conbut_cb)
        self.end()
        self.callback(self.close)
        self.connD={} #dictionary of established connections
    def conbut_cb(self, wid):
        host = 'localhost'
        port= 4444
        self.s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #fd=3
        self.s.bind((host, port))
        self.s.listen()
        fdl=self.s.fileno() #listening fd
        Fl.add_fd(fdl, self.acceptConnection) #watch for new connections
    def acceptConnection(self, fdl): #runs when data comes to socket s
        conn, raddr = self.s.accept()
        fd=conn.fileno() #file descriptor for new established connection
        Fl.add_fd(fd, self.receive_data)
        self.connD[fd]=conn #add fd(key) and conn(value) to connD dict
    def close(self,wid):
        try: # in case no connection
            for fd,conn in self.connD.items():
                conn.close()
                Fl.remove_fd(fd)
        except:
            print('closing without a connection')
        finally:
            self.hide()
    def receive_data(self, fd):
        data= self.connD[fd].recv(1024)
        print(data)
        if data==b'':
            self.connD[fd].close()
            Fl.remove_fd(fd)
            self.connD.pop(fd)
        else:
            for conn in self.connD.values():
                conn.sendall(data)
a=tcpwin(55,55,200,200,"TCP Server")
a.show()
Fl.run()
Client code: exactly the same as last lesson
#tcp client
import socket
from fltk import *
class tcpwin(Fl_Window):
    def __init__(self,x,y,w,h,label):
        Fl_Window.__init__(self,x,y,w,h,label)
        self.begin()
        self.conbut=Fl_Light_Button(40,30,270,40,"Connect")
        self.inp=Fl_Input(40,80,270,40,"Send:")
        self.brow=Fl_Multi_Browser(40,130,270,140)
        self.end()
        self.callback(self.close)
        self.conbut.callback(self.conbut_cb)
        self.inp.callback(self.send_cb)
        self.inp.when(FL_WHEN_ENTER_KEY)
    def conbut_cb(self, wid):
        host = 'localhost'
        port= 4444
        self.s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #fd=3
        self.s.connect((host,port))
        self.fd=self.s.fileno() #3
        Fl.add_fd(self.fd, self.receive_data)
    def close(self,wid):
        try:
            self.s.close()
        except:
            print('closing without a connection')
        finally:
            self.hide()
    def send_cb(self, widget):
        self.s.sendall(self.inp.value().encode())
    def receive_data(self, fd):
        data=self.s.recv(1024)
        print(data)
        if data==b'':
            self.s.close()
            Fl.remove_fd(self.fd)
        else:
            self.brow.add(data.decode())
a=tcpwin(55,55,333,333,"TCP Client")
a.show()
Fl.run()