Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
#1

Sockets и потоки, разное поведение на устройствах - Android

11.02.2016, 13:30. Просмотров 257. Ответов 19
Метки нет (Все метки)

Привет всем. Такая проблема - пытаюсь создать сокеты и обменяться словами.
Код сервера

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class ServerActivity extends AppCompatActivity {
 
    public String str;
    ServerSocket serverSocket;
    Socket socket;
    DataInputStream dataInputStream;
    DataOutputStream dataOutputStream;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_server);
        TextView textView = (TextView)findViewById(R.id.textView2);
        try {
            WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            int ipAddress = wifiInfo.getIpAddress();
            str = String.format(Locale.getDefault(), "%d.%d.%d.%d",
                    (ipAddress & 0xff), (ipAddress >> 8 & 0xff),
                    (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
            textView.setText(str);
        } catch (Exception ex) {
            textView.setText("ОШИБКА ПОЛУЧЕНИЯ IP АДРЕСА");
        }
        mThr.start();
    }
 
    Thread mThr = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(8888);
                System.out.println("Listening :8888");
            } catch (IOException e) {
                e.printStackTrace();
            }
            while(true){
                try {
                    System.out.println("mtav ... !");
                    socket = serverSocket.accept();
                    dataInputStream = new DataInputStream(socket.getInputStream());
                    dataOutputStream = new DataOutputStream(socket.getOutputStream());
                  //  System.out.println("message: " + dataInputStream.readUTF());
                    dataOutputStream.writeUTF("Hello!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                finally {
                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
 
                    if (dataInputStream != null) {
                        try {
                            dataInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
 
                    if (dataOutputStream != null) {
                        try {
                            dataOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    });
}
Код клиента:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class ClientActivity extends AppCompatActivity implements View.OnClickListener {
 
    Socket socket = null;
    DataOutputStream dataOutputStream = null;
    DataInputStream dataInputStream = null;
    public String ipaddr;
    public String InText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_client);
        EditText editText = (EditText)findViewById(R.id.editText);
        ipaddr = editText.getText().toString();
        Button start = (Button)findViewById(R.id.button);
        start.setOnClickListener(this);
    }
 
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button: {
                mThr.start();
            }break;
 
 
            default:
                break;
        }
    }
 
    Thread mThr = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket = new Socket(ipaddr, 8888);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream.writeUTF("HELLO");
                Log.d("INNER", dataInputStream.readUTF());
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally{
                if (socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
 
                if (dataOutputStream != null){
                    try {
                        dataOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
 
                if (dataInputStream != null){
                    try {
                        dataInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    });
}

Пробовал на трех устройствах. На первом серверная часть работает, ошибок не выдает. На двух других выдает ошибку nullPointerException и указывает на строку socket = serverSocket.accept();
Кто может подсказать в чем проблема? Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2016, 13:30     Sockets и потоки, разное поведение на устройствах
Посмотрите здесь:

Поиск файла на внешних устройствах или как получить список всех смонтированных носителей Android
Разное имя пакета и приложения Android
Android Как реализовать обмен данными между копиями одного приложения, установленными на разных устройствах
Не увеличиваются иконки на различных устройствах Android
Разные темы оформления меню на старых устройствах Android
Android Не понятное поведение BaseAdapter
Android Не создается БД на некоторых устройствах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
11.02.2016, 13:35     Sockets и потоки, разное поведение на устройствах #2
вангую что в манифесте нет разрешения, куда его добавить - тут
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 13:39  [ТС]     Sockets и потоки, разное поведение на устройствах #3
В манифесте прописано

Java
1
2
3
4
5
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>

Создал AVD запустил в нем - работает, остается странным почему не работает на тех двух устройствах..
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
11.02.2016, 13:42     Sockets и потоки, разное поведение на устройствах #4
весь лог ошибки надо, а не пересказ
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 14:02  [ТС]     Sockets и потоки, разное поведение на устройствах #5
Изменил код
Поток клиента:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Thread mThr = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket = new Socket(ipaddr, 8888);
                out=new PrintWriter(socket.getOutputStream(), true);
                out.println("YOUCONNECT");
                in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                Log.d("CS", ""+ in);
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
    });
Поток сервера:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Thread mThr = new Thread(new Runnable() {
        @Override
        public void run() {
 
            try {
                serverSocket = new Socket(str, 8888);
                out = new PrintWriter(serverSocket.getOutputStream(), true);
                in=new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
                System.out.println("Listening :8888");
            } catch (IOException e) {
                e.printStackTrace();
            }
            while(true){
                try {
                    echo = in.readLine();
                    Log.d("CS", ""+echo);
                    if(echo == "YOUCONNECT"){
                        out.println("YES");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
 
            }
        }
    });
Теперь везде ошибка:
XML
1
2
3
4
5
02-11 13:59:13.050 1073-2136/com.example.root.mygameactivity E/AndroidRuntime: FATAL EXCEPTION: Thread-17330
                                                                               Process: com.example.root.mygameactivity, PID: 1073
                                                                               java.lang.NullPointerException
                                                                                   at com.example.root.mygameactivity.ServerActivity$1.run(ServerActivity.java:74)
                                                                                   at java.lang.Thread.run(Thread.java)
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
11.02.2016, 14:13     Sockets и потоки, разное поведение на устройствах #6
Цитата Сообщение от DomEdI Посмотреть сообщение
java.lang.NullPointerException
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *at com.example.root.mygameactivity.ServerActivity$1.run(ServerActivity.java:74)
Что там находится?
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 14:27  [ТС]     Sockets и потоки, разное поведение на устройствах #7
Строка

Java
1
 echo = in.readLine();
Объявление echo

Java
1
  public String echo;
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
11.02.2016, 14:34     Sockets и потоки, разное поведение на устройствах #8
DomEdI, вы уверены, что in=new BufferedReader(new InputStreamReader(serverSocket.getInputStream())); отрабатывает?
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 14:37  [ТС]     Sockets и потоки, разное поведение на устройствах #9
Если честно - нет. Как можно это проверить?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
11.02.2016, 14:51     Sockets и потоки, разное поведение на устройствах #10
DomEdI, обычно есть 2 способа: либо использовать отладчик (Debug) и поставить точку останова на этой линии. Если дотуда дойдёт, а затем можно сделать ещё шаг, значит, отрабатывает. Либо можно написать что-то типа: Log.i("***", in == null ? "null" : in.toString()); и посмотреть в лог.
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 15:01  [ТС]     Sockets и потоки, разное поведение на устройствах #11
CoolMind, Попробовал с Вашим логом, ничего не выдало. Написал так:

Java
1
2
3
Log.d("LOGD", "LOG");
                serverSocket = new Socket(str, 8888);
                Log.d("LOGD", "LOG2");
Первый выдал, второй - нет. Значит не открывается сокет? С чем это может быть связано?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
11.02.2016, 15:06     Sockets и потоки, разное поведение на устройствах #12
DomEdI, пишут, что надо добавить разрешения в манифест. Одно или оба:
XML
1
2
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 15:11  [ТС]     Sockets и потоки, разное поведение на устройствах #13
CoolMind, Есть такое.. не работает. Попутно возник вопрос, чем Socket отличается от ServerSocket?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
11.02.2016, 15:43     Sockets и потоки, разное поведение на устройствах #14
DomEdI, я не работал с Socket, поэтому не могу сказать. Так что дальше, вы разобрались с задачей?
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 15:49  [ТС]     Sockets и потоки, разное поведение на устройствах #15
CoolMind, Пока еще решаю, на сервере изменил код на:

Java
1
2
3
4
5
6
7
8
9
SC = new ServerSocket(8888);
            Log.d("LOGD", "sdfs");
 
            while (true) {
                Socket socket = SC.accept();
                Log.d("LOGD", ""+socket.getInetAddress());
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                Log.d("LOGD", ""+in.readLine());
            }
Как я понял accept() должен сработать когда придет сообщение, после него лог никакой не выводит.
На клиенте код остался тот, что в предыдущих постах, но дальше строки socket = new Socket(ipaddr, 8888); не идет, логи после уже не выводит. Значит опять не открывает сокет.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
11.02.2016, 16:20     Sockets и потоки, разное поведение на устройствах #16
ты можешь показать актуальные листинги сервера и клиента?
без выдергиваний кусков кода, целиком

и как это все вообще запускается - разные устройства? реальные или эмуляторы?
если это эмуляторы то врятли они будут друг-друга видеть в локалке

Добавлено через 1 минуту
и какой адрес высвечивает в textview на серверной части?
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 16:38  [ТС]     Sockets и потоки, разное поведение на устройствах #17
Клиент:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.example.root.mygameactivity;
 
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class ClientActivity extends AppCompatActivity implements View.OnClickListener {
 
    Socket socket = null;
    DataOutputStream dataOutputStream = null;
    DataInputStream dataInputStream = null;
    PrintWriter out = null;
    BufferedReader in = null;
    public String ipaddr;
    public String InText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_client);
        EditText editText = (EditText)findViewById(R.id.editText);
        ipaddr = editText.getText().toString();
        Button start = (Button)findViewById(R.id.button);
        start.setOnClickListener(this);
    }
 
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button: {
                mThr.start();
            }break;
 
 
            default:
                break;
        }
    }
 
    Thread mThr = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket = new Socket(ipaddr, 8888);
                out=new PrintWriter(socket.getOutputStream(), true);
                out.println("YOUCONNECT");
                in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                Log.d("CS", ""+ in);
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
    });
}
Сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.example.root.mygameactivity;
 
import android.content.pm.ActivityInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
 
import org.w3c.dom.Text;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Locale;
 
public class ServerActivity extends AppCompatActivity {
 
    public String str;
    public static Socket serverSocket;
 
    ServerSocket SC;
 
    PrintWriter out = null;
    BufferedReader in = null;
    PrintStream pr = null;
    public String echo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_server);
        TextView textView = (TextView)findViewById(R.id.textView2);
        try {
            WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            int ipAddress = wifiInfo.getIpAddress();
            str = String.format(Locale.getDefault(), "%d.%d.%d.%d",
                    (ipAddress & 0xff), (ipAddress >> 8 & 0xff),
                    (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
            textView.setText(str);
        } catch (Exception ex) {
            textView.setText("ОШИБКА ПОЛУЧЕНИЯ IP АДРЕСА");
        }
        mThr.start();
    }
 
    Thread mThr = new Thread(new Runnable(){
        @Override
        public void run() {
 
            try {
                get();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void get() throws IOException{
            SC = new ServerSocket(8888);
            Log.d("LOGD", "sdfs");
 
            while (true) {
                Socket socket = SC.accept();
                Log.d("LOGD", ""+socket.getInetAddress());
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                Log.d("LOGD", ""+in.readLine());
            }
        }
    });
}
Запуск на разных устройствах, подключенных по WiFi к одной сети. На серверной пишет 192.168.1.210
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
11.02.2016, 16:46     Sockets и потоки, разное поведение на устройствах #18
лично я бы делал так
- стартуем сервер
- если есть компьютер в этой же сети запускаем там командную строку и пишем туда
Bash
1
telnet 192.168.0.210 8888
то есть АДРЕС_СЕРВЕРА(пробел)ПОРТ
если нет телнета, можно использовать putty или кто чем владеет
телнет на винде и выше можно поставить в панели управления-компоненты виндовс

если сервер стартует нормально то телнет должен "провалиться" в черный экран
иначе он скажет что-то типа connection refused или timeout

если все таки не провалился в церный экран - смотрим внимательно логи с сервера, ну что там в консоли написало, а там 100% должно что-то писать, много писать
и желательно не копировать три строчки ошибки, а всю простыню
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 17:07  [ТС]     Sockets и потоки, разное поведение на устройствах #19
В общем проблема решилась, нашлась очень тупая ошибка - переменная ipaddr была объявлена локально в методе onCreate(), и, мало того, считывала данные из EditText при выполнении метода onCreate(), а не при нажатии кнопки. Естественно она была пустой при попытке создания сокета, вынес объявление переменной в шапку класса, считывание данных в кейс нажатия кнопки и, ура, все заработало. Сервер и клиент обменялись сообщениями.

Спасибо всем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2016, 17:14     Sockets и потоки, разное поведение на устройствах
Еще ссылки по теме:

Не отображается AlertDialog на разных устройствах Android
Android По разному отображается на разных устройствах
Android Calendar.get(Calendar.WEEK_OF_YEAR) на разных устройствах возвращает разные значения
Маштабирование картинки на разных Android-устройствах Android
Android Не выводятся логи приложения на некоторых устройствах

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
11.02.2016, 17:14     Sockets и потоки, разное поведение на устройствах #20
DomEdI, блин, вот я так и думал с самого начала, но боялся спросить
Yandex
Объявления
11.02.2016, 17:14     Sockets и потоки, разное поведение на устройствах
Ответ Создать тему
Опции темы

Текущее время: 07:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru