Rady a tipy pro vyvojSocketova komunikace

Moderátor: mArtinko5MB

Odpovědět

Autor tohoto vlákna
AndroidDedek
Nové Androidě
Příspěvky: 8
Registrován: stř 13. říj 2010 10:49:01
Reputace: 0

Socketova komunikace

Příspěvek od AndroidDedek » ned 02. črc 2017 16:49:12

Zdravim kolegove
Potrebuji tcp clienta ktery zustane trvale otebreny. At delam co delam tak se mi InputStream neustale zavira. Asi na EOF je to v android core normalni situace?
Ukol zni otevrit tcp stream a proste cekat na data. Na timeout zapomente je nastaveno infinity. A k uzavreni dojde po te co je prijat nejaky packet.
Dik za kazdou myslenku.




Uživatelský avatar

Crusty
Robot
Příspěvky: 864
Registrován: ned 19. črc 2009 17:30:40
Reputace: 20
Typ mobilu / ROM: HTC Evo 3D
Bydliště: Praha
Kontaktovat uživatele:

Re: Socketova komunikace

Příspěvek od Crusty » ned 02. črc 2017 20:04:54

mozna ukaz kod jak to ted mas


Autor tohoto vlákna
AndroidDedek
Nové Androidě
Příspěvky: 8
Registrován: stř 13. říj 2010 10:49:01
Reputace: 0

Re: Socketova komunikace

Příspěvek od AndroidDedek » pon 03. črc 2017 7:18:24

public synchronized void aktivujSocket(final byte[] data) throws IOException {
if (socket == null)
socket = new Socket();
try {
if (!socket.isConnected()) {
//socket.setSendBufferSize(262140);
socket.connect(new InetSocketAddress(BASEADR, PORT));//, TIMEOUT);
}

if (socket.isConnected()) {
if (out == null)
out = socket.getOutputStream();
if (data != null) {
out.write(data);
out.flush();
}
PrijemDat();
}

} catch (SocketException e1) {
e1.printStackTrace();
socket = null;
br = null;
out = null;
recThread = null;
} catch (IOException e1) {
e1.printStackTrace();
socket = null;
br = null;
out = null;
recThread = null;
}
}

private void PrijemDat() throws IOException {
if (socket.isConnected()) {
if (br == null)
br = socket.getInputStream();
int aval=br.available();
if (recThread == null) {
recThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// while(!konecPrijmuDat) {
PrijemDataRekurze();
//}
} catch (IOException e) {
e.printStackTrace();
}
}
});
recThread.start();
}
}
}

private void PrijemDataRekurze() throws IOException {
byte tt[] = new byte[1024];
int count = 0;
while ((count = br.read(tt)) != -1) {
Log.i("DATAPRIJATA", "Prijato " + String.valueOf(count));
Log.d("DATAPRIJATA Prubeh", new String(tt,0,count, "UTF-8"));
if (count >= 100 && SkopPDFApplicaton.data == null) {
tt = ZpracujPacket(tt, count);
count -= 100;
if (SkopPDFApplicaton.data != null && (SkopPDFApplicaton.data.getCmd().equals(WebServiceCommands.HELLO) || SkopPDFApplicaton.data.getCmd().equals(WebServiceCommands.PING))) {
Log.d("DATAPRIJATA",SkopPDFApplicaton.data.getCmd());
SkopPDFApplicaton.data = null;
}
if (count > 0 && SkopPDFApplicaton.data == null) {
tt = ZpracujPacket(tt, count);
count -= 100;
}
}
if (SkopPDFApplicaton.data != null) {
SkopPDFApplicaton.data.AddPacket(tt, count);
//Log.d("DATAPRIJATA", String.format("%d", data.getPrijataData()));
Log.d("DATAPRIJATA Prubeh", new String(SkopPDFApplicaton.data.getData(), "UTF-8"));
}
if (SkopPDFApplicaton.data != null && SkopPDFApplicaton.data.getDataLenght() <= SkopPDFApplicaton.data.getPrijataData()) {
Log.d("DATAPRIJATA Komplet", new String(SkopPDFApplicaton.data.getData(), "UTF-8"));
SkopPDFApplicaton.data.SaveToDisk("aaa.txt");
SkopPDFApplicaton.data = null;
}
}
Log.i("DATAPRIJATA", "Input stream chcipnul");
}

private byte[] ZpracujPacket(byte[] tt, int count) throws UnsupportedEncodingException {
String tx = new String(tt, 0, 100, "ASCII").trim();
Log.d("DATAPRIJATA", tx);
if (tx.startsWith("file") || tx.startsWith("ping") || tx.startsWith("hello")) {
SkopPDFApplicaton.data = new ReceivedData(tx);
byte[] bb = new byte[1024];
for (int i = 100; i < count; i++)
bb = tt;
return bb;
}
return tt;
}

AktivujSocket se vola vzdy pri jakem koliv pozadavku pro vysilani, otestuji zda je vse nainstancovano a provedu zapis do vystupniho proudu
PrijemData inicialisuje vstupni proud a v novem threadu volam PrijemDataRekurze kde bych ocekaval blokovaci funkci na metode read(...
PrijemDataRekurze tato metoda neblokuje while ((count = br.read(tt)) != -1) {a cele to vyleti za ten while a tim je komunikace prerusena az do nove instance vsech potrebnych soucasti.

Fakt jsem uz vystrilel vsechny patrony a nevim kde by mohl byt problem.

Diky

Odpovědět

Zpět na „Rady a tipy pro vyvoj“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host