简体   繁体   English

如何从Android Tcp客户端套接字连接到具有公共IP的Java TCP服务器套接字?

[英]How to connect to a Java TCP server socket having Public IP From Android Tcp Client Socket?

I have two Real Ip address 220.xx.xxx.xxx in my work place. 我的工作地点有两个Real Ip地址220.xx.xxx.xxx。 I tried to make a simple java tcp server program and android tcp client program. 我试图制作一个简单的java tcp服务器程序和android tcp客户端程序。 The android client works fine when: 在以下情况下,Android客户端可以正常工作:

  1. Server and emulator program in the same pc. 服务器和仿真器程序在同一台PC中。
  2. Server in one pc having real IP address emulator is in another pc with a real ip address. 一台具有真实IP地址模拟器的计算机中的服务器位于另一台具有真实IP地址的计算机中。
  3. Server and emulator both within under private network within same pc or different pc or device. 服务器和仿真器都位于同一台PC或不同PC或设备内的专用网络下。

does not work when: 在以下情况下不起作用:

  1. client is a smart phone having wifi or 3g network, and server have a real IP address on different network. 客户端是具有wifi或3g网络的智能手机,而服务器在不同网络上具有真实的IP地址。
  2. client is an emulator running on wifi connected device, server have a real ip address. 客户端是在wifi连接的设备上运行的模拟器,服务器具有真实的IP地址。

So, how to connect to a Java TCP server socket having Public IP From Android Tcp Client Socket? 那么,如何从Android Tcp客户端套接字连接到具有公共IP的Java TCP服务器套接字? I dont think pasting code is really necessary here. 我认为粘贴代码在这里确实不是必需的。 However if some one ask I can provide. 但是,如果有人问我可以提供。 According to my search on the internet some people provide suggestion to configuring the router on the server side. 根据我在Internet上的搜索,有人建议在服务器端配置路由器。 this seems to me little bit annoying. 在我看来,这有点烦人。 if I run a websever it can be accessed from anywhere any place. 如果我运行网络服务器,则可以从任何地方访问它。 code included here: Server side: 此处包含的代码:服务器端:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.*;

public class Server {

    private static ServerSocket serverSocket;
    private static Socket clientSocket;
    private static InputStreamReader inputStreamReader;
    private static BufferedReader bufferedReader;
    private static OutputStreamWriter outputStreamWriter;
    private static BufferedWriter bufferedWriter;
    private static PrintWriter printWriter;
    private static String message;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            System.out.println(InetAddress.getLocalHost());
            serverSocket = new ServerSocket(4444); // Server socket

        } catch (IOException e) {
            System.out.println("Could not listen on port: 4444");
        }

        System.out.println("Server started. Listening to the port 4444");

        while (true) {
            try {

                clientSocket = serverSocket.accept(); // accept the client connection
                System.out.println("connection initiated");

                DataInputStream din = new DataInputStream(clientSocket.getInputStream());

                DataOutputStream dout= new DataOutputStream(clientSocket.getOutputStream());

                String msg = din.readUTF();
                System.out.println(msg);

                dout.writeUTF("hello from server");
                System.out.println("sent to client");



                clientSocket.close();

            } catch (IOException ex) {
                System.out.println("Problem in message reading "+ex);
            }
        }
    }

}

Client Side: 客户端:

package com.example.client;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

 TextView textResponse;
 EditText editTextAddress, editTextPort; 
 Button buttonConnect, buttonClear;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  editTextAddress = (EditText)findViewById(R.id.address);
  editTextPort = (EditText)findViewById(R.id.port);
  buttonConnect = (Button)findViewById(R.id.connect);
  buttonClear = (Button)findViewById(R.id.clear);
  textResponse = (TextView)findViewById(R.id.response);

  buttonConnect.setOnClickListener(buttonConnectOnClickListener);

  buttonClear.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    textResponse.setText("");
   }});
 }

 OnClickListener buttonConnectOnClickListener = 
   new OnClickListener(){

    @Override
    public void onClick(View arg0) {
     MyClientTask myClientTask = new MyClientTask(
       editTextAddress.getText().toString(),
       Integer.parseInt(editTextPort.getText().toString()));
     myClientTask.execute();
    }};

 public class MyClientTask extends AsyncTask<Void, Void, Void> {

  String dstAddress;
  int dstPort;
  String response = "";

  MyClientTask(String addr, int port){
   dstAddress = addr;
   dstPort = port;
  }
  private PrintWriter printwriter;
  private InputStreamReader inputStreamReader;
  private BufferedReader bufferedReader;
  @Override
  protected Void doInBackground(Void... arg0) {

   Socket socket = null;

   try {
    socket = new Socket(dstAddress, dstPort);

    DataInputStream din = new DataInputStream(socket.getInputStream());
    DataOutputStream dout = new DataOutputStream(socket.getOutputStream());

    dout.writeUTF("hello from client");

    response="sent to serve;r";

    String msg = din.readUTF();
    response+=msg;

    socket.close();

   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = e.toString();
   }
   return null;
  }

  @Override
  protected void onPostExecute(Void result) {
   textResponse.setText(response);
   super.onPostExecute(result);
  }

 }

}

For TCP connections to work on a real device, you need to provide the URL of a publicly hosted domain. 为了使TCP connections在真实设备上正常工作,您需要提供一个公共托管域的URL A localhost or a local network URL works only with an emulator on a PC on the same local network. localhost或本地网络URL仅可an emulator同一本地网络上a PC上的an emulator

References: 参考文献:

1. Emulator Networking . 1. 仿真器网络

2. How to connect to my http://localhost web server from Android Emulator in Eclipse 2. 如何从Eclipse中的Android仿真器连接到我的http:// localhost网络服务器

3. Accessing localhost:port from Android emulator 3. 从Android仿真器访问localhost:port

4. Calling web service from android device 4. 从Android设备调用网络服务

5. Connect an Android Device To a Web Service on Local Host 5. 将Android设备连接到本地主机上的Web服务

6. How can I access my localhost from my Android device? 6. 如何从Android设备访问本地主机?

7. How to browse localhost on android device? 7. 如何在android设备上浏览localhost?

I just changed the port number from 4444 to 6667 and It worked on everywhere now. 我只是将端口号从4444更改为6667,它现在​​可以在任何地方使用。 I dont think port 4444 was used on somewhere else because the program works on local network 我不认为端口4444被用于其他地方,因为该程序可在本地网络上运行

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM