2022-03-10 16:31:03 +02:00
|
|
|
package com.safemobile.lib.sound;
|
|
|
|
|
2022-03-15 15:51:30 +02:00
|
|
|
import com.safemobile.lib.SM;
|
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
import java.net.Socket;
|
|
|
|
import java.net.UnknownHostException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2022-03-30 10:34:57 +03:00
|
|
|
public class TcpAudioClient implements Runnable {
|
|
|
|
private boolean alive = true;
|
|
|
|
|
|
|
|
private String serverHostname;
|
|
|
|
private final int port;
|
2022-03-10 16:31:03 +02:00
|
|
|
private Thread listenThread;
|
2022-03-30 10:34:57 +03:00
|
|
|
private Socket soc = null;
|
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
private InputStream recv;
|
|
|
|
private OutputStream writer;
|
|
|
|
|
2022-03-30 10:34:57 +03:00
|
|
|
private Boolean connOK = false;
|
2022-03-10 16:31:03 +02:00
|
|
|
byte[] buffer = new byte[16384];
|
2022-03-30 10:34:57 +03:00
|
|
|
private final List<ITCPaudioLis> listeners = new ArrayList<>();
|
|
|
|
|
|
|
|
public TcpAudioClient(String hostName, int port) {
|
|
|
|
setServerHostname(hostName);
|
|
|
|
this.port = port;
|
|
|
|
SM.Debug("---TcpHandler constructor--- port:" + port);
|
|
|
|
listenThread = new Thread(this, "TcpListen");
|
2022-03-10 16:31:03 +02:00
|
|
|
listenThread.start(); // (2) Start the thread.
|
2022-03-30 10:34:57 +03:00
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
@Override
|
2022-03-30 10:34:57 +03:00
|
|
|
public void run() {
|
|
|
|
try {
|
|
|
|
soc = new Socket(getServerHostname(), port);
|
|
|
|
SM.Debug("Socket timeout:" + soc.getSoTimeout());
|
|
|
|
recv = soc.getInputStream();
|
|
|
|
writer = soc.getOutputStream();
|
|
|
|
if (soc != null)
|
|
|
|
setConnOK(true);
|
|
|
|
|
|
|
|
} catch (UnknownHostException e) {
|
|
|
|
SM.Debug("UnknownHostException", "break:" + e);
|
|
|
|
} catch (IOException e) {
|
|
|
|
SM.Debug("IOException", "break:" + e);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
while (alive) {
|
2022-03-10 16:31:03 +02:00
|
|
|
try {
|
|
|
|
Thread.sleep(3000);
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
SM.Debug(e.toString());
|
2022-03-30 10:34:57 +03:00
|
|
|
Thread.currentThread().interrupt();
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
while (Boolean.TRUE.equals(getConnOK())) {
|
|
|
|
try {
|
|
|
|
buffer = new byte[16384];
|
|
|
|
int n = recv.read(buffer);
|
|
|
|
if (n == -1)
|
2022-03-10 16:31:03 +02:00
|
|
|
break;
|
2022-03-30 10:34:57 +03:00
|
|
|
fireDataArrived(buffer, n);
|
|
|
|
} catch (Exception ex) {
|
|
|
|
SM.Debug("break:" + ex);
|
|
|
|
setConnOK(false);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
}
|
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
try {
|
|
|
|
Thread.sleep(3000);
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
SM.Debug(e.toString());
|
2022-03-30 10:34:57 +03:00
|
|
|
Thread.currentThread().interrupt();
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
if (alive) restartTCP();
|
|
|
|
}
|
2022-03-10 16:31:03 +02:00
|
|
|
SM.Debug("==================================");
|
2022-03-30 10:34:57 +03:00
|
|
|
SM.Debug("TCP listenThread stopped!! alive = false");
|
2022-03-10 16:31:03 +02:00
|
|
|
SM.Debug("==================================");
|
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
public boolean send(byte[] data, int len) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
if (writer != null) {
|
|
|
|
writer.write(data, 0, len);
|
2022-03-10 16:31:03 +02:00
|
|
|
return true;
|
2022-03-30 10:34:57 +03:00
|
|
|
} else {
|
2022-03-10 16:31:03 +02:00
|
|
|
return false;
|
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
} catch (Exception e) {
|
2022-03-10 16:31:03 +02:00
|
|
|
SM.Debug(e.toString());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
private void restartTCP() {
|
|
|
|
try {
|
|
|
|
SM.Debug("Restarting TCP...ip:" + getServerHostname());
|
|
|
|
soc = new Socket(getServerHostname(), port);
|
|
|
|
recv = soc.getInputStream();
|
|
|
|
writer = soc.getOutputStream();
|
|
|
|
setConnOK(true);
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
SM.Debug("break:" + e);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isAlive() {
|
|
|
|
return alive;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setAlive(boolean alive) {
|
|
|
|
this.alive = alive;
|
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
public void stop() {
|
|
|
|
|
2022-03-10 16:31:03 +02:00
|
|
|
this.alive = false;
|
2022-03-30 10:34:57 +03:00
|
|
|
if (soc != null) {
|
2022-03-10 16:31:03 +02:00
|
|
|
try {
|
|
|
|
soc.close();
|
|
|
|
soc = null;
|
|
|
|
} catch (IOException e) {
|
2022-03-30 10:34:57 +03:00
|
|
|
SM.Debug("break:" + e);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
setConnOK(false);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
|
|
|
// stop thread
|
2022-03-30 10:34:57 +03:00
|
|
|
if (listenThread != null) {
|
|
|
|
Thread moribund = listenThread;
|
|
|
|
listenThread = null;
|
|
|
|
moribund.interrupt();
|
|
|
|
}
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
public synchronized void addTCPListener(ITCPaudioLis l) {
|
|
|
|
listeners.add(l);
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
|
|
|
|
public synchronized void removeTCPListener(ITCPaudioLis l) {
|
|
|
|
listeners.remove(l);
|
|
|
|
}
|
|
|
|
|
|
|
|
private synchronized void fireDataArrived(byte[] data, int len) {
|
|
|
|
TCPaudioEvent event = new TCPaudioEvent(this, data, len);
|
|
|
|
for (ITCPaudioLis listener : listeners) {
|
|
|
|
listener.dataRecv(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getServerHostname() {
|
|
|
|
return serverHostname;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setServerHostname(String serverHostname) {
|
|
|
|
this.serverHostname = serverHostname;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Boolean getConnOK() {
|
|
|
|
return connOK;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setConnOK(Boolean connOK) {
|
|
|
|
this.connOK = connOK;
|
2022-03-10 16:31:03 +02:00
|
|
|
}
|
2022-03-30 10:34:57 +03:00
|
|
|
}
|