Как открыть сокет с телефона Android без ошибки SocketException во время выполнения? - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь написать приложение на Android, где на компьютере работает многопоточный сервер, а в приложении на телефоне есть кнопка, когда пользователь нажимает эту кнопку, между сервером и сервером открывается гнездо клиент. Моя проблема в том, что как только пользователь нажимает на эту кнопку, я получаю много ошибок во время выполнения на моем журнале. Один из них - сокет SocketException (отказано в разрешении)

Вот код действия, в котором есть кнопка, открывающая сокет с сервером

package guc.edu.eg;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity1 extends Activity {
    Button start;
    Button help;
    Button credentials;
    Socket socket;
     //public DataInputStream in=null;
     public PrintStream out=null;
     InetAddress IP;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        //try {
            //IP = InetAddress.getLocalHost();
        //} catch (UnknownHostException e) {
            // //TODO Auto-generated catch block
            //e.printStackTrace();
        //}
        start = (Button) findViewById(R.id.start);
        start.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    socket= new Socket("127.0.0.1",4444);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //try {
                    //out = new PrintStream(socket.getOutputStream());
                    //out.println ("The socket is open at the phone!!");
                //} catch (IOException e) {
                    // TODO Auto-generated catch block
                    //e.printStackTrace();
                //}
                //try {
                    // in = new 
                      //DataInputStream(socket.getInputStream());
            //  } catch (IOException e) {
                    // TODO Auto-generated catch block
                //  e.printStackTrace();
                //}
                Intent intent = new Intent(Activity1.this,Activity2.class);
                startActivity(intent);
            }
        });
        help = (Button) findViewById(R.id.help);
        help.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Activity1.this,Activity3.class);
                startActivity(intent);
                finish();

            }
        });
        credentials = (Button) findViewById(R.id.credentials);
        credentials.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Activity1.this,Activity4.class);
                startActivity(intent);
                finish();

            }
        });
    }
}

Вот код для класса Server, который фактически находится в другом проекте, отличном от того, в котором есть код приложения.

import java.io.*;
import java.net.*;
import java.util.LinkedList;


// Java extension packages


public class Server implements Runnable {


    ServerSocket serverSocket;
    Socket clientSocket;
    int portNo;

    LinkedList<ServerThread> allClients = new LinkedList<ServerThread>();

    public Server(int port) {
        portNo = port;


    }

    public void run() {

        try {

            serverSocket = new ServerSocket(portNo);

            while (true) {


                clientSocket = serverSocket.accept();


                ServerThread x = new ServerThread(clientSocket, this);
                allClients.add(x);

                x.start();


            }
        } catch (EOFException eofException) {
            System.out.println("Client terminated connection");
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }

    public void sendMessageToClient(String message) {
        String[] x = message.split(",");
        //for (int i = 0; i < allClients.size(); i++) {
            //if (allClients.get(i).clientName.equals(x[2])) {
                //allClients.get(i).sendMessage(x[1] + ": " + x[0]);
                //return;
            //}
        //}     
        // if you didn't return then you couldn't reach your destination in your local server
        // send the message to the network server to search for it
    }

    public String getLocalClientsNames() {
        String names = "";
        for (int i = 0; i < allClients.size(); i++) {
            names += allClients.get(i).clientName + ",";
        }
        return names;
    }

    public void sendClientNamesToAll() {
        //net.sendAllClientNames();
    }
    public static void main(String [] args) {
        Server server = new Server(4444);
        new Thread(server).start();
    }

}

Вот класс ServerThread, расположенный в одном пакете с классом Server

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;


public class ServerThread extends Thread {

    private Socket clientSocket;
    private Server server;


    String clientName;

    private ObjectOutputStream output;
    private ObjectInputStream input;

    public ServerThread(Socket client, Server s) {
        this.clientSocket = client;
        this.server = s;
    }

    @Override
    public void run() {
        try {
            output = new ObjectOutputStream(clientSocket.getOutputStream());
            output.flush();
            input = new ObjectInputStream(clientSocket.getInputStream());

            processConnection();
            closeConnection();

        } catch (IOException e) {
            System.out.println("in or out failed");
        }
    }

    private void processConnection() throws IOException {

        String message = "!!";

        System.out.println("mada5alsh el while");

        while (!message.equalsIgnoreCase("Client>> end")) {

            try {
                System.out.println("da5al el while");
                message = (String) input.readObject();
                System.out.print(message);
                if (message.equalsIgnoreCase("Name")) {
                    clientName = (String) input.readObject();
                    server.sendClientNamesToAll();
                } else {



                    server.sendMessageToClient(message);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    public void closeConnection() throws IOException {

        output.close();
        input.close();
        clientSocket.close();
    }

    public void sendMessage(String message) {
        try {
            output.writeObject(message);
            output.flush();
        } catch (IOException ioException) {
            //do
        }
    }

}
  1. Я думаю, что это может быть связано с файлом манифеста, поэтому я добавил в него эту строку кода

         `<uses-permission android:name="android.permission.INTERNET"></uses-permission>` 
    

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Вы создаете свой клиентский сокет в главном потоке, который не разрешен.

Используйте отдельный поток или используйте AsyncTask.

0 голосов
/ 08 марта 2012

Добавление <uses-permission android:name="android.permission.INTERNET"></uses-permission> к вам AndroidManifest.xml должно помочь.

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