簡體   English   中英

Android TCP連接(服務器 - 客戶端編程)

[英]Android TCP Connection(server-client programming)

我在java eclipse中為使用android TCP連接的服務器客戶端聊天編寫了一個代碼。 代碼運行良好,客戶端是android,服務器是java。 問題是當我關閉客戶端並重新打開它以恢復與服務器的連接時,它不起作用。 服務器無法再次找到其客戶端。 我只想將請求發送到客戶端以進行重新連接並恢復服務器客戶端聊天。 我正在附加有三個類的java服務器的代碼。

TCPServer.java

 public class TCPServer extends Thread {

    public static final int SERVERPORT = 1234;
    private boolean running = false;
    private PrintWriter mOut;
    private OnMessageReceived messageListener;
    private MyThread ts1,t;

    public static void main(String[] args) {

        //opens the window where the messages will be received and sent
        ServerBoard frame = new ServerBoard();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

    }

    /**
     * Constructor of the class
     * @param messageListener listens for the messages
     */
    public TCPServer(OnMessageReceived messageListener) {
        this.messageListener = messageListener;
        ts1=new MyThread();
        ts1.ts1=this;
    }


    /**
     * Method to send the messages from server to client
     * @param message the message sent by the server
     */
    public void sendMessage(String message){
        if (mOut != null && !mOut.checkError()) {
            mOut.println(message);
            mOut.flush();
        }
    }

    @Override
    public void run() {
        super.run();

        running = true;

        try {
            System.out.println("S: Connecting...");


            ServerSocket serverSocket = new ServerSocket(SERVERPORT);


            Socket client = serverSocket.accept();
            ts1.start();
            System.out.println("S: Receiving...");

            try {

                //sends the message to the client
                mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);

                //read the message received from client
                BufferedReader in = new BufferedReader(new   InputStreamReader(client.getInputStream()));


                //this while it's like a listener for messages
                while (running) {
                    String message = in.readLine();

                    if (message != null && messageListener != null) {
                        //call the method messageReceived from ServerBoard class
                        messageListener.messageReceived(message);
                    }
                }


            } catch (Exception e) {
                System.out.println("S: Error");
                e.printStackTrace();
            } finally {
                client.close();
                System.out.println("S: Done.");
            }

        } catch (Exception e) {
            System.out.println("S: Error");
            e.printStackTrace();
        }

    }



//class at on startServer button click
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }


    public void myfunc() throws Exception {
        ServerSocket serverSocket = null;
        // TODO Auto-generated method stub

         Socket client = serverSocket.accept();
         mOut = new PrintWriter(new BufferedWriter(new   OutputStreamWriter(client.getOutputStream())), true);
         BufferedReader in = new BufferedReader(new    InputStreamReader(client.getInputStream()));
        try{
         while (true) {
             String message = in.readLine();

            // if (message != null && messageListener != null) {
                 //call the method messageReceived from ServerBoard class
              //   messageListener.messageReceived(message);
             System.out.println(message);
             System.out.println("S: hellError");

             }
         }
         finally{}

     } 


    }


## ServerBoard.java ##

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;


    public class ServerBoard extends JFrame {
    private JTextArea messagesArea;
    private JButton sendButton;
    private JTextField message;
    private JButton startServer;
    private TCPServer mServer;

    public ServerBoard() {

        super("ServerBoard");

        JPanel panelFields = new JPanel();
        panelFields.setLayout(new BoxLayout(panelFields,BoxLayout.X_AXIS));

        JPanel panelFields2 = new JPanel();
        panelFields2.setLayout(new BoxLayout(panelFields2,BoxLayout.X_AXIS));

        //here we will have the text messages screen
        messagesArea = new JTextArea();
        messagesArea.setColumns(30);
        messagesArea.setRows(10);
        messagesArea.setEditable(false);

        sendButton = new JButton("Send");
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // get the message from the text view
                String messageText = message.getText();
                // add message to the message area
                messagesArea.append("\n" + messageText);
                // send the message to the client
                mServer.sendMessage(messageText);
                // clear text
                message.setText("");
            }
        });

        startServer = new JButton("Start");
        startServer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // disable the start button
                startServer.setEnabled(false);

                //creates the object OnMessageReceived asked by the TCPServer constructor
                mServer = new TCPServer(new TCPServer.OnMessageReceived() {
                    @Override


                    //TCPServer class (at while)
                    public void messageReceived(String message) {
                        messagesArea.append("\n "+message);
                    }
                });
                mServer.start();

            }
        });

        //the box where the user enters the text (EditText is called in Android)
        message = new JTextField();
        message.setSize(200, 20);

        //add the buttons and the text fields to the panel
        panelFields.add(messagesArea);
        panelFields.add(startServer);

        panelFields2.add(message);
        panelFields2.add(sendButton);

        getContentPane().add(panelFields);
        getContentPane().add(panelFields2);


        getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));

        setSize(300, 170);
        setVisible(true);
    }
    }


## MyThread.java ##


        public class MyThread extends Thread{
    public TCPServer ts1;


    public void run()
    {
        super.run();

            try {
                //if(ts1!=null)
                ts1.myfunc();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println("S: Error");
                e.printStackTrace();
            }
    }

    }

您需要在循環中運行accept-read-write代碼。 否則,您的服務器將只接受一個客戶端連接並退出。

喜歡

while (true)
{
    accept(...)

    read-and-write()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM