繁体   English   中英

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

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

我的工作地点有两个Real Ip地址220.xx.xxx.xxx。 我试图制作一个简单的java tcp服务器程序和android tcp客户端程序。 在以下情况下,Android客户端可以正常工作:

  1. 服务器和仿真器程序在同一台PC中。
  2. 一台具有真实IP地址模拟器的计算机中的服务器位于另一台具有真实IP地址的计算机中。
  3. 服务器和仿真器都位于同一台PC或不同PC或设备内的专用网络下。

在以下情况下不起作用:

  1. 客户端是具有wifi或3g网络的智能手机,而服务器在不同网络上具有真实的IP地址。
  2. 客户端是在wifi连接的设备上运行的模拟器,服务器具有真实的IP地址。

那么,如何从Android Tcp客户端套接字连接到具有公共IP的Java TCP服务器套接字? 我认为粘贴代码在这里确实不是必需的。 但是,如果有人问我可以提供。 根据我在Internet上的搜索,有人建议在服务器端配置路由器。 在我看来,这有点烦人。 如果我运行网络服务器,则可以从任何地方访问它。 此处包含的代码:服务器端:

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);
            }
        }
    }

}

客户端:

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);
  }

 }

}

为了使TCP connections在真实设备上正常工作,您需要提供一个公共托管域的URL localhost或本地网络URL仅可an emulator同一本地网络上a PC上的an emulator

参考文献:

1. 仿真器网络

2. 如何从Eclipse中的Android仿真器连接到我的http:// localhost网络服务器

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

4. 从Android设备调用网络服务

5. 将Android设备连接到本地主机上的Web服务

6. 如何从Android设备访问本地主机?

7. 如何在android设备上浏览localhost?

我只是将端口号从4444更改为6667,它现在​​可以在任何地方使用。 我不认为端口4444被用于其他地方,因为该程序可在本地网络上运行

暂无
暂无

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

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