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

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

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

Клиент-серверное приложение - Программирование Android

20.10.2014, 02:26. Просмотров 725. Ответов 7
Метки нет (Все метки)

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

Клиент-серверное приложение - Программирование Android
Всем привет, Пытаюсь написать клиент-серверное приложение для android. Логика следующая: android устройство подключается к серверу,...

Клиент серверное приложение - Программирование Android
Разрабатываю клиент серверное приложение, отправка текста в одну сторону, от клиента серверу, аля чат. Подскажите, как реализовать...

Клиент-серверное приложение - Программирование Android
Идея такова: Мы со смартфона перехватываем handshake от какой-то wifi сети (это происходит с помощью другого приложения) и передаем его на...

Клиент-серверное приложение android - Программирование Android
Ребят, такая задача: Необходимо, чтобы пользователь1 мог отправлять сообщение со своего приложения на телефоне/компьютере на другое...

Клиент-серверное приложение с чатом - Программирование Android
Добрый вечер! Собираюсь писать многопользовательское клиент-серверное приложения для Android. Проблема в том, что я не знаю как...

Клиент-серверное приложение android - Программирование Android
Каким образом можно создать приложение для передачи данных через интернет? Одно устройство выступает в роли сервера, а второе - клиент.

7
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
20.10.2014, 08:24 #2
iandryxa5, в отладчике смотрели в messange все строки есть? И еще такое возможно, один раз не доглядел, что у listView высота стоит wrap_content и он получается высотой с один элемент и кажется что он там всего один, но можно покрутить и остальные тоже оказываются там)
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
20.10.2014, 09:46 #3
iandryxa5, честно говоря, лень смотреть код.
Если не ошибаюсь, у меня однажды была такая проблема. К ListView был добавлен Header, а в нём отображалась всегда одна запись. Помогала установка высоты Header в фиксированный размер (например, 200dp), но это неправильно.
Долго искал по stackoverflow, но так и не решил.
Пришлось избавиться от Header совсем, он оказался не нужен.

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

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

Простое Клиент-Серверное приложение - Программирование Android
Добрый день, начал осваивать андройд, и застопорился на некоторых моментах, вернее, Оно почему-то не работает, просто не коннектит к...

Клиент-серверное приложение - посоветуйте архитектуру - Программирование Android
Всем доброго времени суток. Пишу клиент-серверное приложение с нуля, поэтому вопросов куча) Это уже вторая тема (первая...

Клиент-серверное приложение. Не могу получить ip - Программирование Android
private String getIpAddress() { String ip = &quot;&quot;; try { Enumeration&lt;NetworkInterface&gt; enumNetworkInterfaces...

Android клиент-серверное приложение. Не могу получить данные с сервера - Программирование Android
Добрый день. Пытаюсь сделать клиент-серверное приложение: клиент Android, сервер - Windows, программа на Java. Проблема в том, что с...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
20.10.2014, 22:25
Ответ Создать тему
Опции темы

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