Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Arion32
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
#1

Проверка Socket на наличие соединения - Программирование Android

14.11.2016, 14:37. Просмотров 365. Ответов 6
Метки нет (Все метки)

Помогите сделать проверку сокета перед подключением.

Java
1
2
3
4
5
6
7
8
9
public void onClick(View view) {
if (socket.isClosed()) {
socket = new Socket(ip, port);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
}
else {
socket.close();
}
что не так?(

Добавлено через 4 минуты
или как сделать правильнее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2016, 14:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверка Socket на наличие соединения (Программирование Android):

Каким способом вы определяете наличие соединения с интернетом
Знаю весь интернет кишит примерами... Но вот каким "хорошим", оптимальным...

Проверка интернет соединения
Как же всё-таки прописать грамотную проверку интернет соединения? Необходимо...

Проверка интернет соединения
Добрый день , я хотел бы проверить интернет соединение , у меня уже есть...

Проверка наличия интернет соединения
Если в public void onStart() { super.onStart(); } ...

Проверка качества соединения с сайтом
Иногда приложение падает при коннекте к сайту. Причем происходит это только на...

Проверка соединения с сайтом через HttpUrlConnection
я нашла кучу информации, где после подключения что-либо выдает. Как написать...

6
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
14.11.2016, 14:39 #2
разрешение на INTERNET есть в манифесте?
0
Arion32
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
14.11.2016, 14:46  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
разрешение на INTERNET есть в манифесте?
есть
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
14.11.2016, 14:56 #4
чем докажешь?
да и вообще, в чем собственно проблема? а то из первого сообщения непонятно что ты хочешь
0
Arion32
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
14.11.2016, 15:05  [ТС] #5
<uses-permission android:name="android.permission.INTERNET" />

я хочу чтобы при нажатии кнопки у меня сначала проверялось - есть ли сокет. и если его нет то сокет создается. если есть сокет закрывается.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
15.11.2016, 10:16 #6
Arion32, если сокет есть (не null) - значит есть подключение. если во время работы с сокетом зафиксированы ошибки считаем что подключение прервано и присваиваем сокету null предварительно его закрыв конечно же
1
zoleg
27 / 27 / 5
Регистрация: 10.01.2012
Сообщений: 285
15.11.2016, 10:44 #7
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
public class TcpClient {
 
    public static String SERVER_IP = MutTempoDate.TCP_SERVER; //Server IP address
    public static int SERVER_PORT = Integer.valueOf(MutTempoDate.TCP_SER_PORT);//Server port
    // message to send to the server
    private String mServerMessage;
    // sends message received notifications
    private OnMessageReceived mMessageListener = null;
    // while this is true, the server will continue running
    private boolean mRun = false;
    // used to send messages
    private PrintWriter mBufferOut;
    // used to read messages from the server
    private BufferedReader mBufferIn;
    private Socket socket;
    public static boolean normal_close=false;
 
    /**
     * Constructor of the class. OnMessagedReceived listens for the messages received from server
     */
    public TcpClient(OnMessageReceived listener) {
 
        mMessageListener = listener;
    }
 
    /**
     * Close the connection and release the members
     */
 
    @Subscriber(tag = "TCP_SEND_MSG")
    private void updateEvents(EventTcpMessage event) {
 
        if (event.message.equals("disconnect")) {
            normal_close = true;
            mRun = false;
            Log.e(TetGlobalData.TAG,"!!!!!!!!!!! STOPING CLIENT !!!!!!!!!!!!!!!!!");
            stopClient();
        } else {
            Log.d(TetGlobalData.TAG, "updateEvents TcpClient/sendMessage=" + event.message);
            if (mBufferOut != null && !mBufferOut.checkError()) {
                mBufferOut.println(event.message);
                mBufferOut.flush();
                //sends the message to the server
 
        }
 
    }
    }
 
    public boolean stopClient() {
 
 
        mRun = false;
 
        try {
            socket.close();
        } catch (IOException e) {
            Log.d(TetGlobalData.TAG,"TcpClient stopClient() IOException e");
            e.printStackTrace();
        }
 
        if (mBufferOut != null) {
            mBufferOut.flush();
            mBufferOut.close();
        }
 
        mMessageListener = null;
        mBufferIn = null;
        mBufferOut = null;
        mServerMessage = null;
        normal_close = true;
       // mMessageListener.messageReceived("shutdown");
        return true;
    }
 
    public void run() {
 
        Log.e(TetGlobalData.TAG,"!!!!!!!!!!!!!! New run TcpClient !!!!!!!!!!!!");
 
        mRun = true;
        EventBus.getDefault().register(this);
 
        TetTempoDate.tcpCl = this;
 
        try {
            //here you must put your computer's IP address.
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
 
            Log.e("TcpClient", "A: Connecting...");
 
            //create a socket to make the connection with the server
            socket = new Socket(serverAddr, SERVER_PORT);
 
 
            try {
 
//                //sends the message to the server
//                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
 
                //receives the message which the server sends back
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //sendMessage("variable_ATS-Command: Hellow\n\n");
                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                //in this while the client listens for the messages sent by the server
                while (mRun) {
 
                    mServerMessage = mBufferIn.readLine();
 
                    if (mServerMessage != null && mMessageListener != null) {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(mServerMessage);
                    }
 
                }
                if (mServerMessage != null || mMessageListener != null){
                    String message = "CON_OK";
                    EventBus.getDefault().post(new EventTcpMessage(message), "for_ConnectTask");
 
                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");
                }
                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
 
            } catch (Exception e) {
                if(mRun) {
                    Log.e("TcpClient", "B: Error", e);
                }
                else{
                    Log.d("TcpClient", "BB: Closed", e);
                    if(!normal_close) {
                        String message = "CON_FAIL";
                        EventBus.getDefault().post(new EventTcpMessage(message), "for_ConnectTask");
                    }
                }
 
            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
               // stopClient();
 
            }
 
 
        } catch (Exception e) {
 
            Log.e("TcpClient", "C: Error", e);
 
            if (normal_close != true){
            String message = "CON_FAIL";
            EventBus.getDefault().post(new EventTcpMessage(message), "for_ConnectTask");
//            stopClient();
            }
        }
Не применяйте код "напрямую". Тут при коннекте ПЕРВЫМ СЕРВЕР, а не клиент, посылает сообщение о том что он готов принять запрос, и только потом клиент скидывает запрос. Просто махните местами прием->передача и все станет как вам надо.
1
15.11.2016, 10:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2016, 10:44
Привет! Вот еще темы с решениями:

Проверка строки на наличие букв и символов
Добрый вечер! Как в android проверить editText на наличие букв и символов?...

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение....

Проверка на наличие соединения с БД
Добрый день! Использую DbX, класс TSQLConnection. Каким образом можно...

Потеря соединения TClient Socket - TServer Socket
После коннекта клиента к серверу минут 20 соединение живёт и клиенты получают...


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

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

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