Раздельные отправки / получения сокетов возможно с Android? - PullRequest
0 голосов
/ 02 июня 2011

Я пытаюсь создать два сокета для связи между сервером и клиентом: один, на котором клиент отправляет на сервер, и другой, наоборот.Оба сокета имеют одинаковый 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, сообщение будет отправлено и получено.Я не получаю никаких сообщений об ошибках при попытке отправить или получить (в моей программе я ловлю исключения, просто для простоты опущен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...