Сеть одностороннее соединение Android
Моя сегодняшняя проблема заключается в следующем:
У меня есть сетевое соединение, при котором обе стороны должны отправлять команды (байты), но мой читатель блокирует мой писатель, вот как это кажется. Если я "отключаю" своего читателя (удаляя читателя из источника), писатель работает так, как должен, но когда мой читатель тоже там, мой писатель просто выполняет половину работы.
Допустим, мой писатель должен отправить команду с интервалом в 15 секунд и оставаться в курсе входящих команд, на которые должен ответить небольшой байтовый блок. Блок ответа отправлен, но команда из интервала кажется заблокированной.
Вот мой источник:
protected String doInBackground(URL... params) {
try {
btw1 = (byte) sendbeg;
btw2 = (byte) w2;
btw3 = (byte) w3;
btw4 = (byte) w4;
btw5 = (byte) w5;
if (w5 == 79) {
btw6 = (byte) mins;
btw7 = (byte) seks;
btw8 = (byte) w6;
btw9 = (byte) sendend;
} else {
btw6 = (byte) w6;
btw7 = (byte) sendend;
}
SocketAddress sockaddr = new InetSocketAddress("192.168.0.7", 2001);
sock = new Socket();
int timeout = 1000; // 1000 millis = 1 second
sock.connect(sockaddr, timeout);
sock.setReuseAddress(true);
System.out.println(sock);
DataOutputStream dos = new DataOutputStream(
(OutputStream) sock.getOutputStream());
BufferedWriter wrtr = new BufferedWriter(
new OutputStreamWriter(dos), 300);
DataInputStream dis = new DataInputStream(sock.getInputStream());
BufferedReader rdr = new BufferedReader(new InputStreamReader(dis),
300);
getbyte((byte) btw1, (byte) btw2, (byte) btw3, (byte) btw4,
(byte) btw5, (byte) btw6, (byte) btw7, (byte) btw8,
(byte) btw9, (byte) btw10); //getbyte works fine, too. It's just there for putting the single bytes into an array.
System.out.println(btw.length);
dos.write(btw);
diny1 = (dis).read();
diny2 = (dis).read();
diny3 = (dis).read();
diny4 = (dis).read();
diny5 = (dis).read();
dinymin = (dis).read();
dinysek = (dis).read();
diny6 = (dis).read();
diny7 = (dis).read();
if (diny5 != 79) {
System.out.println("diny" + diny1 + " " + diny2 + " " + diny3
+ " " + diny4 + " " + diny5 + " " + dinymin + " "
+ dinysek);
} else {
if (diny7 != 5) {
diny6 = 0;
diny7 = 0;
}
System.out.println("diny" + diny1 + " " + diny2 + " " + diny3
+ " " + diny4 + " " + diny5 + " " + dinymin + " "
+ dinysek + " " + diny6 + " " + diny7);
}
dos.close();
wrtr.close();
dis.close();
rdr.close();
if (diny5 != 32) {
sendbeg = 3;
w2 = diny3;
w3 = diny2;
w4 = 48;
w5 = 32;
w6 = 11;
sendend = 5;
System.out.println(diny5 + " ^^ ");
doInBackground();
}
System.out.println("case 144-49-000.1" + context);
reccom(context);
sock.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("IO error " + e);
}
return "Done";
}
Мой интервал источника работает нормально, потому что он работает, если читатель неактивен, поэтому я думаю, что проблема в этом коде выше. пожалуйста помоги.
1 ответ
- Вы можете удалить
setReuseAddress()
вызов; это только для серверных сокетов. - AsyncTask не совсем подходящий класс для ваших читателей и писателей, если вы все время будете в курсе событий; было бы лучше использовать
Thread
, - Звучит так, как будто вам нужен отдельный читатель и пишущий поток, если одному не позволено блокировать другой.
- Вам, вероятно, придется использовать
synchronized
по пути, если читатель и писатель действуют независимо