簡體   English   中英

使用TCP套接字將文本從服務發送到服務器

[英]Sending text from service to server using TCP socket

以下是主要的活動代碼,我在該代碼中通過服務廣播獲取了文本,我想使用wifi將這些文本轉發到服務器。

我當時以為我可以將此應用程序注冊為客戶端,然后將文本發送到安裝了服務器應用程序的另一部手機。 但是我不確定該怎么做。 它應該自動完成而無需按下任何按鈕。

有任何想法嗎???

這段代碼是從不同的示例中組合而成的,如果看起來很粗糙,但至少可以正常工作,請抱歉;)

我分隔了為TCP客戶端添加的行:

//用於套接字客戶端啟動

//用於套接字客戶端

謝謝!

import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.SystemClock;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class MainActivity extends Activity {

public  ResponseReceiver receiver;
public  CountDownTimer countDownTimer;

//for socket client start
private Socket socket;
private static final int SERVERPORT = 6000;
private static final String SERVER_IP = "192.168.0.106";
//for socket client end


final BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            //Do something if connected
            Toast.makeText(getApplicationContext(), "SINIHAMMAS OLEMAS", Toast.LENGTH_SHORT).show();
            SystemClock.sleep(3000);
            Intent i = getBaseContext().getPackageManager()
                    .getLaunchIntentForPackage( getBaseContext().getPackageName() );
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            countDownTimer.cancel();
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            Toast.makeText(getApplicationContext(), "SINIHAMMAS LAHTI", Toast.LENGTH_SHORT).show();

            countDownTimer.start();

        }//else if...
    }//onReceive
};//BroadcastReceiver

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    long startTime = 30000;
    long interval = 1000;
    countDownTimer = new MyCountDownTimer(startTime, interval);

    IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
    IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
    IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    this.registerReceiver(mReceiver, filter1);
    this.registerReceiver(mReceiver, filter2);
    this.registerReceiver(mReceiver, filter3);

    final AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

//for socket client start
    new Thread(new ClientThread()).start();
//for socket client end

    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            Log.d("sinihammas", "Audio SCO state: " + state);

            if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {

                unregisterReceiver(this);
            }//if

        }//onRecieve
    }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));//registerReciever

    Log.d("sinihammas", "starting bluetooth");
    am.startBluetoothSco();

    SystemClock.sleep(2000);


            Intent msgIntent = new Intent(MainActivity.this, SimpleIntentService.class);
            startService(msgIntent);

            final Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    am.setBluetoothScoOn(false);
                    am.stopBluetoothSco();
                    System.exit(0);
                }
            });

            IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
            filter.addCategory(Intent.CATEGORY_DEFAULT);
            receiver = new ResponseReceiver();
            registerReceiver(receiver, filter);


        }//onCreate

        public class ResponseReceiver extends BroadcastReceiver {
            public static final String ACTION_RESP = "alar.alar.com.rahelividinakes2.MESSAGE_PROCESSED";

            @Override
            public void onReceive(Context context, Intent intent) {
                TextView result = (TextView) findViewById(R.id.textView);
                String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
                result.setText(Html.fromHtml(text + "<br>" + result.getText()));


**I THINK I SHOULD SEND TEXT HERE, BUT I DONT KNOW HOW**


            }//onReceive

        }//BroadcastReceiver

public class MyCountDownTimer extends CountDownTimer {
    MediaPlayer mediaPlayer = MediaPlayer.create(alar.alar.com.rahelividinakes2.MainActivity.this, R.raw.haire);


    public MyCountDownTimer(long startTime, long interval) {
        super(startTime, interval);
    }

    @Override
    public void onFinish() {
        mediaPlayer.start();
        SystemClock.sleep(7000);
        mediaPlayer.release();

    }

    @Override
    public void onTick(long millisUntilFinished) {

    }


}

//for socket client start
class ClientThread implements Runnable {

    @Override
    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

            socket = new Socket(serverAddr, SERVERPORT);

        } catch (UnknownHostException e1){
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}
//for socket client end

    }//Activity

服務器代碼已 編輯

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class MainActivity extends Activity {

private ServerSocket serverSocket;

Handler updateConversationHandler;

Thread serverThread = null;

private TextView text;

public static final int SERVERPORT = 6000;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    text = (TextView) findViewById(R.id.text2);

    updateConversationHandler = new Handler();

    this.serverThread = new Thread(new ServerThread());
    this.serverThread.start();

}

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while (!Thread.currentThread().isInterrupted()) {
            try {
                socket = serverSocket.accept();
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();
            } catch (IOException e) {
                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() {
        text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");
    }
}
}

首先,由於可能的ANRMainActivity.onCreate()中的SystemClock.sleep()是一個非常糟糕的主意。

您的問題實際上包含2個子問題:

  1. 如何將我們的數據發送到客戶端線程?

將隊列成員添加到活動類。 我們將在客戶端線程中使用它。

    //for socket client start
    private Socket socket;
    private static final int SERVERPORT = 6000;
    private static final String SERVER_IP = "192.168.0.106";
    private ConcurrentLinkedQueue<String> mSendQueue = new ConcurrentLinkedQueue<String>();
    //for socket client end

並使ResponseReceiver將數據添加到隊列。

    public class ResponseReceiver extends BroadcastReceiver {
        public static final String ACTION_RESP = "alar.alar.com.rahelividinakes2.MESSAGE_PROCESSED";

        @Override
        public void onReceive(Context context, Intent intent) {
            TextView result = (TextView) findViewById(R.id.textView);
            String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
            result.setText(Html.fromHtml(text + "<br>" + result.getText()));

            MainActivity.this.mSendQueue.add(text);

        }//onReceive

    }//BroadcastReceiver
  1. 如何通過套接字發送數據?

在ClientThread中使用隊列

    class ClientThread implements Runnable {

        private final ConcurrentLinkedQueue<String> mQueue;

        public ClientThread(ConcurrentLinkedQueue<String> queue) {
            mQueue = queue;
        }

    @Override
    public void run() {

    try {
        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

        socket = new Socket(serverAddr, SERVERPORT);

        OutputStream stream = socket.getOutputStream();

        while(true) {
            String data = mQueue.poll();
            if(data == null) {
                //queue is empty, waiting...
                SystemClock.sleep(100);
                continue;
            }

            byte[] bytes = data.getBytes();
            stream.write(bytes, 0, bytes.length);
            stream.flush();
        }

    } catch (UnknownHostException e1){
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    } finally {
        //free resources
    }
}
}
//for socket client end

暫無
暫無

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

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