Реализация полнодуплексного сокета сервера, отдельный поток для чтения и записи? - PullRequest
1 голос
/ 16 ноября 2011

Я хочу читать и писать (произвольно с сервера на клиент) на одном сокете сервера (Java-приложение). Мой клиент на сервер записи и чтения отлично работают в цикле. На сервере с ответом напишите правильно.

Но если я пытаюсь случайно написать на сервере какую-нибудь команду. у меня нет решения, в первую очередь мой вопрос:

  1. возможно ли на стороне сервера оперативно записывать команды клиенту на том же сокете?
  2. если возможно, любое предложение или указатель, как это сделать?
  3. пожалуйста, дайте мне указатель, где я могу прочитать материал об этом сценарии? * * 1010

заранее спасибо.

public class ContentServerSocket extends ServerSocket {
    private final static int PORT = 4444;

    protected static boolean XYZGONE = false;
    public static Content content;

    public ContentServerSocket(xyzService service) throws IOException {
        super(PORT);

        while (true) {

            Log.d(TAG, "Waiting for new request from client(content) ....");
            new HandleRequest(accept(), service).start();
        }
    }

    public static void xyzRunAway() {
        Log.d(TAG," Content Serv er 1 ");
        XYZGONE = true;
    }

}

class HandleRequest extends Thread {
    private final static String TAG = "ContentServerSocket:Thread for a request:";
    private Socket client;
    private xyzService service;

    private static  Context context;

    HandleRequest(Socket client, SuggestionService service) {
        this.client = client;
        this.service = service;
        context = xyzService.serviceContext();  
    }

    public void run() {
        while (true) {
            try {

                Log.d(TAG, " Step 1: client: Received request  MSG for Check...  ");
                PrintWriter out = new PrintWriter(client.getOutputStream(),
                        true);

                BufferedReader in = new BufferedReader(new InputStreamReader(
                        client.getInputStream(), "utf-8"));
                String request = "";
                String tmpLine = null;


                Log.d(TAG, " Step Xyz waiting data from the client ...  ");


                while ((tmpLine = in.readLine()) != null) {

                    if (tmpLine.length() > 0) {
                        request += tmpLine;
                        //if (tmpLine.toLowerCase().contains("</contentInfo>")) {
                        if (tmpLine.contains("</contentInfo>")) {
                            Log.d(TAG, " Server : broke because of </contentInfo>");
                            break;
                        }
                    } else {
                        Log.d(TAG, " Step NULL :   ");
                        request = "";
                    }

                } 



                Log.d("Robin", " Step 2: Actual request received from the client : : " + request);
                if (request.length() == 0) {
                    Log.d("Robin",
                            " client got 0 length request, thread stop!");
                    throw new Exception();

                }
                //XMLParser xmlParser = new XMLParser(new ByteArrayInputStream(
                //      request.getBytes("UTF-8")));

                Log.d(TAG, " Step 3 :   ");
                RequestParser readxmlrequest = new RequestParser(request);
                String requestType = readxmlrequest.parsingXmlRequestFromContent();
                Log.d(TAG, " Step 4  requestType :   " + requestType);


                //TODO : need to get the result and pas to the out.println..

                //String result = processXML(xmlParser);

                String result = responseToContentRequest(readxmlrequest,requestType);//null; //TODO need to complete.
                Log.d(TAG, " Step 5 result :   "+result);
                 (((((((((())))))))))";
                if (result != null && result.length() > 0) {

                    //oos.writeObject(result);
                    Log.d("Robin", " Writing response to socket ... ");
                    out.println(result + "\n");
                    out.flush();
                    Log.d("Robin", " Writing flush completed ");
                }

                if(ContentServerSocket.XYZGONE) {
                    Log.d(TAG," XYZGONE >>>>>>>> ");
                    ContentServerSocket.XYZGONE = false;
                    String tmp = "<ssr> OK Done .......</ssr>";
                    out.println(tmp + "\n");
                    Log.d("Content Server Socket ", "xyz:" + tmp);
                    out.flush();
                }

            } catch (IOException ioException) {
                Log.d("Robin", " IOException on socket listen: " + ioException);
            }
            catch (Exception e) {
                Log.d("Robin", " outer exception: " + e.toString());
                break;
            }

            finally {
                if (client == null || client.isClosed()
                        || !client.isConnected()) {
                    Log.d(" Robin ", " client is null");
                    break;
                }
            }
            //break;

            }
        Log.d("Robin", " thread stop... ");
    }

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Итак, я исправил это.Мне просто нужно поддерживать два разных потока.1) читать.2) write.

В приведенном выше коде я только что запустил еще один поток для записи.

вставьте код в функцию Run вышеуказанного кода.

====================================================

Runnable r1 = new Runnable() {
    public void run() {
            try {
            while (true) {
                System.out.println("Hello, world!");
                if(ContentServerSocket.XYZGONE) {
                    Log.d(TAG," XYZGONEY >>>>>>>> ");
                    ContentServerSocket.XYZGONE = false;
                    String tmp = "<ssr> OK Done .......</ssr>";
                    out.println(tmp + "\n");
                    Log.d("Content Server Socket ", "XYZGONE :" + tmp);
                    out.flush();
                }
                Thread.sleep(1000L);
            }
        } catch (InterruptedException iex) {}
    }
};

Thread thr1 = new Thread(r1);

========================================

Затем начните темув хитром цикле читай.со следующим кодом с проверкой.

===================================

if(!thr1.isAlive())thr1.start();

Спасибо всем, кто ответил на мой вопрос ..

0 голосов
/ 16 ноября 2011

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

Если вы используете линейный протокол, вы можете определить, что каждое сообщение представляет собой одну строку.В этом случае вы должны синхронизировать несколько потоков так, чтобы только один из них записывал части этой строки в любой данный момент.

Ваш код слишком велик, чтобы понять, в чем ваша проблема, извините.

Может быть, этот учебник поможет?Там довольно много:

http://www.javaworld.com/javaworld/jw-12-1996/jw-12-sockets.html

...