Я пытаюсь создать два сокета для связи между сервером и клиентом: один, на котором клиент отправляет на сервер, и другой, наоборот.Оба сокета имеют одинаковый IP-адрес, но разные порты.Отправка и получение находятся в разных темах.
Проблема в том, что они как-то блокируют друг друга.Если я посылаю с сервера на клиент, я не могу получить на стороне сервера, и наоборот.
Возможно ли даже открыть два сокета одновременно для одного и того же клиента / сервера?В интернете я не смог найти никого, кто бы делал это так, как я планирую, и не говорил, что это невозможно.
Мой клиент - телефон на базе Android, а мой сервер - ПК.1009 *
Извините, это немного длинно, я пытался максимально упростить это.println
- это метод, который выводит строки.
На стороне сервера я пишу основным методом:
//set up the two Sockets sOut and sIn
IO myIO=new IO(sOut, sIn);
println("received "+myIO.receive()); //S1
myIO.toSendQ(new Object obj); //S2
На стороне клиента в onCreate ():
//set up the two Sockets sOut and sIn
IO myIO = new IO(sOut, sIn);
myIO.toSendQ(new Object obj); //C1
println("received "+myIO.receive()); //C2
//display sth
Ввод / вывод выглядит следующим образом:
public class IO
{
ObjectOutputStream objOut = null;
ObjectInputStream objIn = null;
public LinkedList<Msg> queueRec=new LinkedList<Msg>();
public LinkedList<Msg> queueSend=new LinkedList<Msg>();
int sleepTimeSend=1000;
public IO(Socket sOut, Socket sIn)
{
init(sOut, sIn);
new SendThread().start();
}
public synchronized void toSendQ(Msg msg)
{
queueSend.add(msg);
}
public synchronized boolean send(Msg msg)
{
boolean sent = true;
if (msg != null)
{
try
{
objOut.writeObject(msg);
objOut.flush();
println("-> sent " + msg);
}
catch (IOException e)
{
}
}
return sent;
}
public synchronized Msg receive()
{
Msg msg = null;
try
try
{
msg = (Msg) (objIn.readObject());
}
catch (ClassNotFoundException cnf)
{
}
}
catch (IOException e)
{
}
queueRec.add(msg);
return msg;
}
private synchronized boolean init(Socket sOut, Socket sIn)
{
boolean sent = true;
try
{
objOut = new ObjectOutputStream(sOut.getOutputStream());
objIn = new ObjectInputStream(sIn.getInputStream());
}
catch (IOException e)
{
}
return sent;
}
class SendThread extends Thread
{
Msg msg;
public void run()
{
while(true)
{
if(!queueSend.isEmpty())
{
LinkedList<Msg> queueSendClone=(LinkedList<Msg>) queueSend.clone();
Iterator<Msg> it=queueSendClone.iterator();
while(it.hasNext())
{
msg=it.next();
send(msg);
queueSend.removeFirst();
}
}
else
{
try
{
Thread.sleep(sleepTimeSend);
}
catch(Exception e)
{
}
}
}
}
}
}
Я не вижу ничего, отображаемого на клиенте, если я запускаю программу следующим образом.Программа не зависает, но она застряла в строке выше, я полагаю.
Если я закомментирую либо C1 & S1, либо C2 & S2, сообщение будет отправлено и получено.Я не получаю никаких сообщений об ошибках при попытке отправить или получить (в моей программе я ловлю исключения, просто для простоты опущен).