I have a tested server on ESP8266 with loopback and a tcp client app that doesn't send messages. I also tested it on a server that tells you if there is somebody connected and it says that it connects.
The "chat" textView
shows the message when I click send.
For example: Client: message
, but it doesn't send it to the server for it to loop it back.
What should I change for it so send and receive messages?
Client
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)
{
}
}
}
}
You are trying to create a new Socket
connection on same port in sentThread
. First connection is created in ClientThread
class and when you are pressing sent
button you are creating another Socket
connection on same port 502
. I think that's is the main problem.
Try to use existing Socket
connection in sentThread
class.
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)
{
}
}
}
Edit:
You you want to send multiple message then don't close DataOutputStream
. Remove os.close();
and os = new DataOutputStream(socket.getOutputStream());
line from sentMessage
class.
Initialize your os
when you are connecting first time. Then every time you want to send message use that os
instance.
In ClientThread
class initialize os
after connection created
socket = new Socket(serverAddr, 502);
os = new DataOutputStream(socket.getOutputStream());