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

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

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

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

11.02.2016, 13:30. Просмотров 307. Ответов 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();
Кто может подсказать в чем проблема? Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2016, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Sockets и потоки, разное поведение на устройствах (Программирование Android):

.NET 4.x Разное поведение DateTimePicker - C#
Помогите справится с проблемой. У меня есть два разных проекта. Один основной, другой - тестовый, созданый, чтобы решить эту проблему . ...

Разное поведение UTF8Encoding на локале и на хостинге - C# MVC
Выполняю следующий код: Encoding enc = new UTF8Encoding(true, true); byte bytes =...

Разное поведение span в разных проектах - HTML, CSS
Вобщем есть сайт http://graviongroup.ru/ у него есть правое меню с вкладками ПАРТНЕРАМ НОВОСТИ и меню "бургер" так вот, посмотрел стили у...

Разное поведение одной и той же формы - C#
Привет всем, пишу первый раз, строго не судите Делаю для диплома мелкую программку, есть много кнопок и текстовых полей Нужно работать...

Разное поведение QTreeView в winXP и win7 - C++ Qt
Создаётся окно для выбора папки, при попытке открытия сетевого пути "\\NNN\NNN\NNN" в winXP всё срабатывает штатно, а в win7 открывает...

Разное поведение программы в линукс и windows - C++ Qt
Программа после компиляции Qt Creator -> MinGW ведет себя не так как при обычной (GCC). В среде линукс программа ведет себя как и...

19
Pablito
2499 / 1983 / 618
Регистрация: 12.05.2014
Сообщений: 6,925
Завершенные тесты: 1
11.02.2016, 13:35 #2
вангую что в манифесте нет разрешения, куда его добавить - тут
0
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 13:39  [ТС] #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 запустил в нем - работает, остается странным почему не работает на тех двух устройствах..
0
Pablito
2499 / 1983 / 618
Регистрация: 12.05.2014
Сообщений: 6,925
Завершенные тесты: 1
11.02.2016, 13:42 #4
весь лог ошибки надо, а не пересказ
0
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 14:02  [ТС] #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)
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
11.02.2016, 14:13 #6
Цитата Сообщение от DomEdI Посмотреть сообщение
java.lang.NullPointerException
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *at com.example.root.mygameactivity.ServerActivity$1.run(ServerActivity.java:74)
Что там находится?
0
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 14:27  [ТС] #7
Строка

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

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

Java
1
2
3
Log.d("LOGD", "LOG");
                serverSocket = new Socket(str, 8888);
                Log.d("LOGD", "LOG2");
Первый выдал, второй - нет. Значит не открывается сокет? С чем это может быть связано?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
11.02.2016, 15:06 #12
DomEdI, пишут, что надо добавить разрешения в манифест. Одно или оба:
XML
1
2
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
0
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 15:11  [ТС] #13
CoolMind, Есть такое.. не работает. Попутно возник вопрос, чем Socket отличается от ServerSocket?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
11.02.2016, 15:43 #14
DomEdI, я не работал с Socket, поэтому не могу сказать. Так что дальше, вы разобрались с задачей?
0
DomEdI
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 53
11.02.2016, 15:49  [ТС] #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); не идет, логи после уже не выводит. Значит опять не открывает сокет.
0
11.02.2016, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2016, 15:49
Привет! Вот еще темы с ответами:

Разное поведение одного и того же кода - C#
Всем привет! Я новичок в C# и в целом в ООП, но кое-чего уже соображаю. Я скачал из интернета проект для примера и вставил весь его (не...

Разное поведение SendMessage в двух случаях - Delphi
У меня описана простая форма: Type Tform1 = class(TForm) Memo1: Tmemo; procedure Memo1DblClick(Sender: TObject); private ...

C++ std::thread разное поведение на linux и windows - C++
Столкнулся с странным поведением std::thread, при использовании метода detach. Пример кода: #include &lt;iostream&gt; #include &lt;thread&gt;...

Разное поведение при debug и release сборке - C++ Qt
Здравствуйте! Писал клиент для сервера и вот с чем столкнулся: с слоте чтения данных пришедших с сервера была неинициализированная...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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