Я использую приложение для чата, где сервер является Java и клиент в android. мой код сервера написан на Java-языке, используя сокет-программирование. Когда я подключаю свой Android-телефон (интернет включен) к ноутбуку и запускаю как сервер, так и клиент, тогда он работает нормально. в моем клиентском приложении мне нужно ввести IP-адрес серверной машины, который похож на этот 192.168. .. когда клиент посылает массаж на сервер, а затем сервер возвращает ответ клиенту. это нормально.Связь с сервером и сервером Java на разных сетях
но когда я запускаю клиента с другого телефона Android, которого нет в моей домашней сети (предположим, что мой друг находится у него дома и пытается подключиться к java-серверу (в моем доме) через Интернет). Тогда сервер не показывал соединение установить. Я также пытаюсь поставить свой общедоступный IP-адрес из Google в клиентское приложение, когда вы начинаете, но все равно никакого ответа.
код сервера ..
public class SimpleChatServer {
static int port_num =4444;
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket clientSocket = null;
try {
serverSocket = new ServerSocket(port_num);
System.out.println("Server started. Listening to the port 4444. Waitng for the client.");
clientSocket = serverSocket.accept();
System.out.println("Client connected on port 4444.");
port_num++;
} catch (IOException e) {
System.out.println("Could not listen on port: 4444");
e.printStackTrace();
return;
}
пожалуйста, любой приятель может сказать мне, что я должен делать? как подключить клиента к серверу? и что такое ip-адрес от ipconfig и какой у меня IP-адрес от Google?
это мой клиентский код для Android.
public class SimpleClientServerChatActivity extends Activity {
private EditText textField,ipaddrs;
private Button button, start;
private TextView textView;
private Socket client;
private PrintWriter printwriter;
private BufferedReader bufferedReader;
//Following is the IP address of the chat server. You can change this IP address according to your configuration.
// I have localhost IP address for Android emulator.
private String CHAT_SERVER_IP = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_client_server_chat);
textField = (EditText) findViewById(R.id.editText1);
button = (Button) findViewById(R.id.button1);
textView = (TextView) findViewById(R.id.textView1);
ipaddrs = (EditText) findViewById(R.id.ipaddrs);
start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
###############// there client enter server public ip address via mobile app
CHAT_SERVER_IP = String.valueOf(ipaddrs.getText());
ChatOperator chatOperator = new ChatOperator();
chatOperator.execute();
}
});
}
/**
* This AsyncTask create the connection with the server and initialize the
* chat senders and receivers.
*/
private class ChatOperator extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
client = new Socket(CHAT_SERVER_IP, 4444); // Creating the server socket.
if (client != null) {
printwriter = new PrintWriter(client.getOutputStream(), true);
InputStreamReader inputStreamReader = new InputStreamReader(client.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
} else {
System.out.println("Server has not bean started on port 4444.");
}
} catch (UnknownHostException e) {
System.out.println("Faild to connect server " + CHAT_SERVER_IP);
e.printStackTrace();
} catch (IOException e) {
System.out.println("Faild to connect server " + CHAT_SERVER_IP);
e.printStackTrace();
}
return null;
}
/**
* Following method is executed at the end of doInBackground method.
*/
@Override
protected void onPostExecute(Void result) {
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final Sender messageSender = new Sender(); // Initialize chat sender AsyncTask.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
messageSender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
messageSender.execute();
}
}
});
Receiver receiver = new Receiver(); // Initialize chat receiver AsyncTask.
receiver.execute();
}
}
/**
* This AsyncTask continuously reads the input buffer and show the chat
* message if a message is availble.
*/
private class Receiver extends AsyncTask<Void, Void, Void> {
private String message;
@Override
protected Void doInBackground(Void... params) {
while (true) {
try {
if (bufferedReader.ready()) {
message = bufferedReader.readLine();
publishProgress(null);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
@Override
protected void onProgressUpdate(Void... values) {
textView.append("Server: " + message + "\n");
}
}
/**
* This AsyncTask sends the chat message through the output stream.
*/
private class Sender extends AsyncTask<Void, Void, Void> {
private String message;
@Override
protected Void doInBackground(Void... params) {
message = textField.getText().toString();
printwriter.write(message + "\n");
printwriter.flush();
return null;
}
@Override
protected void onPostExecute(Void result) {
textField.setText(""); // Clear the chat box
textView.append("Client: " + message + "\n");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_simple_client_server_chat, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
есть проблема, когда я вхожу в общедоступный IP-адрес сервера, мобильное приложение стало аварийным. почему это происходит. если я поставил там местный адрес ip, он не будет разбиваться.
Если вы попытаетесь подключиться к сети, вам может потребоваться просмотреть перенаправление портов через маршрутизатор. – 3kings
Я знаю о переадресации портов. но я получаю доступ к интернету через свой мобильный телефон. поэтому в моем конце нет маршрутизатора. так как я могу использовать переадресацию портов. –
Да, но вы пытаетесь подключиться к своему компьютеру, на котором сервер работает где-то еще, я прав? – 3kings