How to install and configure TOMCAT server with Eclipse?

Download and Install Tomcat

For Windows
  1. Go to http://tomcat.apache.org ⇒ Under “Tomcat 8.5.{xx} Released” (where {xx} is the latest upgrade number) ⇒ Downloads ⇒ Under “8.5.{xx}” ⇒ Binary Distributions ⇒ Core ⇒ “ZIP” package (e.g., “apache-tomcat-8.5.{xx}.zip“, about 9 MB).
  2. Create your project directory, say “d:myProject” or “c:myProject“. UNZIP the downloaded file into your project directory. Tomcat will be unzipped into the directory “d:myProjectapache-tomcat-8.0.{xx}“.
  3. For ease of use, we shall shorten and rename this directory to “d:myProjecttomcat“.
Take note of Your Tomcat Installed Directory. Hereafter, I shall refer to the Tomcat installed directory as.
For Mac OS
  1. Go to http://tomcat.apache.org ⇒ Under “Tomcat 8.5.{xx} Released” (where {xx} is the latest upgrade number) ⇒ Downloads ⇒ Under “8.5.{xx}”⇒ Binary distribution ⇒ Core ⇒ “tar.gz” package (e.g., “apache-tomcat-8.0.{xx}.tar.gz“, about 9 MB).
  2. To install Tomcat:
    1. Goto “~/Downloads“, double-click the downloaded tarball (e.g., “apache-tomcat-8.0.{xx}.tar.gz“) to expand it into a folder (e.g., “apache-tomcat-8.0.{xx}“).
    2. Move the extracted folder (e.g., “apache-tomcat-8.0.{xx}“) to “/Applications“.
    3. For ease of use, we shall shorten and rename this folder to “tomcat”.
Take note of Your Tomcat Installed Directory. Hereafter, I shall refer to the Tomcat installed directory as .

For academic learning, I recommend “zip” (or “tar.gz”) version, as you could simply delete the entire directory when Tomcat is no longer needed (without running any un-installer). You are free to move or rename the Tomcat’s installed directory. You can install (unzip) multiple copies of Tomcat in the same machine. For production, it is easier to use the installer to properly configure the Tomcat.

Create an Environment Variable JAVA_HOME

(For Windows)
You need to create an environment variable called “JAVA_HOME” and set it to your JDK installed directory.
  1. First, find your JDK installed directory. The default is “c:Program FilesJavajdk1.8.0_{xx}“, where {xx} is the upgrade number. Take note of your JDK installed directory.
  2. To set the environment variable JAVA_HOME in Windows 7/8/10: Start “Control Panel” ⇒ System and Security (Optional) ⇒ System ⇒ Advanced system settings ⇒ Switch to “Advanced” tab ⇒ Environment Variables ⇒ System Variables ⇒ “New” ⇒ In “Variable Name”, enter “JAVA_HOME” ⇒ In “Variable Value”, enter your JDK installed directory as noted in Step 1.
  3. To verify, RE-START a CMD shell (restart needed to refresh the environment) and issue:
    SET JAVA_HOME
    JAVA_HOME=c:Program FilesJavajdk1.8.0_{xx}

How to configure tomcat server in Eclipse IDE?

In Eclipse IDE, go to menu Window > Preferences. Then expand the Server > Runtime Environments node in the Preferences dialog:

Click Add… to add a new server runtime environment. In the New Server Runtime Environment dialog, select Apache > Apache Tomcat v x.x  and check the option Create a new local server:

Click Next. In the next screen, click the Browse button to specify the existing installation directory of Tomcat on your computer:

Click Finish, the selected Tomcat installation is added to the list of server runtime environments, as shown below:

Click OK to close the Preferences dialog, the new server runtime is added to the Servers view:

You can now drag and drop a project into this server in order to deploy and run the project.
NOTE: If you don’t see the Servers view, you can show it by go to the menu Window > Show View > Others…, then look for Servers.

Writing First Servlet:

1. Create Dynamic Web Project

To create a Servlet we need to create a new ‘Dynamic Web project’ which can be done in three ways,

  • Right click on Project Explorer -> New -> Dynamic Web Project
  • File menu -> New -> Dynamic Web Project
  • Click on the down arrow on New icon on toolbar -> Dynamic Web Project

 Click “Next” button.Click “Next” button.

Check ‘Generate web.xml deployment descriptor’ checkbox and click “Finish” button and Eclipse IDE will generate the web project automatically as shown below

2. Create Servlet Class

Select from the menu File –> New –> Servlet.

Write “com.srccodes.example” in the ‘Java Package’ field and “HelloWorld” in the ‘Class Name’ field. Click ‘Next’ button.

We can specify deployment descriptor (web.xml) specific information in the following screen. Just keep every thing as it is for the time being. Click “Next” button.

Click ‘Next’ button.Click ‘Next’ button.
Eclipse will generate a Servlet class based on the configuration / input we provided in the previous steps.
3. Write Custom Code

Add your code inside ‘doGet’ method. ‘setContentType’ method of HttpServletResponse sets content type of the response to ‘text/html’ which is the standard MIME content type for Html pages. ‘getWriter’ method of the response object returns a PrintWriter object. This will be used to print our “Hello World!” string in the browser.
Edit the generated ‘HelloWorld.java’ as per the following code.

File: HelloWorld.java

package com.srccodes.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class HelloWorld
 */
@WebServlet(“/HelloWorld”)
public class HelloWorld extends HttpServlet {
    private static final long serialVersionUID = 1L;
        
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorld() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(“text/html”);
        PrintWriter printWriter  = response.getWriter();
        printWriter.println(“

Hello World!

“);

    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }
}

4. Run Your Servlet Code

Right click on the project ‘HelloWorldServlet’ and select from context menu ‘Run As’ –> ‘Run on Server’.
Select the existing tomcat server.
Click “Finish” button. HelloWorldServlet web application will be deployed in the tomcat web server.
6. Browser Output

Eclipse will open a browser and your server side code will print ‘Hello World!’ in the browser.

Basic Understanding of RMI : JaVa – is not MaVa

RMI logo

The Remote Method Invocation(RMI) is an API that provides a mechanism to create distributed application in Java. RMI allows a Java object to invoke method on an object running on another machine. RMI provides remote communication between java programs.

—Watch the Video to understand “Why we need RMI ?”—-



Concept of RMI application

A RMI application can be divided into two parts,
1. Client  program
2. Server program.
Server program creates some remote object, make their references available for the client to invoke method on it. A Client program make request for remote objects on server and invoke method on them. Stub and Skeleton are two important objects used for communication with remote object.

Stub and Skeleton

components of RMI

Stub acts as a gateway for Client program. It resides on Client side and communicates with Skeleton object. It establishes the connection between remote object and transmit request to it. Skeleton object resides on the Server side.

Stub Operation:

  • Acts as proxy for remote object.
  • Marshall parameters (converting the data or the objects in-to a byte-stream).
  • Send request and parameters to server skeleton.
Skeleton operation:
  • UN-Marshall parameters(converting the byte-stream back to their original data or object).
  • Perform computation
  • Marshall method return.
  • Send return object to client stub
RMI Registry
RMI registry is a server where :
  • Servers can register their object.
  • Clients can find server objects and obtain a remote references. Using the remote reference we can then invoke the required method.
                             
Watch this video to understand basic Implementation of RMI


RMI IMPLEMENTATION

    RMI Architecture

    Creating simple RMI application involves following steps:

    • Define a remote interface.
    • Implementing remote interface.
    • create and start remote application
    • create and start client application

    Define a remote interface

    A remote interface specifies the methods that can be invoked remotely by a client. Clients program communicate to remote interfaces, not to classes implementing it. To be a remote interface, a interface must extend the Remote interface of java.rmi package.
    import java.rmi.*;
    public interface AddServerInterface extends Remote
    {
    public int sum(int a,int b);
    }

    Implementation of remote interface

    For implementation of remote interface, a class must either extend UnicastRemoteObject or use exportObject() method of UnicastRemoteObject class.
    import java.rmi.*;
    import java.rmi.server.*;
    public class Adder extends UnicastRemoteObject implements AddServerInterface
    {
    Adder()throws RemoteException{
    super();
    }
    public int sum(int a,int b) throws RemoteException
    {
    return a+b;
    }
    }

    Create Server and host rmi service

    You need to create a server application and host rmi service Adder in it. This is done using rebind() method of java.rmi.Naming class. rebind() method takes two arguments, first represent the name of the object reference and second argument is reference to instance of Adder
    import java.rmi.*;
    import java.rmi.registry.*;
    public class Server{
    public static void main(String args[]){
    try{
    AddServerInterface addService=new Adder();
    Naming.rebind("Sum",addService);
    //addService object is hosted with name Sum

    }catch(Exception e){System.out.println(e);}
    }
    }

    Create client application

    Client application contains a java program that invokes the lookup() method of the Naming class. This method accepts one argument, the rmi URL and returns a reference to an object of type AddServerInterface. All remote method invocation is done on this object.
    import java.rmi.*;
    public class Client{
    public static void main(String args[]){
    try{
    AddServerInterface st=(AddServerInterface)Naming.lookup("rmi://localhost/Sum");
    System.out.println(st.Sum(25,8));
    }catch(Exception e){System.out.println(e);}
    }
    }

    Steps to run this RMI application

    • compile all the java files
      javac *.java
    • Start RMI registry
      start rmiregistry
    • Run Server file
      java Server
    • Run Client file in another command prompt pass localhost at run time
      java Client localhost
    Goals of RMI
    • To minimize the complexity of applications.
    • Minimize the difference between working with local and remote objects
    • Make writing reliable distributed applications as simple as possible

    Would you like learn Java and get Certified from Oracle ?

    Rage of Demons: Session 5

    In the previous session the group left Gracklstugh and traveled to Neverlight Grove. As they had spent two sessions in Gracklstugh, I thought I could at the very least fill one full session with the events in Neverlight Grove. Unfortunately I was wrong, and and we had a short session due to me running out of prepared material. My bad!

    The myconids of Neverlight Grove are a peaceful people, organized into circles. Even their “hunter circle” doesn’t actually kill things, but just collects corpses of anything that dies close to the village and uses them as fertilizer. So the group’s first encounter with the myconids (other than their travel companions Stool and Rumpadump) was after they killed a Shambling Mound near the village, and the “hunters” turned up and asked politely if they could collect it. That got the group a friendly welcome to the village, and a quest to kill another monster which was attacking myconids outside the village.

    I had some commercial poster battlemaps of Underdark caves, and used one of them for this fight against a Grick alpha. What I hadn’t noticed was that on the map there was a pond with treasure chests visible at the bottom. So after the fight the group wanted to lift those chests, and I didn’t want to spoil their fun and say there weren’t any. So I let them roll on the appropriate treasure table in the DM’s Guide, and they ended up with a Figurine of Wondrous Power (Ebony Fly). Nice, but not overpowered.

    Back in the village the group interacted with the myconids and learned that they were split in two factions. The “normal” ones were a bit naive, friendly, and not very emotional. The others were overly enthusiastic, dancing around, and awaiting a great event for tomorrow in the Garden of Welcome. They were asked not to go to the garden so as to not spoil the surprise, so of course they went.

    That resulted in several fights against infected myconids and other creatures. Ultimately the group discovered yet another demon lord, Zuggtmoy, who apparently is preparing her wedding to the “Great Body”. Various infected plant creatures serve as chamberlains and bridesmaids in some sort of perverted wedding ceremony. But it is rather obvious that the group can’t stop the wedding without fighting the “bride”, and they aren’t strong enough to tackle demon lords yet. While the un-infected myconids flee, the group decides that they should do the same, and travel on towards Blingdenstone.

    5 Holiday Tips on How Not to Get Arrested in New York City

    This is just common sense stuff, but let’s review it anyway, shall we?

     

     

    5 Holiday Tips On How Not To Get Arrested In NYC

    Many people come to New York City for the holidays. … it, smoking marijuana in public is not legal. Personal possession has been decriminalized, but that doesn’t mean you can smoke it in public. Never smoke a joint on the streets of NYC. You risk being arrested …

     

    Related Stories

    • How Safe Is It To Smoke Marijuana Every Day?
    • These Are the Best Pot Products in 2017
    • Treasure Hunt: 9 Ways Scientists Are Targeting the Endocannabinoid System With Synthetic Drugs and Isolates

    Elemental Evil: Session 8

    In the previous session the group had located the tower of the elemental cult of air and gained new allies in the form of a group of Aarakocra. They had decided to approach the tower through the Sighing Valley and try to sneak in from below with their allies helping them up the pillar the tower stands on. But first they needed to get there.

    The Aarakocra informed them that basically they could go either left or right of the river dividing the valley. To the left was gnoll territory; not the most fearsome of adversaries, but many of them. To the right was the lair of a manticore, which was a much more dangerous beast, but alone. They went for the manticore. Now 6 adventurers hitting a single monster can make for short and boring fights. To avoid that I had placed the manticore out in the open, in plain view, so the fight started with the monster and the group 200 feet apart. Which just happened to be the maximum range of the manticore’s spike-slinging tail attack. 🙂 This ended up being a rather interesting fight, with the group using ranged attacks while closing in, and being under fire themselves. They won, but two group members went down during the fight and had to be saved by their team mates. In most rounds I decided to let the manticore fire its spikes on the closest enemy. However at one point the closest enemy was the druid who just had changed into bear form. So at that point I let the manticore make an intelligence check, which it failed, leading it to believe that this was an actual bear who had somehow wandered in and would be scared off easily by a threatening roar. At least the druid liked that idea; the halfling monk who got shot instead maybe not so much.

    That fight got the group to level 4, so they took a long rest and leveled up. Then they continued up the valley, to the point where the stream was easy to cross. There the stream came out of a cave, and the Aarakocra had told them that air cultists had been seen hanging around that area. So they explored the cave and found three air cultist spellcasters praying in front of a great door. As the cave was only as broad as the stream, the air cultists did get good use out of otherwise rather useless gust of wind spells (I ruled that a gust of wind gives disadvantage to non-magical missiles like arrows, because I was so surprised that in rules as written the spell doesn’t even do that). But they weren’t very strong and the party easily beat them.

    The portal was showing a symbol they knew from the book on fighting elemental evil: It was the runes of the 4 elemental cults posed around the elder elemental eye. The door was clearly magical, and it appeared as if one needed the 4 runes of the 4 elemental cults to open the door. As they didn’t have any yet, they went on towards Feathergale Spire. They found some corpses at the base which suggested that sometimes people were thrown off the spire. At this point we ended the session.

    [DM’s note: The magical portal isn’t in the Princes of the Apocalypse book. In the book as written you can go right down into the underground elemental dungeons. Only that of course the first dungeon downstairs is level 7, and would be quite deadly for a group of level 3 or 4 characters. And there would be no reason to visit the above-ground 4 elemental keeps, thus skipping a lot of the content of the adventure. A magical door on every entrance, with the 4 keys being held in the 4 keeps, seemed the logical solution for this design flaw to me.]

    RonyaSoft Poster Printer

    Just some unsolicited free advertising for a software I bought this weekend: Ronyasoft’s Poster Printer costs $19.95 for a home license. It is a software that takes an image and prints it at any size you want over multiple pages of paper. You can crop the image to print just the part you want. And if you print over multiple pages, you can add helpful guides on how to glue the whole thing together to give a good-looking poster. The software is quite user-friendly and it was easy enough to figure out all the options. And I’m quite happy with the results.

    Obviously I am using the software to print out battlemaps for my Dungeons & Dragons campaign. Specifically this weekend I am printing the battlemaps for Madness at Gardmore Abbey. I still had the images from the Cartographer’s Guild from the last time I played. But at the time I thought I’d never play that adventure again, and threw away the printouts, so I had to print them again.

    If you followed my posts about battlemaps you might notice that this is somewhere a step back in quality. For my last 4E campaign I didn’t print the poster maps myself, but sent them out to a poster printing website. Great quality, no need to glue pages together, and better water-resistance of the final product makes those poster maps really nice. However they cost between $10 and $20 per map, depending on size. And for Gardmore Abbey I need 24 maps. That’s a bit too expensive for my taste.

    In a way there is a difference in the economics of this between 4th edition Dungeons & Dragons and 5th edition Dungeons & Dragons. My recent experience with playing 4E adventures in 5E shows that 5E is about three times faster than 4E. Madness at Gardmore Abbey in 4E took my group 18 sessions to play through over a whole year. In 5E I can probably do it in 6 sessions or so. So with a lot less time spent on any single battlemap, I am less willing to spend too much money on one. However I do plan to play the Zeitgeist campaign, which is the only one that I have a complete set of poster maps for, in 5th edition somewhere next year. I’m just waiting for the official conversion.

    What are Injection attacks : SQL Injection over MySQL

    What is SQL Injection?

    sqlinjection

    SQL Injection is an injection attack wherein an attacker can execute malicious SQL statements that control a web application’s database server. Since an SQL Injection vulnerability could possibly affect any website or web application that makes use of an SQL-based database, the vulnerability is one of the oldest, most prevalent and most dangerous of web application vulnerabilities. SQL Injection can also be used to add, modify and delete records in a database, affecting data integrity. SQL Injection can provide an attacker with unauthorized access to sensitive data including, customer data, personally identifiable information (PII), trade secrets, intellectual property and other sensitive information.

    Types of SQL Injection Attacks

    • Code injection:- Adding more SQL statements to an SQL statement in an attempt to obtain access rights or some sensitive information is termed as code injection. This is type of SQL injection attack take advantage of some kind of bug that appears in the computer system due to invalid data processing.
    • Function call injection:- In this attacker inserts a call. The attacker may also get permission for making system calls through function call injection.
    • SQL Manipulation:- If an application directly passes login credentials database, its prone to an SQL injection attack through SQL manipulation for e.g. We can take addition of a certain condition to the WHERE CLAUSE in an SQL query. This may skip the authentication procedure, and thus may give access to all activities that user can perform.

    SQL Injection Implementation

    Lets see how SQL Injection is performed  with following example
    Consider following SQL Statement

    $username=$_POST["username"];
    statement = "SELECT * FROM users WHERE name = '" + $userName + "';"

    In above Statement user input is not filtered for escape characters and it directly passed into an SQL statement. This SQL statement display records of specified username from users table. However if usename variable is crafted in a specific way by an attacker, the SQL statement may do more than the code author intended.
    For Example
    If usename is set as $username=’ OR ‘1’=’1 then the Above SQL statement become

    SELECT * FROM users WHERE name = '' OR '1'='1';

    If  this SQL statement is used in authentication procedure then it will return data of every users rather than one specific user as code intended because ‘1’=’1′ is always true.

    Preventing SQL Injection

    Above example is Incorrectly filtered escape characters SQL Injection attack. We can handle all escape characters smartly in scripting languages. The MySQL provides the function called mysql_real_escape_string() to escape input characters that are special MySQL Keywords

    $username = mysql_real_escape_string($_POST['username']);  
    statement = "SELECT * FROM users WHERE name = '" + $userName + "';"

    There are other functions for many database types in PHP such as pg_escape_string() for PostgreSQL. The function addslashes(string $str) works for escaping characters, and is used especially for querying on databases that do not have escaping functions in PHP. It returns a string with backslashes before characters that need to be quoted in database queries, etc.

    Risk associated with SQL injection attacks

    Privilege Escalation performance:- A malicious person can take advantage of the flaws pre

    sent in a database by upgrading the access levels of an individual who is not authorised for higher level roles.
    Remote commands execution:- SQL injection attacks can be used to execute commands remoter the attackers may execute arbitrary commands on a database.
    Authentication bypass:- manipulation of SQL statements may result in by passing the authentication process thereby providing the attacker with access to database.
    Database Fingerprint:- Determining the type of database being used at backend may help attacker in quenching database specific attacks through SQL injection, the attackers may determine database that an organization user.
    Denial of services in an SQL injection attack, the database service can be flooded with requested by attacker. There’re, it would state rejecting the requests of segments users.

    Want to Learn Database Programming?

    Pharmaceutical Company Billionaire and Wife Found Dead in ‘Suspicious’ Circumstances

    Bodies of Barry Sherman, the founder of Canadian firm Apotex, and his wife Honey were found in their Toronto mansion.

    The founder and chairman of Apotex, Bernard Sherman, and his wife Honey were found dead inside their North York mansion, in Toronto, Canada, on Friday. The couple recently put up their home up …

     

    Related Stories

    • How Healthy Is Your State? The Disparities Are Stark
    • Nothing Protects Black Women From Dying in Pregnancy and Childbirth
    • Brain-Wave Treatment for Alzheimer’s Is Promising, but the First Human Subject Is Left Behind

    Ordered a new 3D printer

    I’ve been using my XYZ da Vinci Junior 1.0w 3D printer for a year now. It is still working. However I have learned a lot during that year, I’m printing more complicated models now, and I’m reaching the limits of what the machine can do. I still think it is a great printer for a beginner, but now I want something much better. So I ordered a Zortrax M200 Plus. The “Plus” is important, as this is the brand-new and improved model of the M200, which is highly regarded but now 5 years old.

    The first difference between the two printers is the price. The da Vinci Junior was 471€, the Zortrax M200 Plus is 2,369€. Obviously not the same league. The da Vinci Junior uses PLA, the Zortrax can use PLA, ABS, and some other materials. The old M200 was really best used with ABS, but the new Plus version has better cooling fans, so PLA should come out fine now as well. The main difference is that the XYZ printer was only able to use proprietary XYZ filaments, while the new Zortrax also works with filaments from other suppliers. That was a major point of annoyance for the old printer for me; the spools came with an RFID chip, and if the chip said your spool was empty, the printer refused to use the spool. As the chip counted loading, unloading, and failed prints as lost material even if there was no actual material lost, I always ended up having to throw away the last meters of the spool. And the material was far more expensive than it should have been. However at the start I’ll use Zortrax ABS, just because the software knows the best settings for that material.

    Where the difference between the two printers is likely to be biggest is in the quality of the prints. At the shop where I ordered the printer they had sample prints of little miniatures similar to those I often make, and the quality was *much* better. On the best setting you don’t even see the layers any more with the Zortrax M200 Plus. Of course it remains to be seen how good it will work with my prints. But the experimenting and fiddling around is all part of the hobby, the resulting miniatures are more of a secondary benefit. 🙂

    From what I see in reviews the main issue with the Zortrax is that the software is very slow. I saw a YouTube video of a guy using the old Zortrax M200 to print a Harry Potter wand, and the software took 25 minutes to slice that model. That has probably to do with the print being with rafts (mandatory with the Zortrax) and supports. I suspect the supports use a lot of slicing time, I’ll have to try with and without it. But from the video it appears that the supports are easy to remove, which could be a plus. Now I finally understand the models of Miguel Zavala: Many of them can’t be printed without those automatically generated supports, and the supports generated by the XYZ software are very bad. So up to now I had to fiddle around with the models a lot, disassemble them digitally, reassemble them digitally, and generate functional supports with Meshmixer. I might be able to just hit a print button in the future, which will be faster even if the slicing is slow.

    I’ll let you know how the new printer works out once it is delivered and installed.

    The ultra popular Arena of Valor finally launches in North and South America

    • Arena of Valor, a game with over 80 million players in China, launches in North and South America today.
    • The game is a MOBA and pits teams of five against each other.
    • There will be eSports leagues and competitions for the game.

    One of the most popular games in the world is finally launching in the Americas. Arena of Valor is a MOBA from Tencent Gaming that has been all the rage in China. It has 200 million registered players with over 80 million daily active users— all using their mobile devices to play the game.

    Arena of Valor, or Honor of Kings as its known in native China, pits teams of five heroes against each other in a bid to take over each others’ bases. If the game reminds you of League of Legends, you’re onto something. Arena of Valor is developed by Tencent Games, who owns Riot Gaming— the makers of League of Legends.

    See also

    The game is making some changes as it crosses the pond. It’s dropping the Chinese-specific parts of the game for more Western aspects. The in-game heroes are now more appealing to Western audiences instead of the original Chinese versions. Additionally, Facebook is used to log in, rather than WeChat. These changes are in an effort to appeal to a wider audience— something that other Chinese games in the past have failed to do. 

    To hype the title, Tencent is creating an eSports league for competitive play. It is also partnering with streamers on Twitch to promote it. eSports has exploded around the world where Twitch streams can top a million viewers for popular competitions. Tencent hopes to tap into that trend and show audiences that eSports can be mobile games too.

    See also: PC smash hit PlayerUnknown’s Battlegrounds coming to mobile 

    This isn’t the first launch outside of China for Valor. The game is available in Europe and has accumulated about 2 million downloads since August. If you’re in North or South America and interested in trying the game out for yourself, you can hit the button below to download it. 

    get it from google play