I use this (improved TCP TCP connection) to create a simple JAVA TCPServer and Android TCPClient. It works fine, but with this code I can only connect one device to the server at a time. What do I need to change to connect to multiple devices?
JAVA Server: Constants
public class Constants {
public static final String CLOSED_CONNECTION = "kazy_closed_connection";
public static final String LOGIN_NAME = "kazy_login_name";
}
JAVA Server: MainScreen
public class MainScreen extends JFrame {
private static final long serialVersionUID = 8399514248326995812L;
private JTextArea messagesArea;
private JButton sendButton;
private JTextField message;
private JButton startServer;
private JButton stopServer;
private TcpServer mServer;
public MainScreen() {
super("MainScreen");
JPanel panelFields = new JPanel();
panelFields.setLayout(new BoxLayout(panelFields, BoxLayout.X_AXIS));
JPanel panelFields2 = new JPanel();
panelFields2.setLayout(new BoxLayout(panelFields2, BoxLayout.X_AXIS));
messagesArea = new JTextArea();
messagesArea.setColumns(30);
messagesArea.setRows(10);
messagesArea.setEditable(false);
sendButton = new JButton("Send");
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String messageText = message.getText();
messagesArea.append("\n" + messageText);
if (mServer != null) {
mServer.sendMessage(messageText);
}
message.setText("");
}
});
startServer = new JButton("Start");
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mServer = new TcpServer(new TcpServer.OnMessageReceived() {
@Override
public void messageReceived(String message) {
messagesArea.append("\n " + message);
}
});
mServer.start();
startServer.setEnabled(false);
stopServer.setEnabled(true);
}
});
stopServer = new JButton("Stop");
stopServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (mServer != null) {
mServer.close();
}
startServer.setEnabled(true);
stopServer.setEnabled(false);
}
});
message = new JTextField();
message.setSize(200, 20);
panelFields.add(messagesArea);
panelFields.add(startServer);
panelFields.add(stopServer);
panelFields2.add(message);
panelFields2.add(sendButton);
getContentPane().add(panelFields);
getContentPane().add(panelFields2);
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
setSize(300, 170);
setVisible(true);
}
}
JAVA Server: TcpServer
public class TcpServer extends Thread {
public static final int SERVERPORT = 4444;
private boolean running = false;
private PrintWriter bufferSender;
private OnMessageReceived messageListener;
private ServerSocket serverSocket;
private Socket client;
public TcpServer(OnMessageReceived messageListener) {
this.messageListener = messageListener;
}
public static void main(String[] args) {
MainScreen frame = new MainScreen();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public void close() {
running = false;
if (bufferSender != null) {
bufferSender.flush();
bufferSender.close();
bufferSender = null;
}
try {
client.close();
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("S: Done.");
serverSocket = null;
client = null;
}
public void sendMessage(String message) {
if (bufferSender != null && !bufferSender.checkError()) {
bufferSender.println(message);
bufferSender.flush();
}
}
public boolean hasCommand(String message) {
if (message != null) {
if (message.contains(Constants.CLOSED_CONNECTION)) {
messageListener.messageReceived(message.replaceAll(
Constants.CLOSED_CONNECTION, "")
+ " disconnected");
close();
runServer();
return true;
} else if (message.contains(Constants.LOGIN_NAME)) {
messageListener.messageReceived(message.replaceAll(
Constants.LOGIN_NAME, "") + " connected");
return true;
}
}
return false;
}
private void runServer() {
running = true;
try {
System.out.println("S: Connecting...");
serverSocket = new ServerSocket(SERVERPORT);
client = serverSocket.accept();
System.out.println("S: Receiving...");
try {
bufferSender = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
while (running) {
String message = null;
try {
message = in.readLine();
} catch (IOException e) {
System.out.println("Error reading message: "
+ e.getMessage());
}
if (hasCommand(message)) {
continue;
}
if (message != null && messageListener != null) {
messageListener.messageReceived(message);
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
runServer();
}
public interface OnMessageReceived {
public void messageReceived(String message);
}
}
Android Client: TCPClient
public class TCPClient {
public static final String SERVER_IP = "192.168.0.102";
public static final int SERVER_PORT = 4444;
private String mServerMessage;
private OnMessageReceived mMessageListener = null;
private boolean mRun = false;
private PrintWriter mBufferOut;
private BufferedReader mBufferIn;
private String uid;
public TCPClient(OnMessageReceived listener) {
mMessageListener = listener;
}
public void sendMessage(String message) {
if (mBufferOut != null && !mBufferOut.checkError()) {
mBufferOut.println(message);
mBufferOut.flush();
}
}
public void stopClient() {
TelephonyManager tManager = (TelephonyManager) MyApplication.getInstance().getSystemService(Context.TELEPHONY_SERVICE);
uid = tManager.getDeviceId();
sendMessage(Constants.CLOSED_CONNECTION + "id: " + uid);
mRun = false;
if (mBufferOut != null) {
mBufferOut.flush();
mBufferOut.close();
}
mMessageListener = null;
mBufferIn = null;
mBufferOut = null;
mServerMessage = null;
}
public void run() {
mRun = true;
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
MyLog.e("TCP Client", "C: Connecting...");
Socket socket = new Socket(serverAddr, SERVER_PORT);
try {
mBufferOut = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
mBufferIn = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
TelephonyManager tManager = (TelephonyManager) MyApplication.getInstance().getSystemService(Context.TELEPHONY_SERVICE);
uid = tManager.getDeviceId();
sendMessage(Constants.LOGIN_NAME + "id: " + uid);
while (mRun) {
mServerMessage = mBufferIn.readLine();
if (mServerMessage != null && mMessageListener != null) {
mMessageListener.messageReceived(mServerMessage);
}
}
MyLog.e("RESPONSE FROM SERVER", "S: Received Message: '"
+ mServerMessage + "'");
} catch (Exception e) {
MyLog.e("TCP", "S: Error", e);
} finally {
socket.close();
}
} catch (Exception e) {
MyLog.e("TCP", "C: Error", e);
}
}
public interface OnMessageReceived {
public void messageReceived(String message);
}
}
Android client: constants
public class Constants {
public static final String CLOSED_CONNECTION = "kazy_closed_connection";
public static final String LOGIN_NAME = "kazy_login_name";
}
Android client: my activity
@Override
protected void onPause() {
super.onPause();
if(connect != null) {
connect.cancel(true);
}
if(mTcpClient != null) {
MyLog.d(TAG, "stopClient");
mTcpClient.stopClient();
mTcpClient = null;
}
}
public class ConnectTask extends AsyncTask<String,String,TCPClient> {
@Override
protected TCPClient doInBackground(String... message) {
MyLog.d(TAG, "doInBackground");
mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() {
@Override
public void messageReceived(String message) {
publishProgress(message);
}
});
mTcpClient.run();
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
MyLog.d(TAG, "onProgressUpdate");
View view = adapter.getChildView(0, 0, false, null, null);
TextView text = (TextView) view.findViewById(R.id.betChildOdd);
child2.get(0).get(0).put("OLD", text.getText().toString());
child2.get(0).get(0).put(CONVERTED_ODDS, values[0].toString());
child2.get(0).get(0).put("CHANGE", "TRUE");
adapter.notifyDataSetChanged();
}
}