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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
андрейка12
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 9
04.03.2014, 17:38     Клиент-серверное приложение #1
Всем привет,

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

Проблема: запускаю клиент и вылетает при подключении.

Сам компьютер подключён к wi-fi роутеру. Такое чувство, что пытаюсь подключится к неправильному ip.
Может, кто-нибудь что-нибудь подскажет?

Сервер:

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
public class Server extends Thread
{
    // Create the server socket channel
    protected ServerSocketChannel server;
    protected java.nio.channels.Selector selector;
 
    
    public Server()
    {
        try
        {
            server = ServerSocketChannel.open();
            // nonblocking I/O
            server.configureBlocking(false);
            server.socket().bind(new java.net.InetSocketAddress("192.168.0.28",5000));
            selector = java.nio.channels.Selector.open();
            // Recording server to selector (type OP_ACCEPT)
            server.register(selector,SelectionKey.OP_ACCEPT);
            server.register(selector,SelectionKey.OP_ACCEPT);
            System.out.println(server.socket().getInetAddress().getHostAddress());
        }
        catch (IOException e)
        {
            fail(e, "Could not start server.");
        }
        System.out.println("Server is running . . .");
        this.start();
    }
    
    
    public static void fail(Exception e, String str)
    {
        System.out.println(str + "." + e);
    }
    
    public void run()
    {
        try
        {
            while (true)
            {
                // Waiting for events
                selector.select();
                // Get keys
                Set keys = selector.selectedKeys();
                Iterator i = keys.iterator();
 
                 // For each keys...
                while(i.hasNext()) 
                {
                    SelectionKey key = (SelectionKey) i.next();
                    // Remove the current key
                    i.remove();
                    // if isAccetable = true
                    // then a client required a connection
                    if (key.isAcceptable()) 
                    {
                          // get client socket channel
                          SocketChannel client = server.accept();
                          // Non Blocking I/O
                          client.configureBlocking(false);
                          // recording to the selector (reading)
                          client.register(selector, SelectionKey.OP_READ);
                          Connection con = new Connection(client.socket());
                    }
                }
            }
        }
        catch (IOException e)
        {
            fail(e, "Not listening");
        }
    }
    
    
    public static void main(String args[])
    {
        new Server();
    }
}
 
class Connection extends Thread 
{
    /* Declare the variables */
    protected Socket clientSocket;
    protected ObjectInputStream fromClient;
    protected ObjectOutputStream toClient;
    
    
    public Connection(Socket client)
    {
        clientSocket = client;
        try
        {
            fromClient = new ObjectInputStream(clientSocket.getInputStream()); //
            toClient = new ObjectOutputStream(clientSocket.getOutputStream()); //
        }
        catch (IOException e)
        {
            try
            {
                clientSocket.close();
            }
            catch (IOException exeption)
            {
                System.err.println("Unable to set up streams " + exeption);
                return;
            }
        }
        /* Start the thread */
        this.start();
    }
    
    public void run()
    {
        String message;
        try
        {
            while (true)
            {
                message = fromClient.readLine();
                /* Завершить соединение, когда Bye вводится как login */
                System.out.println(clientSocket.getInetAddress().getHostName()+ ": " + message);
 
            }
        } 
        catch (IOException e)
        {
            System.out.println(e);
        }
        finally
        {
            try
            {
                clientSocket.close();
            }
            catch (IOException e)
            {
            }
        }
    }
}

Клиент:

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
public class MainActivity extends Activity implements OnClickListener{
 
    private OutputStream outputStream;
    private EditText message;
    private Button button;
    private Button button_disconect;
    private final String host="192.168.0.28";
    private final int port=5000;
    private byte buffer[] = new byte[1024];
    protected Socket socket;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
        message = (EditText)findViewById(R.id.fieldForMessage);
        button = (Button)findViewById(R.id.button);
        button_disconect = (Button)findViewById(R.id.disconect_button);
        socket = new Socket();
        
        try {
            socket.bind(null);
            socket.connect((new InetSocketAddress(host,port)), 500);
            socket.setKeepAlive(true);
 
            /**
             * Create a byte stream from a JPEG file and pipe it to the output stream
             * of the socket. This data will be retrieved by the server device.
             */
            outputStream = socket.getOutputStream();
            
        }
        
        
        
        catch (FileNotFoundException e) 
        {
            //catch logic
        }
        catch (IOException e)
        {
            //catch logic
        }
        
        
        
        /**
         * Clean up any open sockets when done
         * transferring or if an exception occurred.
         */
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.button:
            String str = message.getText().toString();
            int len = str.length();
            buffer = str.getBytes();
            if (len != 0)
            {
                try 
                {
                    outputStream.write(buffer, 0, len);
                } 
                catch (IOException e)
                {
                }
            
            }
        case R.id.disconect_button:     
            if (socket != null) {
                if (socket.isConnected()) {
                    try {
                            socket.close();
                        } catch (IOException e) {
                            //catch logic
                        }
                    }
                }
        }
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 17:38     Клиент-серверное приложение
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.03.2014, 17:49     Клиент-серверное приложение #2
Цитата Сообщение от андрейка12 Посмотреть сообщение
запускаю клиент и вылетает при подключении.
лог ошибки приложить забыли.
андрейка12
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 9
04.03.2014, 18:02  [ТС]     Клиент-серверное приложение #3
Лог:

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
03-04 18:01:04.195: E/AndroidRuntime(1469): FATAL EXCEPTION: main
03-04 18:01:04.195: E/AndroidRuntime(1469): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appclient/com.example.appclient.MainActivity}: android.os.NetworkOnMainThreadException
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread.access$700(ActivityThread.java:159)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.os.Looper.loop(Looper.java:176)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread.main(ActivityThread.java:5419)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invokeNative(Native Method)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invoke(Method.java:525)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at dalvik.system.NativeStart.main(Native Method)
03-04 18:01:04.195: E/AndroidRuntime(1469): Caused by: android.os.NetworkOnMainThreadException
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1144)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.net.InetAddress.getLocalHost(InetAddress.java:365)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:188)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at java.net.Socket.connect(Socket.java:842)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at com.example.appclient.MainActivity.onCreate(MainActivity.java:43)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.Activity.performCreate(Activity.java:5372)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
03-04 18:01:04.195: E/AndroidRuntime(1469):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
03-04 18:01:04.195: E/AndroidRuntime(1469):     ... 11 more
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.03.2014, 18:09     Клиент-серверное приложение #4
android.os.NetworkOnMainThreadException
Java
1
socket = new Socket();
так нельзя делать в основном потоке.

http://habrahabr.ru/post/145092/
http://habrahabr.ru/post/124484/
андрейка12
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 9
04.03.2014, 18:48  [ТС]     Клиент-серверное приложение #5
А можете выложить пример, как лучше сделать?
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.03.2014, 18:54     Клиент-серверное приложение #6
андрейка12, написать я не могу, но могу дать общие рекомендации.
Если соединение с сервером должно быть постоянным, то лучше всего создать сервис, в котором клиент будет обмениваться данными с сервером, коннект и дисконнект будут там же.
Пример можно найти здесь:
http://startandroid.ru/ru/uroki/vse-...prostoj-primer

Если соединение "одноразовое", т.е. клиент соединился, отправил данные, получил ответ и отключился, то лучше использовать AsyncTask или простой Thread.
Yandex
Объявления
04.03.2014, 18:54     Клиент-серверное приложение
Ответ Создать тему
Опции темы

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