I'm able to access my laptop web server using the Android emulator, I'm using 10.0.2.2:portno
works well.
But when I connect my real Android phone, the phone browser can't connect to the same web server on my laptop. The phone is connected to the laptop using a USB cable. If I run the adb devices command, I can see my phone.
What am I missing?
This question is related to
android
Adding a solution for future developers.
Copy address of your ip address. right click on your network -> network and sharing-> click on the connection you currently have-> details-> then the address beside ipv4 address is your ip address, note this down somewhere
Go to control panel -> system and security -> windows firewall -> advanced settings -> inbound rules -> new rules (follow the steps to add a port e.g 80, its really simple to follow)
put your ip address that you noted down on your phone browser and the port number you created the rule for beside it. e.g 192.168.0.2:80 and wala.
Possible solution if it doesn't connect. right click network->open network and sharing-> look under view your active connections, under the name of your connection at the type of connection and click on it if it is public, and make sure to change it to a home network.
On Windows PC You may not need to do anything else than finding out your IPv4 Address using "ipconfig" command.
Other Env Details : Windows 7, Google Nexus 4 (4.2.2), Tomcat Server, Grails Application.
You should also make sure that you have the permission to access internet in AndroidManifest file :
<uses-permission android:name="android.permission.INTERNET"/>
It is actually quite simple.
localhost
(I am using WAMP server for Windows)ipconfig
Once you've done that, you will see something like the following:
Wireless LAN adapter Wireless Network Connection: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::80bc:e378:19ab:e448%11 IPv4 Address. . . . . . . . . . . : 192.168.43.76 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.43.1
192.168.43.76
)Note: Please set your network as "Home Network". Setting the network as Home Network means that you are allowing your PC to share stuff with other devices on the same network.
If you are using Windows 10, this can be done with the following:
If you are having an issue, it is most likely to do with Windows Firewall.
ngrok lets you put your localhost onto a temporary server and is very simple to set up. I've provided some steps here that can be found in the link:
ngrok http [port number]
You'll see a little dashboard in your terminal with an address pointing to your localhost. Point your app to that address and build to your device.
What worked for me ( target: debug an windows server app running on localhost:99999 from an client app running on android phone )
then the service app url (my_dev_machine_ip:99999/path_to_service) was accessible from the phone.
its very simple , - GOTO command line (Window + R [type cmd]) - type ipconfig , that will show the current IP address of your PC - write taht IP address on your Android Phone's browser with :80 e.g (http://192.168.x.x:80)
Done
localhost will appear on your Phone
On mac run this command in the terminal if you have your server in 8080
echo "
rdr pass inet proto tcp from any to any port 8080 -> 127.0.0.1 port 8080
" | sudo pfctl -ef -
Was running into this problem using several different localhost servers. Finally got my app up and running on the phone in seconds just by using the Python simple server. It only takes a few seconds so is worth a try before getting into any more complicated solutions. First, make sure you have Python installed. cmd+r
and type python
for Windows or $ python --version
in mac terminal.
Next:
cd <your project root>
$ python -m SimpleHTTPServer 8000
Then just find the address of your host machine on the network, I used System Preferences/Sharing
on mac to find it. Tap that into your Android device and should load your index.html
and you should be good.
If not then the problem is something else and you may want to look into some of the other suggested solutions. Good luck!
* EDIT *
Another quick solution to try if you're using Chrome is the Web Server for Chrome extension. I found it a quick and super easy way to get access to localhost on my phone. Just make sure to check Accessible to local network
under the Options
and it should work on your cell without any problem.
EASIEST way (this worked flawlessly for me) is to locally host your site at 0.0.0.0:<port_no>
and to access it using mobile devices, use <local_ipv4_address>:<port_no>/<path>
in browser.
ipconfig
in cmdRun CMD as administrator
and on CMD screen type ipconfig and the screen will appear with text
as this photo
and you can access your localhost using this ip you have to be connected to same network as your pc connected to
(for example, if you use WAMP server):
1) Install your Android drivers on your PC and download portable Android Tethering Reverse Tool and connect your Android device through the Reverse Tool application.
2) Click on WAMP icon > Put Online (after restarting).
3) Open your IP in the Android browser (i.e. http://192.168.1.22
OR http://164.92.124.42
)
To find your local IP address, click Start>Run>cmd and type ipconfig and your IP address will show up in the output.
That's all. Now you can access (open) localhost from Android.
Having a netconfig xml and assign it in the manifest.xml is the best work around. This will bypass the androids default https only contraint.
Another thing to check is that some routers have issues bridging the requests when both 2.4G and 5G are enabled and the devices are on different frequencies. Trying disabling one of the frequencies so both devices are connected to the same interface.
I found a quick solution to this problem. Try this link. It should help you fix the problem.
I only changed one thing, where the tutorial states you change '127.0.0.1' to 'All', change it to the IP address your server is running on instead.
After that, you should be able to connect to your localhost.
Below is a (proofread) copy of the information from the linked page:
Install the Wamp server (or any other you prefer).
This is one of the best servers I know to set up a local server. If you have installed Apache or any other server, ignore this step.
Download and install Wamp Server from here.
Add a new rule for port 80 in Windows Firewall.
Open the Control Panel and select Windows Firewall.
Select Advanced settings from the left panel of the Windows Firewall setting page.
Select Inbound Rules from the left panel, then select New Rule.
Select Port and click Next.
Select the “Specific local ports” radio button and enter 80 as the port value.
Keep Allow the connection unchanged and move to the next step.
Keep Profile options unchanged and click Next.
Give some nice name to your new rule and click Finish.
This will enable port 80 access on local network IP.
Edit the httpd.conf file of the Wamp server to fix the 403 error.
We need to edit this file. Otherwise, we will get the 403 forbidden error when we access the localhost through a local network IP.
Click on the Wamp server tray icon.
Open Apache server sub menu.
Select httpd.conf.
Find this section of configuration in the httpd.conf file:
Directory “c:/wamp/www/”
#
# Possible values for the Options directive are “None”, “All”,
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that “MultiViews” must be named *explicitly* — “Options All”
# doesn’t give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be “All”, “None”, or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride all
#
# Controls who can get stuff from this server.
#
# onlineoffline tag – don’t remove
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Find and replace ‘127.0.0.1’ with ‘All’, save the file, and restart your Wamp server.
Find your local network IP.
Open the command prompt.
Type and enter the ipconfig
command.
In my case, my local area network address is 10.0.0.2.
This is the IP which you need to access your localhost on your Android phone over wifi. To test if it is working, type this IP address in your desktop browser where your localhost server is installed. The browser should display your localhost page successfully. This will assure that this local network IP is now successfully accessible on your Android phone.
I hope this tutorial will help you to access your localhost over wifi.
"Port forwarding on Chrome for Android makes it easy to test your development site on mobile. It works by creating a listening TCP port on your mobile device that maps to a particular TCP port on your development machine. Traffic between these ports travels through USB, so the connection doesn't depend on your network configuration."
More details here: https://developer.chrome.com/devtools/docs/remote-debugging#port-forwarding
This solution is usable when your mobile device and computer is not in same network:
You need to use port forwarding in this case. In the Google chrome inspect window (chrome://inspect) You can see the connected devices.
Click on the port fowading button, and set a random port say 3000 to the port which your laptop uses say 8080.
now use localhost:3000 from device to access the localhost:8080(or_whatever_ip:portno) in the laptop. You can check it in the mobile browser. Try localhost:3000 in the mobile browser. Make sure to check the "Enable port forwarding" checkbox in the "Port forwarding settings" window
The easier way to default localhost is to use http://localhost:port. This works in a laptop and Android as well.
If it does not work, then in android set the default IP of your phone to 127.0.0.1:port :)
Open terminal and type :-
hostname -i
#127.0.0.1
hostname -I
#198.168.*.*
You may have your web server listening on your loopback interface and not on your network interface. Major signs of this are:
127.0.0.1
and localhost
(from localhost or Android emulator) work192.168.xxx.xxx
do not work, whether from localhost, LAN, or WANI talk more about diagnosing this and fixing this in an answer here.
On linux use ip addr
instead of ifconfig
since ifconfig
is deprecated for many years and not installed by default in recent distros
A solution to connect my mobile device to my wamp server based on my laptop:
First, wifi is not a router. So to connect my mobile device to my wamp server based on localhost on my laptop, I need a router. I have downloaded and installed a free virtual router: https://virtualrouter.codeplex.com/
Configuring it is really simple:
Then you can connect to your laptop via your device by launching a browser and fill the IPV4 address of your laptop (to find it on windows, type in cmd : ipconfig, and find ipv4 address)
You should see your wamp server home page.
Solution for Windows:
You are not able to view your website, mainly because your firewall ( default OS firewall or Antivirus firewall ) is preventing incoming connections.
On Windows Firewall:
To allow incoming connections on specific ports, go to:
Control Panel > Windows Defender Firewall > Advanced Settings > Right Click Inbound Rules > Add New Rule.
Then :
- Select "Port" radio button.
- Enter the specific port / range you on which you want to enable incoming connections ( the port on which your server is running )
- Select "Allow the connection" radio button.
- Click Next ( unless you want to change the defaults )
- Give your rule a name and click Finish.
Note:
If you are using an Antivirus having a firewall, then the above steps will not work since the Antivirus would have disabled Windows firewall and instead runs its own firewall.
In that case, depending on the Antivirus program, go to your Antivirus's Firewall settings and open the port.
Simple. First and foremost make your your android device and computer is connected on thee same network.e.g router Open command prompt by windows+R and search for cmd then open. On the command type ipconfig and get the ipv4 address.
NB: Firewall blocks access of your computer along network so you need to turn off firewall for the network if either public or private.
How to turn off firewall Open control panel > System and security > windows firewall > on the left pane select turn on and off windows firewall. > Then select turn off windows firewall(not recommended)
You are done
then open your mobile device and run your ip address 192.168.1.xxx
finally done in Ubuntu , i am running nodejs server on localhost:8080
1) open terminal type ifconfig you will get ip something like this : inet addr:192.168.43.17
2) now simply put url address like this : "192.168.43.17:8080" (8080 port coming from localhost port number) ex : "192.168.43.17:8080/fetch"
Ngrok is the best solution.
If you're developing PHP then I recommend installing Laravel Valet, It has MacOS and Linux versions, then you may use valet share
command. If you're developing any frontend tech and need to share a port like 3000 then use ngrok directly ngrok http 3000
Use this in your ubuntu/Macbook to get the ip address of your system. Your mobile and system should be in the same network
ip addr | grep inet
This will give you an ip address which looks like 192.168.168.46
. Use this in your smartphone.
Hope this helps.
First of all make your machine(where server is running)IP address static. Enter this static IP address in the android code.
Next go to your wifi router's interface and check the left panel. You will see option such as port forwarding/forwarding. Click on it and forward port 80.
Now edit your htttpd.conf
file and edit it for
Allow from All
. Restart your server. Everything should work fine now.
Additionally you can reserve the IP address of your machine so that it is always allocated to you.
In the left panel of your router's interface, find DHCP -> Address Reservation
, click on it. Enter your machine's MAC address and the IP address you have entered in the code. Click on save. This will reserve the given IP address for your machine.
If you're running on Linux this works for me
sudo iptables -F
First of all connect your phone and computer to common wifi.
Then, open command prompt using run as administrator
Give ipconfig command
Which shows wireless lan ip
Use ip:port of your server to access in phone
Try going to this file:
C:\wamp\bin\apache\Apache2.2.11\conf\httpd.conf
# onlineoffline tag - don't remove
Order Deny,Allow
Allow from all // change it Deny
Allow from 127.0.0.1
And change 10.0.2.2 to your IP address.
I achieved this by enabling remote management:
System preferences/sharing
You will see a message similar to this:
some.url.com
On your Android device, you should now be able to go to some.url.com
, which delegates to localhost
on your Mac. You can also use ifconfig
to get the IP address of your Mac.
ngrok
(any OS with Node.js)If you don't mind exposing your project with a temporary domain you can use ngrok
. Lets say I have an app that runs on localhost:9460
I can simply write
npm install ngrok -g
ngrok http 9460
This will give me:
Session Status online Update update available (version 2.2.8, Ctrl-U to update) Version 2.2.3 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://f7c23d14.ngrok.io -> localhost:9460 Forwarding https://f7c23d14.ngrok.io -> localhost:9460 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
I can now reach https://f7c23d14.ngrok.io
as a way to remotely view localhost
. This is great to share design work or progress with clients.
nginx
proxy passIf you are running something like this through nginx proxy_pass
it will require a bit more tweaking - this is a hacky approach, but it works for me and I am open to suggestions on improving it:
81
as opposed to 80
sudo nginx -s reload
http://youripaddress:81
server {
listen 80;
listen 81; # <-------- add this to expose the app on a unique port
server_name ~^(local|local\.m).example.com$;
# ...
}
Reload and visit http://youripaddress:81
I used this process:
Note that this process requires you to change the WiFi settings on the Android device at the start and end of every session. I found this less painful then rooting my Android device.
There is however a far better solution. You can access your host machine with the IP address "10.0.2.2". This has been designed in this way by the Android team. So your webserver can perfectly run at localhost and from your Android app you can access it via "http://10.0.2.2:8080".
Personally I do not insist to use localhost when using device, there is no easy solution.
Just start the activity where you connect to localhost where you can use emulator. Whatever info you have to get from device can be generated with ease and can be sent to activity as parameter.
Although one answer has been accepted but this worked for me:
ifconfig
inside terminal and look for en0/en1 -> inet
it should be something like 19*.16*.1.4
.) (on windows, use `ipconfig) Open your mobile settings and go to network-> long press your wifi network-> modify network -> scroll down to advanced options -> chose proxy manual and in proxy hostname type your address i.e. 19*.16*.1.4
inside port enter your port. and save it.
search for what is my ip
in google chrome, and get your ip, lets say it is 1**.1**.15*.2**
1**.1**.15*.2**:port/
from your mobile device.It is as simple as this.
As this is an old question, there is a new way to do this that is really really simple. Download the ADB Chrome Extension and then follow these instructions:
https://developers.google.com/chrome-developer-tools/docs/remote-debugging
With the simple solution (just access laptop_ip_addr:port
from mobile device, when mobile and laptop are on the same WiFi), I get a ERR_CONNECTION_REFUSED error. That is, my MacBook seems to refuse the connection attempt from my mobile.
This solution works for me (tested with a MacBook):
adb reverse tcp:4000 tcp:4000
4000
http://localhost:4000/
, and it will actually connect to the laptop, not the mobile deviceSee instructions here.
The downside is that this works only with a single mobile device at a time. If you want access with another mobile device, you have to first disconnect the first one (disable USB Debugging), connect the new one (enable USB Debugging), and run adb reverse tcp:4000 tcp:4000
again.
Another solution that should always work is ngrok (as mentioned in other answers). It works over the Internet, and not the local network.
It's extremely easy to use:
brew cask install ngrok
ngrok http 4000
This outputs, among some other information, a line like
Forwarding http://4cc5ac02.ngrok.io -> localhost:4000
Now, you can navigate to http://4cc5ac02.ngrok.io
on any device that is connected to the Internet, and this URL redirects to localhost:4000
of your laptop.
Note that as long as the ngrok command is running (until you hit Ctrl-C), your project is publicly served. Everybody who has the URL can see it.
This is what worked for me, I added another line after the 127.0.0.1 ip to specify the exact local network ip address (not the public ip address) of the device I wanted to use. In my case my Samsung Galaxy S3
As suggested by Bangptit edit the httpd.conf file (x being the version numbers): C:\wamp\bin\apache\Apache2.x.x\conf\httpd.conf
Search for the onlineoffline tag and add the ip of your phone (I found my phones ip address in my routers configuration pages):
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.1.65
Allow from ::1
Allow from localhost
One could extend this to include an entire sub domain too for e.g. 192.168.1.0/24 etc
use connectify
and xampp
or equivalent, and type ip address on mobile URL bar to access
Source: Stackoverflow.com