客户端的服务器Ip使用套接字

时间:2016-12-10 15:21:36

标签: java android sockets serversocket tclientsock

我需要使用android套接字级编程创建一个应用程序,我在服务器和客户端之间创建了一个连接,但我需要在客户端显示等待服务器IP列表,并从列表中选择一个IP并在它们之间建立连接。 / p>

这是我的服务器端代码

public class Server extends AppCompatActivity {

    private static final String TAG = "ServerActivity";
    private TextView tvServerStatus;
    private TextView recievemsg;
    InetAddress receiverAddress;
    public static String SERVERIP = "";
    DatagramSocket datagramSocket;
    public static final int SERVERPORT = 8080;

    private Handler handler = new Handler();
    Handler updateConversationHandler;
    private ServerSocket serverSocket;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server);
        updateConversationHandler = new Handler();

        tvServerStatus = (TextView) findViewById(R.id.tvServerStatus);
        recievemsg=(TextView)findViewById(R.id.send_msg);
        SERVERIP = getLocalIpAddress();
        Thread fst = new Thread(new ServerThread());
        fst.start();


        try {
            datagramSocket = new DatagramSocket(8080);
            byte[] buffer = "0123456789".getBytes();
            byte[] address=SERVERIP.getBytes();
            receiverAddress = InetAddress.getByAddress(address);
            DatagramPacket packet = new DatagramPacket(
                    buffer, buffer.length, receiverAddress, 8080);
            datagramSocket.send(packet);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    private String getLocalIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces
                        .nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface
                        .getInetAddresses();
                while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress.nextElement();

                    if (inetAddress.isSiteLocalAddress()) {
                        ip += "SiteLocalAddress: "
                                + inetAddress.getHostAddress() + "\n";
                    }
                }
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }
        return ip;


    }

    public class ServerThread implements Runnable {

        @Override
        public void run() {
            try {
                Log.e(TAG, "Server IP: " + SERVERIP);
                if (SERVERIP != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            tvServerStatus.setText("Listening On Ip: " + SERVERIP);
                        }
                    });

                    serverSocket = new ServerSocket(SERVERPORT);
                     while (!Thread.currentThread().isInterrupted()) {
                        {
                            try {
                                // LISTEN FOR INCOMING CLIENTS
                                Socket client = serverSocket.accept();

                                CommunicationThread commThread = new    CommunicationThread(client);

                                new Thread(commThread).start();

       //                          Log.e(TAG, "Client Socket: " + client);
      //                        new Clients_Handle(client, ROOT_DIRECTORY).start();
                            }
                            catch (IOException e) {

                                e.printStackTrace();

                            }

                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            tvServerStatus.setText("Couldn't detect internet connection.");
                        }
                    });
                }
            } catch (IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        tvServerStatus.setText("Error");
                    }
                });
                e.printStackTrace();
            }
        }
    }
    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;
            try {


                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));


            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        public void run() {

            while (!Thread.currentThread().isInterrupted()) {

                try {

                    String read = input.readLine();
                    updateConversationHandler.post(new updateUIThread(read));

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }
    }
    class updateUIThread implements Runnable {

        private String msg;

        public updateUIThread(String str) {

            this.msg = str;

        }

        @Override

        public void run() {


                   recievemsg.setText(recievemsg.getText().toString() + "Client       Says: " + msg + "\n");



        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
            serverSocket.close();
            Log.e(TAG,"Socket Closed");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是我的客户端代码

public class Clientss extends AppCompatActivity {    

    private static final String TAG = "Client_Activity";
    private EditText etServerIp;
    private EditText etMsg;
    private Button btnConnectClients;
    private Button btnSendMsg;
     private TextView textIn;
    private String serverIpAddress = "";
     private String t;
    private boolean connected = false;
    DatagramSocket datagramSocket;
    DatagramPacket packet;
    private Socket socket;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clientss);

        Log.e(TAG, "ONCREATE METHOD");
        textIn = (TextView)findViewById(R.id.txt_msg);

        initializations();
        eventClickListener();
        try {
            datagramSocket = new DatagramSocket(8080);
            byte[] buffer = new byte[10];
            packet = new DatagramPacket(buffer, buffer.length);
            datagramSocket.receive(packet);
            byte[] buff = packet.getData();
            textIn.setText(buff.toString());
            System.out.println("this is incoming ip"+buff.toString());
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        // textIn.setText(t);
    }

    private void eventClickListener() {
        btnConnectClients.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!connected) {
                    serverIpAddress = etServerIp.getText().toString().trim();
                    connectsClient();
                }
            }
        });

        btnSendMsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = etMsg.getText().toString().trim();

                ClientResponseTask clientResponseTask=new ClientResponseTask(msg);
                clientResponseTask.execute();

            }
        });
    }

    private void connectsClient() {
        if (!serverIpAddress.equals("")) {
            Thread cThread = new Thread(new ClientThread());
            cThread.start();
        }
    }


    private void initializations() {
        etServerIp = (EditText) findViewById(R.id.etServerIp);
        etMsg = (EditText) findViewById(R.id.etMsg);
        btnSendMsg = (Button) findViewById(R.id.btnMsgSend);
        btnConnectClients = (Button) findViewById(R.id.btnConnect);

    }


    private class ClientThread implements Runnable {
        @Override
        public void run() {
            try {

                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);

                Log.e(TAG, "C: Connecting...");
                socket = new Socket(serverAddr, Server.SERVERPORT);
                System.out.println("this is socket"+socket);
                connected = true;
                Message msg = handler.obtainMessage();
                msg.arg1 = 1;
                handler.sendMessage(msg);
                //showToast("");
                Log.e(TAG, "C: Connected..." + socket);

            } catch (Exception e) {
                Log.e(TAG, "C: Error", e);
                connected = false;
            }
        }
    }

    private final Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if(msg.arg1 == 1)
                Toast.makeText(getApplicationContext(),"Connected...", Toast.LENGTH_LONG).show();
        }
    };



    @Override
    protected void onDestroy() {
        if (socket != null) try {
            socket.close();
            Log.e(TAG, "C: Socket Closed.");
        } catch (IOException e) {
            e.printStackTrace();
        } finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e){}
        }

        super.onDestroy();
    }


    protected class ClientResponseTask extends AsyncTask<Void,Void,Void> {
        String msg;

        ClientResponseTask(String msg){
            this.msg=msg;

        }

        @Override
        protected Void doInBackground(Void... params) {
            if (connected) {
                try {
                    PrintWriter out = new PrintWriter(new BufferedWriter(
                                                new OutputStreamWriter(socket.getOutputStream())), true);

                    out.println(msg);

                } catch (UnknownHostException e) {

                    e.printStackTrace();
                } catch (Exception e) {
                    Log.e(TAG, "Error", e);
                }
            }
            else {
                connectsClient();
            }
            return null;
        }
    }
}

请帮我找一个解决方案。

0 个答案:

没有答案