Delphi

This Is How To Improve the Performance of .NET Apps

Microsoft’s .Net is one of the most popular technologies used by businesses to power mission-critical digital services. Millions of developers use C#, ASP.Net, etc., to develop different types of widely used software solutions, primarily for Windows development. Solutions which use .Net range from Windows client applications, database applications, XML web services to niche corporate boutique-style apps. Therefore, it’s no surprise that ensuring the optimal performance of .Net applications is the main focus for organizations and developers running them. Different factors inhibit the performance of .Net applications. Before we discuss the perfect solution for .Net performance issues, let’s review these factors. What are the most common .Net performance issues? .Net applications can often perform poorly for a variety of reasons. However, two top factors are responsible for most .Net performance issues: busy UI, and garbage collection/memory pressure.  How does busy UI (dispatcher) thread affect application performance? If your desktop application’s UI freezes or lags, it is often related to the user interface (UI) thread or the dispatcher thread in the case of server applications. A UI thread can become busy due to different reasons— an algorithmic error or a thread contention; when a UI thread is waiting on a lock.  The primary duty of a UI thread is to execute blocks of work, one at a time until the application closes. When your application’s UI is running animation or trying to update screen elements or handle data, the system tries to execute the block of work responsible for the screen every 16 milliseconds so as to achieve the UI ideal goal of 60 frames per second. For this to be the case, the UI hierarchy must update simultaneously on the UI thread. However, regardless of how you synchronize your code, there are portions you can only run through one thread at a time. This leads to the thread containing numerous waiting UI tasks, making the queue too long to update the UI thread fast enough.  Consider going to a busy bank with only one bank clerk to help people out: multiple people can enter the bank to fill their requests but have to line up to receive any banking service. In this illustration, the service offering process is single-threaded, as it is with .Net applications. When the thread becomes busy, in other words, clogged with too many tasks, it can result in an application performance bottleneck.  How does garbage collection/memory pressure slow down .Net applications? .Net applications automatically dispose of inert obsoleted objects or objects that are inaccessible from the root when the system is running low on physical memory or when you explicitly use the GC.Collect() method. This automatic memory management is known as garbage collection. While this works to effectively manage memory pressure for .Net applications, over time, they reach points of insurmountable pressure, where the applications spend more time managing memory rather than executing instructions.  Generally, garbage collection pressure and busy UI slows down the performance of .Net applications. Fortunately, there are two tried and trusted ways you can avoid these pitfalls— switching to Delphi or using a .Net Delphi bridge.  Why should I switch from .Net to Delphi? Delphi is a tried and tested incredibly stable market-leading rapid application development environment. You can build native and cross-platform applications several times faster than most other solutions. In fact, […]

Read More

This Is How To Explain Automation To Your Boss

Behind every successful organization, especially those specializing in windows application development, are innovative solutions and strategies which were, at some point, just ideas in the minds of employees like yourself. You’ve probably identified areas of improvement in your organization’s workflows, and automation signifies a business potential if you can turn your ideas into reality.  According to a renowned American advertiser, Lois Wyse, “the only people in the world who can change things are those who can sell ideas.” Most of us realize it’s not enough just to spot automation as a business potential; we need to ideate, evaluate, and get buy-in from our bosses to move from idea to implementation. This is not always easy; more often than not, our bosses are busy people who might already be overwhelmed with executing their own priorities as well as that of their higher-ups. So, taking on a new approach may take a back seat to their day-to-day activities.  Automation is changing the way businesses run and manage processes; from improved asset utilization and increased productivity to faster process completion, the opportunities could be endless. You know all this, but how do you get your boss to buy in? How can you tailor your explanation to your boss’ goals and values? It is essential for anyone looking to sell anything, an idea or a product, to understand their audience’s goals and values. In this case, you need to know your boss’s unique blend of business goals and values. One way to go about this is by speaking directly to your boss on their goals and vision for the organization. For example, your boss might want to eliminate data silos, facilitate faster decision-making or faster process completion, and ultimately double revenue in four years. In addition to the many benefits of automation, it unlocks data silos, bringing data together from disparate sources and allowing for better data consumption and analysis. With the feedback from your boss, you can draft explanations and recommendations on all the revenue benefits, alongside a working strategy on how you hope to implement it. For example, what automation tools you’d be employing, what processes, and how you can double revenue by saving money through automation. How can you support your explanation with evidence from similar companies? Although recent advances in control system technology and machine learning have taken workflow automation to new heights, businesses and employees have been benefitting from its implementation for quite some time. For example, Amazon has been reaping automation benefits since 2012, when they bought a robotics company.  So, identify successful competitors within your market that are implementing automation and probably poaching your customers. This shouldn’t be a difficult task; odds are every organization implementing automation with the right strategy is successful. Locate them and use them to support your explanation. You can also include a detailed comparison of the two systems, with and without automation, using a reasonable sample size of companies before and after adopting automation. Photo by fauxels from Pexels How can you bring in an automation expert to bolster your case? If your boss is like mine, they probably trust the word of an expert more than that of his employee. Except you’re an automation expert yourself, offering to bring in one to explain further the new technology merits will definitely bolster […]

Read More

Everything You Need To Create Windows Apps With C++

When you want to create a new app for Windows 10 or a new version, Windows 11, the first decision you make is what type of app to build. No matter what your app idea is there is a great selection of Windows app development tools to choose from. Microsoft has focused it’s more recent efforts on the C# programming language and its own proprietary technologies of WPF, UWP, WinForms, and .NET MAUI. You can use Microsoft’s tools to create Windows applications but there are a couple of other options which give more independent functionality and with the added bonus of huge productivity gains. This article contains all the information you need to get started building apps in C++ for Microsoft Windows. I’ve started using Dev-C++ and had a lot of fun figuring out all the things I can do with console applications. I really enjoying building C++ Win32 desktop applications, sometimes called classic desktop apps. You can get the latest and updated version of Dev-C++ from the Embarcadero website. Embarcadero Dev-C++ is a new and improved fork of Bloodshed Dev-C++. This fork is sponsored by Embarcadero. Embarcadero Dev-C++ now has a modern UI and UX and some great new features too. Where can I find details on building Win32 desktop applications with The Dev-C++ IDE? Here is a brief article on building Win32 desktop applications using the Embarcadero Dev-C++ IDE. What are ‘Classic Desktop Windows Apps‘? Win32 desktop apps are the original app type for native Windows applications that require direct access to Windows and hardware. Because of this, Win32 native applications have the highest performance for GUI apps and easy direct access to system hardware. Using the Win32 API with C++ makes it possible to achieve the fastest app speeds and efficiency by taking more control of the target platform with ‘unmanaged’ code than is possible on a ‘managed’ runtime environment like .NET. Here are a few highlights of what the Win32 API offers to enable you to build high-performance applications: DirectX, Direct3D and DirectCompute Access to performance-oriented instruction sets like SSE and AVX through intrinsic functions Hardware level optimizations However, developing at such a level requires greater care and attention to get things right and it might take more development time. What is a faster and easier way to create GUI applications? While playing with C++ in the Dev-C++ IDE, I came across Embarcadero’s C++ Builder and then RAD Studio Delphi. Specifically, I started using Delphi with Visual Component Library which is often abbreviated to ‘the VCL’. The VCL is a set of visual components (ready-made blocks of code and functionality) for the rapid development of Windows applications in the Delphi language. The VCL includes dozens of ready to use visual components and a wide variety of non-visual components and utility classes for tasks such as: Windows 10/11 application building Database applications Client/Server applications Console applications and more With visual components such as the form, edit, button, panel components, designing and building graphical applications is much faster and more efficient than laboriously creating everything from scratch.  In terms of UI libraries, the VCL has always been considered the best wrapper on the native Windows API. Moreover, Delphi and the VCL offer a much better encapsulation of the COM layer on Windows. Additionally, Delphi offers a great and […]

Read More

The Power Of The Future Is Rooted In The Past

First programming languages were written in the 1950s, long before our modern day ide software was even a twinkle in the eye of the most forward-thinking minds. Those early languages were very close to the hardware. Instructions were extremely unsophisticated and were almost one-to-one conversions of a circuit’s purpose: load value, multiply value, subtract value. In fact, multiplication was achieved by simply adding a value multiple times so “4 multiplied by 3” was really “load 4, add 4 to that, add 4 to the result, print the result“. In essence, the programming language was a series of grunts used to communicate those absolute essentials to the computer to get the work done. Was it a language? Of sorts, yes, but only really a step away from a traveler stranded in a foreign country gesticulating wildly with hand signals at a bar tender in order to get the drink they want. It was a struggle. It was arduous and error prone even though the hardware limitations meant the actual quantity of instructions which could be fed to the hardware were tiny by today’s standards. Programmers were speaking the language of the computer to make the computer’s life easier. We grunted, they understood. It was magical. What is a high-level computer language? Margaret Hamilton with the code she and her MIT team produced for the Apollo project. Source: WikiMedia Commons This onerous and laborious level of communication endured for a few years. Even by the time of the first moon landings the instructions were still designed to make the job easy for the computer with little or no deference to the ease of human comprehension. The capacity for the computer’s instruction store – where it put actual “what should I do” had massively increased but you still had to be something akin to a superhuman to write code which worked reliably. No wonder that time spawned so many comparisons of programmers to wizards and warlocks! Of course, the time came when a push towards making programming languages more human friendly arrived. Algol, Fortran, COBOL and C all broken new ground in abstracting those LOAD, STORE, SHIFT LEFT and ROTR computer-edible instructions into something more palatable for human programmers to consume. The shift from wizards and warlocks towards more regular humanity had begun. What happened to computer programming in the 1980’s? The 1980s were a huge boom time. That early abstraction of computer instructions in the “high level” languages such as BASIC and COBOL had gone a long way to making programming more accessible. The advent of the semiconductor and advances in miniaturization brought about programmable calculators, the first digital watches and, eventually the first personal computers which freed computing from the enormous room-sized behemoths of the ’60s and ’70s to a box which could be plugged into an ordinary power supply and would fit on the average office desk. Now, in theory at least, everyone could have a computer. Computing was personal. Why did the personal computer spawn a new era in computer languages? The invention of ‘personal’ computing meant that suddenly the possibility of writing and using computer programs could spread to ‘normal’ people. It was no longer constrained to the environs of huge corporations with development staff who were university-trained at great expense. The ordinary individual could write code for the personal […]

Read More

Introduction to Python GUI Development with Delphi for Python (VCL & FMX)

Part 1 starts shortly at 9 AM CST, and Part 2 on using Delphi FMX for Python to target Android is in two weeks on January 26th at 9 AM CST. Learn how Embarcadero’s newly released free Python modules bring the power and flexibility of Delphi’s GUI frameworks to Python. VCL and FireMonkey (FMX) are mature GUI libraries. VCL is focused on native Windows development, while FireMonkey brings a powerful flexible GUI framework to Windows, Linux, macOS, and even Android. This webinar will introduce you to these new free Python modules and how you can use them to build graphical users interfaces with Python. Part 2 will show you how to target Android GUI applications with Python! Come back here for links, slides, and the replay.

Read More

Why We Love Windows Development (And You Should, Too!)

I can say, with confidence, that desktop apps are not dead, in fact they are very much alive and thriving. Web apps are on the rise and it’s a common trope to say that web applications can replace windows app development. But they couldn’t do that. In some cases, Web apps are suitable as the primary way for users to consume your product ideas and output. But mostly, web apps are an adjunct to a more complete experience offered by full-on desktop applications. This is especially true in the business-to-business market. The majority of enterprises are still using native desktop applications especially for the line-of-business sphere like process control, specialized accounting and those apps which integrate with IoT devices. What happens when The Cloud is polluted by the fog of war? Useful web applications like productivity web apps proliferate but they do not have broad accessibility over native desktop applications and suffer from the need to be hosted by an outside organization which can pose problems of data ownership, guardianship and compliance. For example, if you are a German company and your human resources information is held in a cloud hosted in a nameless data center how can you ensure – in fact guarantee – that you comply with the eye-watering complexities of European and German laws? If that data center relocates to a new geographic territory, one which is cheaper for the cloud provider but is physically located in a region which is geopolitically at odds with your own wishes or legal obligations? If you are a US based company it may be illegal for you to hold data in a broad range of countries. Europeans may be legally prevented from using data stores outside of the European Bloc. The Cloud is really “someone else’s computer”. As a business owner – and even as an individual – you need to make sure that the “someone else” is some else you trust, and, more importantly, you are allowed to trust. What if the cloud…vanishes? If The Cloud breaks down and vanishes. Who gets the blame? The cloud provider files for bankruptcy, for example, and as long as they were not negligent, they get to walk away from those obligations. Meanwhile you are left with a compliance headache at best and a total los of business viability at worst with no ability to recoup. But even assuming that scenario doesn’t play out. What happens if your cloud app can’t access the internet? The outages at Amazon data centers took out the key functionality of substantial parts of the internet. A huge spotlight of doom was shone on the fragility of many companies’ solutions the questions being asked “was this a wise idea after all?” So, the problem is offline access to the functionality. Many web applications are building desktop versions of their products, because of the problem of offline access. Besides, web applications need persistent internet access, and this is another concern on security. That’s why big companies still feel the need to safely build native desktop applications. Are desktop applications the solution to the fragility of online-only web apps? It’s nearly impossible to deny that the desktop is probably one of the most important developments in productivity in the history of computing. Both desktop and web applications have their pros […]

Read More

You Need To Know The Compelling Reasons For Native Apps

Native app development has substantial benefits over framework-based “one size fits all” comprises whether it’s for native windows development or mobile devices. It is simpler, less convoluted and circuitous to create, easier to run, and the user interface is typically smoother with noticeable responsiveness. Often, developers feel there is a barrier holding them back from embracing native development. They believe that they need to have multiple versions in different programming languages so they can develop applications for differing operating system targets. But there is a solution for that! Why do I need native app development? Here is why you need to be developing native apps: User experience – from smooth scrolling to device-specific features. With Native development tools, it’s easy to get these qualities. Native Apps are more secure – Building a native application is a great way to guarantee your users reliable data protection. Performance – With native applications, you can get higher performance. Easy access to all features of the device – Native applications have direct access to hardware, for instance, GPS, camera, microphone, and way faster in execution. Be sure to continue reading to learn about how to develop cross-platform native applications! In this article, I will show you why you need to consider Delphi to build your next products Why should I use Delphi to produce my apps? In short, with Delphi you can: Have confident long-term plans Create the most secure application Have fast time to market Have visual creation through powerful WYSIWYG Have 5x Faster Productivity Have Flexibility and Functionality Build an app for 5 different operating system with only one codebase How can I benchmark help me make a good choice of programming language? There are an overwhelming number of different benchmarks which attempt to provide an objective (and sometimes skewed) comparison of programming languages. Those white papers mostly compare and analyze energy efficiency and memory efficiency. But the real measure of the language is the productivity, engineering time, and efficacy of effort for developing a real-world application with any given programming language? Embarcadero Technologies produced a benchmark which fairly measured between 3 different software development tools to create a calculator application using these technologies: Windows Presentation Foundation (WPF) – with .NET framework Electron Delphi – Embarcadero Technologies RAD Studio If you go over and download the whitepaper yourself, you can learn more about every analysis with each detail. What were the key measures and findings of the whitepaper about developer productivity? Here you can find, conclusions of Productivity – is the measure of effort and code required for developers to complete typical development tasks. Productivity can be realized in 2 distinct ways – reduced coding requirements due to native libraries and IDE tools like code-completion and visual design Business functionality – refers to a framework’s business suitability and impact on long-term plans. Excellent functionality allows companies to easily build custom tools or extensions, develop on a platform of their choosing, protect their source code from exploitation, and have confident that their applications will be maintainable for decades. Functionality – long-term feasibility like does the framework have a history of stability and backward compatibility. Testing support, accessibility, and intellectual property security by securing project source code. Flexibility – flexible frameworks allow businesses to target a broad audience, build software for any field and access all the hardware […]

Read More

5 Great Reasons To Visit LearnCplusPlus.org Today

Hello C++ and Delphi Developers, We have new posts every day on LearnCPlusPlus.org packed full of great articles for professionals and beginners alike. Lots of new modern C++ topics to speed up your C++ app (or apps!) and to make them look visually stunning with an updated, modern look in a few simple steps. In the articles we have selected today we explain how you can simply compile Delphi projects in C++ Builder, how to Make A Millisecond Timer. We have some posts about Programming Artificial Intelligence, the Softmax function, and the Hyperbolic Tangent activation function in Neural Networks. What Is The ANN Function? There is a CppCon video about to analyze includes in C++ with Cppinclude. If you are new to RAD Studio, we think these posts may help you as much as a rapid introduction to programming in C++, all the way to the most robust, modern, and latest techniques for those more experienced with the language. For those who are perhaps wanting to expand their knowledge with the most up-to-date features, routines, and methodologies this is a great little boost (pun intended) to your C++ knowledge. The new RAD Studio 11, C++ Builder 11, Delphi 11 are released with great new features and we are developing and testing new examples for you with the latest RADS 11 that means.LearnCPlusPlus.org examples are working well with the latest C++ Builder. You can see more of our C++ posts on this blog by clicking the following dynamic search link: https://blogs.embarcadero.com/?s=C%2B%2B Here are today’s selections: How can we use C++ Builder in the most modern and efficient ways? These posts are designed to be easy to understand the modern and professional ways that we use in C++. Here are the topics, What You Need To Compile Delphi Projects in C++ Builder How To Make A Millisecond Timer In C And C++ What Is The SoftMax Function in Neural Networks? What Is The Hyperbolic Tangent Activation ANN Function? This Is How To Analyze Includes in C++ With Cppinclude What kind of C++ questions are we answering? These are the questions that we answer in this collection: How to compile Delphi projects in C++ Builder projects? How I can use Delphi or Pascal files in C++ applications? How to compile pascal files with C++ Builder? What is the challenge of timing very small intervals? Why would I need to time my program’s functions? How can I use the time library to time my C++ code execution speed? How can I use the chrono Library to time and measure my C++ app functions? What is the SoftMax function in Neural Networks? How can we use the SoftMax function in ANN? Where can we use SoftMax in AI technologies? Is the SoftMax function is an activation function in ANN? What does an activation function mean in AI? What is a Hyperbolic Tangent function? How can we use Hyperbolic Tangent Function in C++? Is there a simple ANN C++ Example of the Hyperbolic Tangent function? Can I analyze Include libraries in C++? How can I analyze Includes in C++ With Cppinclude? Where can I get the Cppinclude C++ tool? Where can I learn how to use Cppinclude? Is C++ Builder able to answer all those C++ questions? C++ Builder can answer and apply all the answers to those questions above with very simple step examples. […]

Read More

Writing Your Own Components For The FastReport Dialog

When creating a report, it is important not only to make a beautiful printed form that will display the data necessary for the user, but also a convenient prepress dialog where the user can set the parameters for generating the report. In the RAD Studio ide software, on the fastReport prepress dialog, there are already a number of components, for example, Label, Edit, Button, Memo. But sometimes this is not enough and you have to write your own dialog components for FastReport. In fact, they are analogues of ordinary Delphi-components, which can be used in dialog forms FastReport. Accordingly, in this article and will talk about writing such a component. For more information, we recommend reading the official documentation FastScript documentation: https://www.fast-report.com/en/product/fast-script/documentation/ FastScript VCL documentation: https://www.fast-report.com/en/product/fast-report-vcl/documentation/ To display data from the database, this article uses the DBGridEh component from the EhLib VCL library,which will be integrated into the FastReport dialog. Delphi 10.4.2 is used as the development environment, but everything described below will be suitable for any other Delphi starting from version 7 (adjusted for the version). Create a new package (dpk) and give it the name frxDBGridEh27. We add a new file frxDBGridEhControl.pas, which will be the basis of our grid. In this file, for registration in Delphi, we will declare the component: TfrxDBGridEhDialogControl = class(TComponent); TfrxDBGridEhDialogControl = class(TComponent); We begin to describe the TfrxDBGridEh component, which we will create from the base dialog class TfrxDialogControl. Essentially, we are re-declaring the properties of the base DBGridEh component into a component for use in FastReport. You can not declare all properties, methods, event handlers, but only those that are needed for work. In the private section, I recommend paying special attention to the following: private FDBGridEh :TDBGridEh; // The base component, the properties of which we will set and methods of which we will call FDataSource :TDataSource; // Interface between grid and data source in FastReport // Variables that will store the name of the event handlers FOnGetCellParams :TfrxGetCellParamsEvent; FOnGetBtnParams :TfrxGetBtnParamsEvent; FOnTitleBtnClick :TfrxTitleClickEvent; FOnDrawColumnCell :TfrxDrawColumnCellEvent; FOnColEnter :TfrxColEnterEvent; FOnCellClick :TfrxCellClickEvent; FOnColWidthsChanged :TfrxNotifyEvent; // These system procedures are needed to save and restore grid columns to the fr3 report template. procedure ReadData(Reader: TReader); procedure WriteData(Writer: TWriter); // These three methods are needed to be able to connect a basic data source of the TfrxDBDataset (FastReport) or TDataSet (Delphi) type to the grid. function GetDataSet: TDataSet; procedure SetDataSet(const Value: TDataSet); procedure SetDataSetName(const Value: String); // This is the event handler code procedure DoGetCellParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor; State: TGridDrawState); procedure DoTitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh); procedure DoGetBtnParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor; var SortMarker: TSortMarkerEh; IsDown: Boolean); procedure DoDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState); procedure DoColEnter(Sender: TObject); procedure DoCellClick(Column: TColumnEh); procedure DoColWidthsChanged(Sender: TObject); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private   FDBGridEh      :TDBGridEh;   // The base component, the properties of which we will set and methods of which we will call   FDataSource    :TDataSource; // Interface between grid and data source in FastReport     // Variables that will store the name of the event handlers   FOnGetCellParams    :TfrxGetCellParamsEvent;   FOnGetBtnParams     :TfrxGetBtnParamsEvent;   FOnTitleBtnClick    :TfrxTitleClickEvent;   FOnDrawColumnCell   :TfrxDrawColumnCellEvent;   FOnColEnter         :TfrxColEnterEvent;   FOnCellClick        :TfrxCellClickEvent;   FOnColWidthsChanged :TfrxNotifyEvent;     // These system procedures are […]

Read More

How To Create Real-Time Applications With SignalR On Windows

History on Client-Server Apps When the original web first came into widespread public use things were reasonably basic. Webpages were effectively specialized documents, like a library. Users clicked on links to articles they found interesting. Somewhere, perhaps on another side of the world, another computer or server was the destination for that click or as we came to call it: the request. The user sends a request and, the server, the far-off computer, gives a response back to the user for every request. That response was typically formatted text, images and later, movies and music. Editing web pages was done mostly using plain text editors rather than more advanced ide software. After several years and a few iterations, Web 2.0 emerged allowing a more interactive, programmable kind of web page which behaved more like an application. The process was asynchronous and, we were able to execute commands on databases and manipulate the data they contained in that way. Like, create a user, get all users and delete a user.  With the advent of Web 3.0 and beyond, a new concept applied to the systems is a continuous connection between a client and a server. Web applications could now carry out significantly complex tasks, interact with specialized hardware like GPS sensors and other activities rivaling traditional desktop application capabilities. Along with this rose the need to implement real-time connections which transmitted data between the web browser and servers in an optimized and highly efficient way. The connection between the server and client can be used on either side to update and set the state and react accordingly. We refer to that highly interactive nature as “real-time web applications”. They’re a long way from those original electronic reference type documents of the original web. What methods are there for implementing real-time web applications? Interval polling  This method is very straightforward. We go to the server and see if we have anything we need to do in the interval. And there are 3 cases: Nothing will be returned The server has data that return to us Some sort of internal server error But no matter what, we go to the server to see if we can do anything. Problems of interval polling More connections, more overhead Mode bandwidth The server can’t keep up with the request Long polling As you can see, we were making requests every 10 seconds no matter what. Long polling is a call that we open up and remains open until the server has something for us (depending on browser timeouts). And after a timeout, we open up our request all over again. Benefits of this method: Less server overhead and resource consumption The downside is we still make and open connections regularly.  Server-Sent Events  In this method, we open a connection to the server and, that server can remain open indefinitely. And server makes use of this connection or pipe to send us messages.  The best thing about this is the server can push data to the browser without requiring multiple connections. But this is one way in which the client cannot send messages to the server. Web Sockets Web sockets are the ability of the client in the server to open a one-on-one connection, which they both can send data over.   What are the benefits of Web Sockets? Bi-directional communication […]

Read More