У меня есть протестированный сервер на ESP8266 с обратной связью и клиентское приложение tcp, которое не отправляет сообщения. Я также протестировал его на сервере, который сообщает вам, подключен ли кто-нибудь, и сообщает, что он подключается.
"Чат" textView показывает сообщение, когда я нажимаю "Отправить".
Например: Client: message, но он не отправляет его на сервер, чтобы он вернул его обратно.
Что я должен изменить для этого, чтобы отправлять и получать сообщения?
Клиент
package com.example.tinemasilo.researchgate_sockettut;
import android.app.Activity;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
public class MainActivity extends Activity
{
static EditText serverIp,smessage;
static TextView chat;
static Button connectPhones,disconnectPhones,sent;
static String serverIpAddress = "",msg = "",str;
Handler handler = new Handler();
//static InetAddress serverAddr;
static Socket socket;
static DataOutputStream os;
//static DataInputStream in;
static BufferedReader in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chat = (TextView) findViewById(R.id.chat);
serverIp = (EditText) findViewById(R.id.server_ip);
smessage = (EditText) findViewById(R.id.smessage);
sent = (Button) findViewById(R.id.sent_button);
connectPhones = (Button) findViewById(R.id.connectPhones);
disconnectPhones = (Button) findViewById(R.id.disconnectPhones);
connectPhones.setEnabled(true);
connectPhones.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
connectPhones.setEnabled(false);
disconnectPhones.setEnabled(true);
serverIpAddress = serverIp.getText().toString();
//try
//{
// InetAddress.getByName(serverIpAddress);
// serverAddr.getByName(serverIpAddress);
// socket = new Socket(serverAddr, 10000);
//}
// catch (IOException e)
//{
//}
if (!serverIpAddress.equals(""))
{
Thread clientThread = new Thread(new ClientThread());
clientThread.start();
}
}
});
sent.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Thread sentThread = new Thread(new sentMessage());
sentThread.start();
}
});
disconnectPhones.setEnabled(false);
disconnectPhones.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
connectPhones.setEnabled(true);
disconnectPhones.setEnabled(false);
try
{
socket.close();
}
catch (IOException e)
{
}
}
});
}
public class ClientThread implements Runnable
{
public void run()
{
try
{
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
//serverAddr.getByName(serverIpAddress);
socket = new Socket(serverAddr, 502);
while(true)
{
//InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
//serverAddr.getByName(serverIpAddress);
//socket = new Socket(serverAddr, 10000);
//in = new DataInputStream(socket.getInputStream());
in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = in.readLine()) != null)
{
msg = msg + "Server : " + line + "\n";
handler.post(new Runnable()
{
@Override
public void run()
{
chat.setText(msg);
}
});
}
in.close();
Thread.sleep(100);
}
}
catch (Exception e)
{
}
}
}
class sentMessage implements Runnable
{
@Override
public void run()
{
try
{
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
//serverAddr.getByName(serverIpAddress);
socket = new Socket(serverAddr, 502);
os = new DataOutputStream(socket.getOutputStream());
str = smessage.getText().toString();
str = str + "\n";
msg = msg + "Client : " + str;
handler.post(new Runnable()
{
@Override
public void run()
{
chat.setText(msg);
}
});
os.writeBytes(str);
os.flush();
os.close();
}
catch(IOException e)
{
}
}
}
}
ваш сервер поддерживал множественное соединение?
socket = new Socket(serverAddr, 502); У вас есть это дважды. При втором вызове вы отбрасываете ссылку на свой первый сокет. Итак, вы создаете двух клиентов. Теперь сервер может обрабатывать двух клиентов? (Спрашивали раньше).
Почему вы объявляете все поля статическими? Сделайте их приватными.
Значит, мне нужно поставить сокет как глобальный?




Вы пытаетесь создать новое соединение Socket на том же порту в sentThread. Первое соединение создается в классе ClientThread, и когда вы нажимаете кнопку sent, вы создаете другое соединение Socket на том же порте 502. Думаю, это основная проблема.
Попробуйте использовать существующее соединение Socket в классе sentThread.
class sentMessage implements Runnable
{
@Override
public void run()
{
try
{
//InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
//serverAddr.getByName(serverIpAddress);
// socket = new Socket(serverAddr, 502);
// os = new DataOutputStream(socket.getOutputStream());
str = smessage.getText().toString();
str = str + "\n";
msg = msg + "Client : " + str;
handler.post(new Runnable()
{
@Override
public void run()
{
chat.setText(msg);
}
});
os.writeBytes(str);
os.flush();
//os.close();
}
catch(IOException e)
{
}
}
}
Редактировать:
Если вы хотите отправить несколько сообщений, не закрывайте DataOutputStream. Удалите линии os.close(); и os = new DataOutputStream(socket.getOutputStream()); из класса sentMessage.
Инициализируйте os при первом подключении. Затем каждый раз, когда вы хотите отправить сообщение, используйте этот экземпляр os.
В классе ClientThread инициализировать os после создания соединения
socket = new Socket(serverAddr, 502);
os = new DataOutputStream(socket.getOutputStream());
Не работает, и я могу отправить только одно сообщение, если я хочу отправить другое, мне нужно закрыть соединение и снова подключиться.
Попробуйте отладить, чтобы найти проблему
Обновленный ответ, пожалуйста, проверьте
Я изменил код, как вы сказали при редактировании, и теперь он работает. Спасибо!
Уточните, пожалуйста, в чем ваш вопрос.