Я работаю на «привет мир» клиент-сервер приложения/и я борюсь с соединением между сервером , который написан в Скале и работает на моем компьютере и клиент, который написан на android и работает на моем телефоне.Простые приложения клиент-сервер с помощью сокетов
Я подключил оба приложения к одной подсети, т. Е. мой маршрутизатор и установить для них соответствующий ip и порт. Проблема в том, что клиент, который написан на Android, мгновенно прекращается.
P.S. Я не опубликовал свой IP-адрес по соображениям безопасности.
Код Сервер:
import java.net._
import java.io._
import scala.io._
object MyServer extends App
{
try
{
val server = new ServerSocket(4242)
println("Serve initialized:")
val client = server.accept
val in = new BufferedReader(new InputStreamReader(client.getInputStream()))
val out = new PrintStream(client.getOutputStream())
var message =in.readLine()
while(message != null)
{
println("Server received:" + message)
out.println("Message received")
out.flush
if (message.equals("Disconnect"))
{
client.close;
server.close;
println("Server closing:")
}
message= in.readLine()
}
}
catch
{
case e: Exception => println(e.getStackTrace); System.exit(1)
}
}
код клиента:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ghiurutan.clientv1.MainActivity">
<Button
android:text="@string/button_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="158dp" />
<TextView
android:text="@string/text_view_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/textView"
android:layout_alignBottom="@+id/editText"
android:layout_toLeftOf="@+id/button"
android:layout_toStartOf="@+id/button" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="@+id/editText"
android:layout_marginBottom="125dp"
android:layout_alignBottom="@+id/button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ghiurutan.clientv1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java
package com.example.ghiurutan.clientv1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.*;
import java.net.*;
import android.view.View;
import android.widget.*;
public class MainActivity extends AppCompatActivity {
private Socket socket;
private static final int SERVER_PORT=4242;
private static final String SERVER_IP="";
private EditText editText;
private Button button;
private PrintWriter printWriter;
private String messageToSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(
new Runnable()
{
public void run()
{
try{
socket=new Socket(InetAddress.getByName(SERVER_IP),SERVER_PORT);
}catch(UnknownHostException e)
{
System.out.println(e.getLocalizedMessage());
}catch(IOException e)
{
System.out.println(e.getLocalizedMessage());
}
}
}
).start();
}
@Override
protected void onStart()
{
super.onStart();
try{
printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
}catch(UnknownHostException e)
{
System.out.println(e.getLocalizedMessage());
}catch(IOException e)
{
System.out.println(e.getLocalizedMessage());
}
editText=(EditText)findViewById(R.id.editText);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(
new Button.OnClickListener()
{
public void onClick(View v)
{
messageToSend=editText.getText().toString();
editText.setText("");
printWriter.println(messageToSend);
}
}
);
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
}
@Override
public void onDestroy()
{
super.onDestroy();
}
}
Должен отметить, что я просто начинающий программировать, поэтому любая помощь или предложение приветствуются. Должен ли я использовать переадресацию портов в таком случае? Кто-то сказал мне, что неплохо разместить сервер в облаке, потому что тогда он станет более заметным.
'и установить соответствующий IP и порт для them'. Не понятно. Что ты сделал? – greenapps
Первой проблемой, которую я вижу, является то, что вы не используете весь сетевой код в потоке. Да, вы открываете сокет в потоке. ОК. Но не писатель и println(). Весь сетевой код должен выполняться в потоке или в AsyncTask. – greenapps
Таким образом, вы увидите сообщение «NetworkOnMainThreadException», которое будет хорошо видно в logcat. И это приводит к сбою вашего приложения. Вы не сообщили об этом. – greenapps