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

Клиент-серверное приложение - Android

Войти
Регистрация
Восстановить пароль
 
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 168
20.10.2014, 02:26     Клиент-серверное приложение #1
Всем привет!)
Возникла такая проблема есть серверное приложение(на Java) и есть к нему клиент(так же на Java).
Однако при написании того же клиента на андройд, возникает проблема, при получении ответа от сервера(строки) они заносятся в ListView, однако заносится лишь первая переданная строка, остальные же хоть и отображаются и на сервере и в клиенте(на компе), в ListView не заносятся
В чем может быть проблема?

код сервера:
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
public class Server {
 
    ArrayList outputStream; // используем ArrayList для хранения входящих сообщений
    
    public class ClientHandler implements Runnable{
 
        BufferedReader buffer;
        Socket sock;
        
        public ClientHandler(Socket clientSocket){
            try{        
            sock = clientSocket;
            InputStreamReader reader = new InputStreamReader(sock.getInputStream());
            buffer = new BufferedReader(reader);
            
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
        @Override
        public void run() {
            String message;
            try{
                while((message = buffer.readLine()) != null){
                    System.out.println("читается "+message);
                    tellEveryone(message);
            }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        
    }
    
    public static void main(String[] args) {
        new Server().go();
    }
    
    public void go(){
        outputStream = new ArrayList();
        try{
            ServerSocket  serverSocket = new ServerSocket(5000);
        while(true){
            
            Socket clientSocket = serverSocket.accept();
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
            outputStream.add(writer);
            
            Thread t = new Thread(new ClientHandler(clientSocket));
            t.start();
            System.out.println("Клиент подключен");
        }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public void tellEveryone(String message){
        
        Iterator it = outputStream.iterator();
        while(it.hasNext()){
            try{
            PrintWriter writer = (PrintWriter) it.next();
            writer.println(message);
            writer.flush();
            }catch(Exception ex){
                ex.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
public class Client {
    
    
    JTextArea incoming;
    JTextField outgoing;//текстовое поле для отправки текста на сервер
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    
    public void go(){
        /*формируем GUI */
        
        JFrame frame = new JFrame("My chat client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,28);
        incoming.setLineWrap(true);
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outgoing = new JTextField(20);
        JButton btnSend = new JButton("Отправить");
        btnSend.addActionListener(new SendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(btnSend);
        setUpNetworking();
        public class Client {
    
    
    JTextArea incoming;
    JTextField outgoing;//текстовое поле для отправки текста на сервер
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    
    public void go(){
        /*формируем GUI */
        
        JFrame frame = new JFrame("My chat client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,28);
        incoming.setLineWrap(true);
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outgoing = new JTextField(20);
        JButton btnSend = new JButton("Отправить");
        btnSend.addActionListener(new SendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(btnSend);
        setUpNetworking();
        public class Client {
    
    
    JTextArea incoming;
    JTextField outgoing;//текстовое поле для отправки текста на сервер
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    
    public void go(){
        /*формируем GUI */
        
        JFrame frame = new JFrame("My chat client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,28);
        incoming.setLineWrap(true);
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outgoing = new JTextField(20);
        JButton btnSend = new JButton("Отправить");
        btnSend.addActionListener(new SendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(btnSend);
        setUpNetworking();
        Thread readThread = new Thread(new IncomingReader());
        readThread.start();
        
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setVisible(true);
        frame.setSize(350, 350);
    }
    
    
    public void setUpNetworking(){
        
        try{
            sock = new Socket("192.168.0.101", 5000);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);
            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("Соединение установленно...");
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
    
    
    
 
    public static void main(String[] args) {
        Client client = new Client();
        client.go();
    }
    
    class SendButtonListener implements ActionListener{
 
        @Override
        public void actionPerformed(ActionEvent e) {
            try{
                writer.println(outgoing.getText());
                writer.flush();
                
            }catch(Exception ex){
                ex.printStackTrace();
            }
            
            outgoing.setText("");
            outgoing.requestFocus();
        }
        
    }
    
    class IncomingReader implements Runnable{
 
        @Override
        public void run() {
            String message;
            try{
                
                while((message = reader.readLine()) != null){
                    /*
                     * поток вхожит в цикл, пока ответ сервера не будет ровняться нулю
                     */
                    System.out.println("Пришло сообщение "+message);
                    incoming.append(message+"\n");
                }
                
            }catch(Exception ec){
                ec.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
public class MainActivity extends ActionBarActivity {
    
    EditText tvField;
    ListView lView;
    Socket sock;
    BufferedReader reader;
    PrintWriter writer;
    ArrayList<String> messange = new ArrayList<String>();
    ArrayAdapter<String>adapter;
    
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
 
        lView = (ListView)findViewById(R.id.list_view);
        tvField = (EditText)findViewById(R.id.editText1);
        
        setUpNetworking();
        
        /*поток отвечает за прием сообщений от сервера*/
        Thread readThread = new Thread(new IncomingReader());
        readThread.start();
        
        //создаем массив для хранения строк
        messange = new ArrayList<String>();
 
        
        //создаем адаптер, чтобы привязать ListView к массиву объектов
        
      
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, messange);
        
        //привязываем ListView к адаптеру
        lView.setAdapter(adapter);
        
        //прослушиваем нажатия клавиш (по нажатию клавиши enter добавляем в ListView)
        tvField.setOnKeyListener(new OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN)
                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
                        // по нажатию enter отправляем данные на сервер
                        try{
                        writer.println(tvField.getText());
                        writer.flush();
                        
                    }catch(Exception ex){
                        ex.printStackTrace();
                    }
                        
                         tvField.setText("");
                         
                        /*
                         messange.add(0, tvField.getText().toString());
                        adapter.notifyDataSetChanged();
                        tvField.setText("");
                        */
                        return true;
                    }
                return false;
            }
        });
    }
        
        public void setUpNetworking(){
   /*
    * метод устанавливает соединение с сервером
    */
            try{
                sock = new Socket("192.168.0.101", 5000);
                InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(streamReader);
                writer = new PrintWriter(sock.getOutputStream());
                Toast t = Toast.makeText(getApplicationContext(), "Соединение установлено....", Toast.LENGTH_SHORT);
                t.show();
                //System.out.println("Соединение установленно...");
            }catch(Exception e){
                Toast to = Toast.makeText(getApplicationContext(), "Ошибка подключения", Toast.LENGTH_SHORT);
                to.show();
                e.printStackTrace();
            }
            
    }
    
    class IncomingReader implements Runnable{
 
        @Override
        public void run() {
            String message;
            try{
                
                while((message = reader.readLine()) != null){
                    /*
                     * поток входит в цикл, пока ответ сервера не будет ровняться нулю
                     */
                     messange.add(message);
                        adapter.notifyDataSetChanged();
                }
                
            }catch(Exception ec){
                ec.printStackTrace();
            }
            
        }
        
    }
 }
буду очень благодарен за помощь)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
20.10.2014, 08:24     Клиент-серверное приложение #2
iandryxa5, в отладчике смотрели в messange все строки есть? И еще такое возможно, один раз не доглядел, что у listView высота стоит wrap_content и он получается высотой с один элемент и кажется что он там всего один, но можно покрутить и остальные тоже оказываются там)
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
20.10.2014, 09:46     Клиент-серверное приложение #3
iandryxa5, честно говоря, лень смотреть код.
Если не ошибаюсь, у меня однажды была такая проблема. К ListView был добавлен Header, а в нём отображалась всегда одна запись. Помогала установка высоты Header в фиксированный размер (например, 200dp), но это неправильно.
Долго искал по stackoverflow, но так и не решил.
Пришлось избавиться от Header совсем, он оказался не нужен.

Добавлено через 7 минут
Присоединяюсь к вопросу: в messange все строки на месте?
А почему выбран такой способ чтения с сервера? Можно, например, сначала все строки прочитать (крутить progressbar), а затем отобразить.
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 168
20.10.2014, 17:46  [ТС]     Клиент-серверное приложение #4
CoolMind, хорошо спасибо за помощь)
Я андройд недавно изучаю, в основном java, этот сервер-клиент мы на занятии по java делали, вот я и решил подогнать его под андройд, если не сложно можно подкинуть инфы по адройду, относительно клиент-сервера?

Добавлено через 9 минут
CoolMind, И да кстате по ходу возник еще один вопрос, когда проверяю через эмулятор все работает нормально, поток подключается к серверу, однако при тестировании на реальном устройстве вылетает исключение, в чем может быть проблема?
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
20.10.2014, 17:47     Клиент-серверное приложение #5
Цитата Сообщение от iandryxa5 Посмотреть сообщение
Java
1
messange.add(message);
После этой строки добавьте запись в лог значения message. И посмотрите все ли там отобразиться.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
20.10.2014, 18:04     Клиент-серверное приложение #6
iandryxa5, а можете привести текст ошибки (из LogCat)? Такое, в принципе, возможно. У Андроида всё возможно. У нас вон, приложение стабильно падает то на Самсунгах (в одних местах), то на LG, то на Fly (в других).
Ссылок подкинуть не могу, т.к. по клиент-серверу на Java знаю меньше вас. Мы обычно обмениваемся JSON-пакетами, а на клиенте распознаём и добавляем в ListView.
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 168
20.10.2014, 18:26  [ТС]     Клиент-серверное приложение #7
CoolMind,
то есть протестировать на реальном устройстве(через функцию для "Для разработчиков")?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2014, 22:25     Клиент-серверное приложение
Еще ссылки по теме:

Android Клиент-сервер приложение для android
Android Своеобразное приложение по типу клиент-сервер
Android Клиент-серверное приложение android
Клиент-серверное приложение Android
Android Клиент-серверное приложение - посоветуйте архитектуру

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

Или воспользуйтесь поиском по форуму:
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
20.10.2014, 22:25     Клиент-серверное приложение #8
iandryxa5, да, разумеется, всё лучше делать на реальном устройстве.
Yandex
Объявления
20.10.2014, 22:25     Клиент-серверное приложение
Ответ Создать тему
Опции темы

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