سؤال

وأنا على صنع عميل النموذج والخادم حتى أستطيع أن أفهم كيفية التعامل مع إعادة الاتصال. يتعين على الملقم لإنشاء serversocket والاستماع إلى الأبد. قد ربط عميل، وإرسال البيانات الخاصة به، وإغلاق مأخذ، بل انها لن ترسل رسالة "أنا فعلت وإغلاق" نوع إلى الملقم. لهذا السبب، والخادم يحصل على EOFException عندما يقوم readByte() منذ العميل البعيد قد أغلقت. في معالج خطأ لEOFException، فإنه سيتم إغلاق مأخذ وفتح واحدة جديدة.

وهنا تكمن المشكلة: عميل يحصل أحيانا SocketWriteError عندما تفعل ذلك الدعوة outputStream.write() حتى بعد أن بنجاح يفتح مقبس / inputstream / outpustream. ويجوز لها أن تفعل شيئا مع تردد أنني فتح وإغلاق هذه المآخذ. شيء واحد للاهتمام هو أن العميل لا عدد التعسفي من يكتب / وثيقة / يعيد قبل crapping بها. وسوف حماقة أحيانا خارجا على إعادة الاتصال الأولى، وأحيانا أخرى وسوف يستغرق 50 إعادة الاتصال قبل رؤية SocketWriteError.

وهنا يكمن الخطأ على جانب العميل:

java.net.SocketException: Connection reset by peer: socket write error
       at java.net.SocketOutputStream.socketWrite0(Native Method)
       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
       at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
       at bytebuffertest.Client.main(Client.java:37)

وهنا بعض قصاصات من التعليمات البرمجية:

وSERVER:

public static void main(String[] args)
{
    Server x = new Server();
    x.initialize();
}

private void initialize()
{
    ServerSocket s;
    InputStream is;
    DataInputStream dis;
    while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!!
    {
        try
        {
            s = new ServerSocket(4448);
            s.setSoTimeout(0);
            s.setReuseAddress(true);
            is = s.accept().getInputStream();
            System.out.println("accepted client");
            dis = new DataInputStream(is);
            try
            {

                byte input = dis.readByte();
                System.out.println("read: " + input);
            } catch (Exception ex)
            {
                System.out.println("Exception");
                dis.close();
                is.close();
                s.close();
            }
        } catch (IOException ex)
        {
            System.out.println("ioexception");
        }
    }
}

وCLIENT:

public static void main(String[] args)
{
    Socket s;
    OutputStream os;
    try
    {
        s = new Socket("localhost", 4448);
        s.setKeepAlive(true);
        s.setReuseAddress(true);
        os = s.getOutputStream();
        int counter = 0;
        while (true)
        {
            try
            {
                os.write((byte) counter++);
                os.flush();

                os.close();
                s.close();

                s = new Socket("localhost", 4448);
                s.setKeepAlive(true);
                s.setReuseAddress(true);
                os = s.getOutputStream();
            } catch (Exception e)
            {
                e.printStackTrace();
                System.err.println("ERROR: reconnecting...");
            }
        }
    } catch (Exception ex)
    {
        ex.printStackTrace();
        System.err.println("ERROR: could not connect");
    }
}

لا أحد يعرف كيفية إعادة الاتصال بشكل صحيح؟

هل كانت مفيدة؟

المحلول

لا تغلق ServerSocket على خطأ، فقط. قبول () اتصال جديد.

وماذا أفعل عادة هو كل ServerSocket.accept الوقت () بإرجاع المقبس، وتفرخ قبالة موضوع للتعامل مع ارسال واستقبال من أن المقبس. وبهذه الطريقة كنت على استعداد لبدء قبول اتصال جديد في أقرب وقت واحد ما يريد الاتصال لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top