Server-Client malfunction in Android (socket is not bound/socket is already in use)

∥☆過路亽.° 提交于 2020-01-04 13:45:46

问题


Hayho,

well my problem is a little tricky to me to explain. I try to connect my android tablet (4.0.3) to a RS-232 converter. That already works, but only oneway. If i try to send anything, it is sended. I cannot receive any answers, but this is neccessary. I get this

    Logcat Errors: Either Socket is not bound, or EADRESS already in use.

I tried multiple ways, but none worked as i need it.

My target: Sending AND receiving Bytes whenever they are sent.

My Architecture: MainActivity -> calls 2 Asynctasks 1. network, 2. ConcurrentServer network has to send my commands via DataOutputStream. Allright here. ConcurrentServer has to receive incoming Data with DataInputStream, give it to a method in ConcurrentServer class. This method should send an answerbyte.

My ConcurrentServer doesn't receive, nor does the method send anything...

I hope you can help me with that.

Code:

package com.example.wettkampftimerbt;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

import org.apache.http.client.protocol.ClientContext;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

public class ConcurrentServer extends AsyncTask<Void, Void, Void>{

    private final String LFDNR1 = "lfdnr1";
    private final String LFDNR2 = "lfdnr2";
    private final String LFDNR3 = "lfdnr3";
    private final String LFDNR4 = "lfdnr4";
    private final String LFDNR5 = "lfdnr5";
    private final String LFDNR6 = "lfdnr6";
    private final String LFDNR7 = "lfdnr7";
    private final String LFDNR8 = "lfdnr8", PREFS_NAME = "prefs",
            COMMAND = "command", LANE = "lane", DINYMIN ="dinymin", DINYSEK="dinysek";

    int w1, w2, w3, w4, w5, w6, w7, w8, diny1, diny2, diny3, diny4, diny5,
            diny6, diny7, diny8, dinymin, dinysek;
    Context context;
    ServerSocket sock;
    Socket ss;



        protected Void doInBackground (Void... arg0) {
            System.out.println("ConcurrentServer_doInBackgorund");
            Log.e("SERVER", "CON");
        try {
            sock = new ServerSocket(2010);
            ss = sock.accept();
            sock.setReuseAddress(true);
            sock.bind(new InetSocketAddress(2010));

            ss.setReuseAddress(true);
            ss = new Socket("192.168.0.100", 2011);
            sock.setSoTimeout(1000);
            for (;;) {
                boolean stopData = true;    
                BufferedReader din = new BufferedReader(new
                        InputStreamReader(ss.getInputStream()));


                //DataInputStream din = new DataInputStream(
                    //  ss.getInputStream());
                while (stopData) {
                // Einlesen
                diny1 = (din).read();// 03
                diny2 = (din).read();// Empfänger(90...97)
                diny3 = (din).read();// Sender(80)
                diny4 = (din).read();// lfdnr
                diny5 = (din).read();// Kommando(Start, Stop...)
                if (diny5==79){
                dinymin = (din).read();//Minuten
                dinysek = (din).read();//Sekunden
                }
                diny6 = (din).read();// Prüfsumme
                diny7 = (din).read();// 05
                din.close();
                //ss.close();
                //sock.close();
                System.out
                        .println("diny: " + diny1 + " " + diny2 + " " + diny3
                                + " " + diny4 + " " + diny5 + " " + diny6 + " "
                                + diny7);
                Log.e("Reccom", "RECCOM");
                reccom();


                stopData=false;
                }
            }
        } catch (Exception e) {
            System.out.println("IO error" + e);}
        return null;
        }



    public int getLFDNR1(Context context) {
        System.out.println("ConcurrentServer_getlfdnr1");
        w1 = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getInt(LFDNR1, 00);
        //w1 = Integer.valueOf(LFDNR1);
        return w1;
    }

    public String getLFDNR2(Context context) {
        System.out.println("ConcurrentServer_getlfdnr2");
        w2 = Integer.valueOf(LFDNR2);
        return LFDNR2;
    }

    public String getLFDNR3(Context context) {
        System.out.println("ConcurrentServer_getlfdnr3");
        w3 = Integer.valueOf(LFDNR3);
        return LFDNR3;
    }

    public String getLFDNR4(Context context) {
        System.out.println("ConcurrentServer_getlfdnr4");
        w4 = Integer.valueOf(LFDNR4);
        return LFDNR4;
    }

    public String getLFDNR5(Context context) {
        System.out.println("ConcurrentServer_getlfdnr5");
        w5 = Integer.valueOf(LFDNR5);
        return LFDNR5;
    }

    public String getLFDNR6(Context context) {
        System.out.println("ConcurrentServer_getlfdnr6");
        w6 = Integer.valueOf(LFDNR6);
        return LFDNR6;
    }

    public String getLFDNR7(Context context) {
        System.out.println("ConcurrentServer_getlfdnr7");
        w7 = Integer.valueOf(LFDNR7);
        return LFDNR7;
    }

    public String getLFDNR8(Context context) {
        System.out.println("ConcurrentServer_getlfdnr8");
        w8 = Integer.valueOf(LFDNR8);
        return LFDNR8;
    }
    private void reccom() throws IOException {
        System.out.println("ConcurrentServer_reccom");
        if (diny1 == 3 && diny7 == 5) {
            answer();
        } else {
        }

        switch (diny2) {
        case (144): // 144=90=Bahn1
            c144(context);
            break;
        case (145): // 145=91=Bahn2
            c145(context);
            break;
        case (146): // 146=92=Bahn3
            c146(context);
            break;
        case (147): // 147=93=Bahn4
            c147(context);
            break;
        case (148): // 148=94=Bahn5
            c148(context);
            break;
        case (149): // 149=95=Bahn6
            c149(context);
            break;
        case (150): // 150=96=Bahn7
            c150(context);
            break;
        case (151): // 151=97=Bahn8
            c151(context);
            break;
        }

    }

    private void answer() throws IOException {
        System.out.println("ConcurrentServer_answer");
    Socket sock ;
    int w0=0,w5=32;
         SocketAddress sockaddr = new InetSocketAddress("192.168.0.100", 2011);  
         sock = new Socket();  
         int timeout = 1000;   // 1000 millis = 1 second  
         sock.connect(sockaddr, timeout); 
        boolean stopData = true;
        DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
        while (stopData) {
            dos.writeByte(w0);
            dos.writeByte(diny1);
            dos.writeByte(diny3);
            dos.writeByte(diny2);
            dos.writeByte(diny4);
            dos.writeByte(w5);
            dos.writeByte(diny6);
            dos.writeByte(diny7);
            dos.flush();
            //dos.close();
            stopData = false;}

    }

    private void c151(Context context) {
        System.out.println("ConcurrentServer_c151");
        getLFDNR8(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {

                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "151").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr8 passt nicht");
        }
    }

    private void c150(Context context) {
        System.out.println("ConcurrentServer_c150");
        getLFDNR7(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "150").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr7 passt nicht");
        }
    }

    private void c149(Context context) {
        System.out.println("ConcurrentServer_c149");
        getLFDNR6(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "149").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr6 passt nicht");
        }
    }

    private void c148(Context context) {
        System.out.println("ConcurrentServer_c148");
        getLFDNR5(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "148").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr5 passt nicht");
        }
    }

    private void c147(Context context) {
        System.out.println("ConcurrentServer_c147");
        getLFDNR4(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "147").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr4 passt nicht");
        }
    }

    private void c146(Context context) {
        System.out.println("ConcurrentServer_c146");
        getLFDNR3(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "146").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr3 passt nicht");
        }
    }

    private void c145(Context context) {
        System.out.println("ConcurrentServer_c145");
        getLFDNR2(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "145").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println("lfdnr2 passt nicht");
        }
    }

    private void c144(Context context) {
        System.out.println("ConcurrentServer_c144");
        final String PREFS_NAME = "prefs";
        final String COMMAND = "command";
        final String LANE = "lane", DINYMIN ="dinymin", DINYSEK="dinysek";
        getLFDNR1(context);
        if (w1 == diny4||(w1-1)==diny4)
            switch (diny5) {
            case (00):
            case (79): {
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(LANE, "144").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                        .edit().putString(COMMAND, "79").commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYMIN, Integer.valueOf(dinymin).toString()).commit();
                context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .edit().putString(DINYSEK, Integer.valueOf(dinysek).toString()).commit();
            }
                break;
            }
        else {
            System.out.println(w1+ "+"+ diny4);
            System.out.println("lfdnr1 passt nicht");
        }

    }

    public ConcurrentServer(Context context) {
        System.out.println("ConcurrentServer_Context");
        this.context = context;

    }



}

If you think, you should need the network-code, too, please tell it to me. BTW: this is my code NOW, after experimenting and trying a lot of things. So if anything is doubled, this is the reason. In Cause of I am a newbie on Android it may happens to me.

Thanks.

EDIT:

This link, given by Class Stacker is very good. It`s in detailed and precise. For anyone who's having trouble, check this:

http://docs.oracle.com/javase/tutorial/networking/urls/index.html

Thanks one more time Class Stacker!


回答1:


  1. Please note that, depending on your Android version, AsyncTasks are not executed in parallel, unless you explicitly specify the executor for that.

  2. I guess you'll have to actively connect to the converter device. If so, you don't have a server socket; it's really a client socket.

  3. I have no idea why you create so many sockets along the way; a socket is a bi-directional communication channel.

  4. If you really need a server socket, you wait vor incoming connections, which you accept(), and accept() will give you your client-specific socket.

Hote this helps; if not, you need to update your questions with information about the device you're connecting to, as far as I'm concerned.




回答2:


Done it, with the knowing, a socket is bidirectional and can read AND write i got it now, i just shifted 2 seperate classes into each other and voilá it works ^^ no doublebound sockets left. Thanks Class Stacker. FOr help with the same or an even issue have a look at the link above.



来源:https://stackoverflow.com/questions/14581866/server-client-malfunction-in-android-socket-is-not-bound-socket-is-already-in-u

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!