如何与tcp服务器连续通信?

时间:2017-01-04 13:26:00

标签: java android sockets tcp

我有一个TCP客户端,目前正在作为终端工作。所以我可以手动发送消息给服务器。但这只是为了测试。

但是我需要与tcp服务器进行持续的通信。我有不同的片段来显示不同的数据。并且依赖于我希望发送消息的片段。对片段的归属消息始终是相同的。

示例:

如果片段1在GUI上处于活动状态:Message1,Answer1,M2,A2,M3,A3,M1,A1,M2,A2 ......

如果片段2在GUI上有效:M5,A5,M6,A6,M7,A7,M5,A5 ....

所以消息总是在重复,服务器的答案将在GUI上显示

我该怎么做?

TCP客户端代码:

public class Client {

    public static String ServerIP = "192.168.0.10";
    public static int ServerPort = 35000;

    // message to send to the server
    private String mServerMessage;
    // sends message received notifications
    private OnMessageReceived mMessageListener = null;
    // while this is true, the server will continue running
    private boolean mRun = false;
    // used to send messages
    private OutputStream mBufferOut;
    // used to read messages from the server
    private BufferedReader mBufferIn;

    /**
     * Constructor of the class. OnMessagedReceived listens for the messages received from server
     */
    public Client(OnMessageReceived listener) {
        mMessageListener = listener;
    }

    /**
     * Sends the message entered by client to the server
     *
     * @param message text entered by client
     */
    public void sendMessage(String message) {
        if (mBufferOut != null ) {
            try {
                mBufferOut.write((message + "\r\n").getBytes());
                mBufferOut.flush();
            }   catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * Close the connection and release the members
     */
    public void stopClient() {
        Log.i("Debug", "stopClient");

        // send mesage that we are closing the connection
        //sendMessage(Constants.CLOSED_CONNECTION + "Kazy");

        mRun = false;

        if (mBufferOut != null) {
            try {
                mBufferOut.flush();
                mBufferOut.close();
            }   catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        mMessageListener = null;
        mBufferIn = null;
        mBufferOut = null;
        mServerMessage = null;
        Log.i("Debug", "disconnected");
    }

    public void run() {

        mRun = true;

        try {
            //here you must put your computer's IP address.
            InetAddress serverAddr = InetAddress.getByName(ServerIP);

            Log.e("TCP Client", "C: Connecting...");

            //create a socket to make the connection with the server
            Socket socket = new Socket(serverAddr, ServerPort);

            try {
                Log.i("Debug", "inside try catch");
                //sends the message to the server
                mBufferOut = socket.getOutputStream();

                //receives the message which the server sends back
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                MainActivity.ColorBoxHandler.sendEmptyMessage(0);

                while (mRun) {
                    mServerMessage = mBufferIn.readLine();
                    if (mServerMessage != null && mMessageListener != null) {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(mServerMessage);
                    }

                }
                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

            } catch (Exception e) {

                Log.e("TCP", "S: Error", e);

            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
                socket.close();
                MainActivity.ColorBoxHandler.sendEmptyMessage(1);
            }

        } catch (Exception e) {

            Log.e("TCP", "C: Error", e);

        }

    }

    //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity
    //class at on asynckTask doInBackground
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }
}

0 个答案:

没有答案