У меня есть клиентское соединение с сервером, и я пытаюсь прочитать сообщения, отправленные сервером. Я могу отправить сообщение на сервер, но когда я пытаюсь прочитать сообщения в своем приложении, я не знаю, как читать это сообщение. Мой сервер - это модуль ESP8266.
Я могу отправить сообщение с помощью этого модуля, но я не знаю, как прочитать это сообщение в Main3Activity.
Это код, который я использую:
public class Main3Activity extends AppCompatActivity {
public static String data = " ";
Socket client;
SocketAddress socketAddress;
OutputStream outputStream;
String ServerIP = "192.168.1.1";
int ServerPort = 8888;
String message;
public final static String msg = null;
public int i;
EditText et_ServerIP, et_ServerPort;
TextView tv_DataSendRecive, info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
tv_DataSendRecive = (TextView) findViewById(R.id.tv_DataSendRecive);
info = (TextView) findViewById(R.id.info);
et_ServerIP = (EditText) findViewById(R.id.et_ServerIP);
et_ServerPort = (EditText) findViewById(R.id.et_ServerPort);
}
public void onClick_btn_Send(View v) {
switch (v.getId()) {
case R.id.led_2:
message = "2 led\n";
break;
case R.id.led_1:
message = "1 led\n";
break;
case R.id.led_4:
message = "4 led\n";
break;
case R.id.led_3:
message = "3 led\n";
break;
case R.id.led_6:
message = "6 led\n";
break;
case R.id.led_5:
message = "5 led\n";
break;
case R.id.led_8:
message = "8 led\n";
break;
case R.id.led_7:
message = "7 led\n";
default:
return;
}
tv_DataSendRecive.append(" " + message);
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerIP = et_ServerIP.getText().toString();
ServerPort = Integer.parseInt(et_ServerPort.getText().toString());
if (i == 0) {
socketAddress = new InetSocketAddress(ServerIP, ServerPort);
client = new Socket();
try {
client.connect(socketAddress);
} catch (IOException e1) {
e1.printStackTrace();
}
i = 1;
}
if (client.isConnected()) {
// ShowToast( "Client is Connected." );
try {
outputStream = client.getOutputStream();
} catch (IOException e1) {
e1.printStackTrace();
}
byte[] bytes = message.getBytes();
try {
outputStream.write(bytes);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
outputStream.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
///////// outputStream.close();\\\\\\\\\\\\\\\\\\\\\
} else {
ShowToast("Client is Not Connected.");
}
//////////////////// client.close(); \\\\\\\\\\\\\\\\\\\
} catch (final Exception e) {
ShowToast(e.toString());
}
}
}).start();
}
public void ShowToast(final String Data) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), Data, Toast.LENGTH_LONG).show();
}
});
}
}
И это мой класс TCPClient
public class TCPClient {
public static String SERVER_IP;
public static int SERVER_PORT;
private String mServerMessage; // message to send to the server
private OnMessageReceived mMessageListener = null; // sends message received notifications
private boolean mRun = false; // while this is true, the server will continue running
private PrintWriter mBufferOut; // used to send messages
public static BufferedReader mBufferIn; // used to read messages from the server
Socket socket;
public TCPClient(OnMessageReceived listener, String IP, String Port) {
mMessageListener = listener;
SERVER_IP = IP;
SERVER_PORT = Integer.parseInt(Port);
}
public void sendMessage(String message) {
if (socket == null || !socket.isConnected()) {
Log.e("313", "Socket Not Connected / Init !!!");
return;
}
if (mBufferOut != null && !mBufferOut.checkError()) {
mBufferOut.println(message);
mBufferOut.flush();
}
}
public void stopClient() {
mRun = false; //////////////////////mRun must be false///////////////////////////
if (mBufferOut != null) {
mBufferOut.flush();
mBufferOut.close();
}
mMessageListener = null;
mBufferIn = null;
mBufferOut = null;
mServerMessage = null;
}
public void run() {
try {
// Creates a stream socket and connects it to the specified port number at the specified IP address
socket = new Socket(InetAddress.getByName(SERVER_IP), 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()));
mRun = true;
while (mRun) { // in this while the client listens for the messages sent by the server
mServerMessage = mBufferIn.readLine();
if (mServerMessage != null && mMessageListener != null) {
mMessageListener.messageReceived(mServerMessage); // call the method messageReceived from MyActivity class
}
}
} catch (Exception e) {} 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.
socket.close();
}
} catch (Exception e) {}
}
public interface OnMessageReceived {
public void messageReceived(String message) throws IOException;
}
public boolean isConnected() {
if (socket == null) return false;
if (socket.isConnected()) return true;
else return false;
}
}
Я думаю, что OP говорит о программировании сокетов. Общая идея получения сообщения на стороне клиента такая же, как и на стороне сервера. Создайте бесконечный цикл, получите поток и разбейте его на данные по разделителю. Вам не нужно создавать заново с нуля, я уверен, что есть библиотеки, которые могут сделать это за вас, например, leaks.wanari.com/2017/08/29/using-websocket-android.
Я использую библиотеку Volley, но не знаю, как получить данные с сервера и показать это в своем приложении.
используйте сторонние библиотеки, Модернизация, залп или ..... Они просты и обеспечивают производительность вашего приложения.