Соединение посредством сокетов java android

318
06 ноября 2017, 20:18

Надо сделать наиболее простое соединение между телефоном Android и программой на ПК с помощью языка java. Пытался многократно, прочитал множество статей и вопросов на этом сайте, но все равно не получается. Мне главное простота, меня интересует как именно сделать соединение.

Я пытался сделать наиболее простой клиент, хочу понять для начала как установить соединение, а многопоточность и проблему со сменой ориентации устройства на потом. Укажите пожалуйста ошибки и расскажите как установить соединение посредством сокетов. Искал похожие вопросы но нужного мне не нашел.

Вот пытался сделать простейший сервер на ПК:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(4444);
        while (true) {
        Socket socket = serverSocket.accept();
        BufferedReader reader= new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s = reader.readLine();
        System.out.println("Message: " + s);}
    } catch (IOException e) {
        e.printStackTrace();
    }
}

А так же клиент для Аndroid:

public class MainActivity extends AppCompatActivity {
    String ip = "";
    int port = 0;
    Button set;
    Button send;
    EditText ipField;
    EditText portField;
    EditText messageField;
    TextView problemDisplay;
    PrintWriter writer;
    boolean checkSocket = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        set = (Button) findViewById(R.id.setBtn);
        send = (Button) findViewById(R.id.sendBtn);
        ipField = (EditText) findViewById(R.id.ipEditText);
        portField = (EditText) findViewById(R.id.portEditText);
        messageField = (EditText) findViewById(R.id.messageEditText);
        problemDisplay = (TextView) findViewById(R.id.textProblem);
    }
    public void setSettings(View view) {
        try {
            ip = ipField.getText().toString();
            port = Integer.parseInt(ipField.getText().toString());
        }catch (Exception e){
            problemDisplay.setText("Invalid data");
        }
        try {
            Socket socket = new Socket(InetAddress.getByName(ip), port);
            writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            checkSocket = true;
        }catch (Exception e){
            problemDisplay.setText("socket error");
        }
    }
    public void send(View view) {
        if (checkSocket) {
            String message = messageField.getText().toString();
            writer.print(message);
            writer.flush();
        }else {problemDisplay.setText("set Data");}
    }
}

Приложение вылетает со следующим сообщением об ошибке:

java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:5207)
at android.view.View$PerformClick.run(View.java:21177)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5527)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
... 9 more
Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
at libcore.io.IoBridge.socket(IoBridge.java:619)
at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
at java.net.Socket.startupSocket(Socket.java:584)
at java.net.Socket.<init>(Socket.java:226)
at com.example.nikita.simpleclient.MainActivity.setSettings(MainActivity.java:49)
... 11 more
Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
at libcore.io.Posix.socket(Native Method)
at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
at libcore.io.IoBridge.socket(IoBridge.java:604)
... 15 more
READ ALSO
Maven - два приложения с одним общим модулем

Maven - два приложения с одним общим модулем

Здравствуйте! В рамках одного проекта, есть два приложения (модуля), которые используют один общий модульПеревожу все это дело на maven и столкнулся...

201
libGDX Tiled map Как в изометрии узнать getCell?

libGDX Tiled map Как в изометрии узнать getCell?

У меня изометрическая картаИ у меня не получается узнать координаты блока, то есть getCell

228
Подгрузка CardView в фрагмент [требует правки]

Подгрузка CardView в фрагмент [требует правки]

Пытаюсь подгружать CardView в один из фрагментовНо при открытии фрагмента приложение вылетает

256
Ошибка чтения файла внутренней памяти

Ошибка чтения файла внутренней памяти

Логика приложения: проверяю существование файла, если его нет - вызываю внутренний класс ParseBookCovers, который парсит json файл с сервера и записывает...

213