Android 6.0无法创建套接字

时间:2015-12-28 20:53:09

标签: android sockets tcp

我无法创建到我的服务器的简单TCP连接。 我创建了一个AsyncTask来发送消息,但它没有用。 我在权限中添加了INTERNET和ACCESS_NETWORK_STATE。 我不知道还有什么可以尝试。

public class ServerCommunicator extends AsyncTask<String,Void,Void>{
public static String SERVER_IP = "192.168.2.148";
public static int SERVER_PORT = 1337;
public static String SERVER_PW = "adsfadsf";
public Context context;
@Override
protected Void doInBackground(String... params) {
    //Create Command
    CommandFactory cmdFactory = new CommandFactory();
    Command cmd = cmdFactory.createCommand();
    System.out.println("Cmd created..");

    //-----
    try {
        System.out.println(SERVER_IP);
        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
        System.out.println("Created serverAddr "+ SERVER_IP);
        Socket socket = new Socket(serverAddr,SERVER_PORT);
        System.out.println("Socket created..");
        //sends the message to the server
        PrintWriter mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        String msg2Send = Crypter.Encrypt(cmd.toString(), SERVER_PW);
        sendMsgAsByteArr(socket, msg2Send);
        Command recCmd = cmdFactory.extractCommandFromStr(receiveMsg(socket));
        socket.close();
        Toast.makeText(context, recCmd.id, Toast.LENGTH_LONG).show();


    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
private static void sendMsgAsByteArr(Socket socket, String msg) {
    try {
        socket.getOutputStream().write(msg.getBytes());
        System.out.println("sent cmd..");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static String receiveMsg(Socket socket) {
    String msg = "";
    int c;
    ArrayList<Byte> incoming = new ArrayList<Byte>();
    try {
        while((c = socket.getInputStream().read())!=-1) {
            incoming.add((byte)c);
        }
        byte[] allBytes = new byte[incoming.size()];
        for(int i = 0; i < incoming.size(); i++) {
            allBytes[i] = incoming.get(i);
        }
        msg = new String(allBytes);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return msg;
}
}

我的程序运行到Socket socket = new Socket(serverAddr, SERVER_PORT);然后停止。它没有显示任何堆栈跟踪或错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我调试了你的代码,虽然有多个问题,但没有一个与Android 6有关。

我创建了代码的简化版本并使其正常运行。 一个问题是您的context引用为null,因此我在构造函数中设置它。 另一个问题是你试图在后台线程上显示Toast,这不会起作用。 另一个问题是你的发送和接收方法,它们对我没用。

这是我使用TCP / IP服务器的简化代码,在Android 4.4.4和Android 6上都经过测试。 您可以根据需要进行此操作并进行扩展:

public class ServerCommunicator extends AsyncTask<String,Void,String> {
    public static String SERVER_IP = "11.222.33.444";
    public static int SERVER_PORT = 1234;
    public Context context;

    public ServerCommunicator(Context c) {
        this.context = c;
    }
    @Override
    protected String doInBackground(String... params) {
        try {
            System.out.println(SERVER_IP);
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            System.out.println("Created serverAddr "+ SERVER_IP);
            Socket socket = new Socket(serverAddr,SERVER_PORT);
            System.out.println("Socket created..");
            //sends the message to the server
            PrintWriter mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            String msg2Send = "{\"HelloWorld\", \"1234\"}";
            mBufferOut.println(msg2Send);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String result = in.readLine();
            System.out.println("result: " + result);
            socket.close();


            return result;

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null) {
            Toast.makeText(context, result, Toast.LENGTH_LONG).show();
        }
    }
}