以現實中的例子
如果有投手(Client)投球,那就會有捕手(Server)接球
Service以下的例子為例,是不斷地等待相關的訊息
如果有收到相關的訊息,那就會顯示在畫面上
Main.java
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class MainActivity extends Activity {
    TextView test;
    TextView test2;
    private Handler handler = new Handler();
    private ServerSocket serverSocket;
    private String line ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test = (TextView) findViewById(R.id.text1);
        test2 = (TextView) findViewById(R.id.text2);
        //建立Thread
        Thread fst = new Thread(socket_server);
        //啟動Thread
        fst.start();
    }
    //取得IP
    private String getMyIp(){
        //新增一個WifiManager物件並取得WIFI_SERVICE
        WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);
        //取得wifi資訊
        WifiInfo wifiInfo = wifi_service.getConnectionInfo();
        //取得IP,但這會是一個詭異的數字,還要再自己換算才行
        int ipAddress = wifiInfo.getIpAddress();
        //利用位移運算和AND運算計算IP
        String ip = String.format("%d.%d.%d.%d",(ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));
        return ip;
    }
    private Runnable socket_server = new Runnable(){
        public void run(){
            handler.post(new Runnable() {
                public void run() {
                    test.setText("Listening...." + getMyIp());
                }
            });
            try{
                //建立serverSocket
                serverSocket = new ServerSocket(1234);
                //等待連線
                while (true) {
                    //接收連線
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() {
                        public void run() {
                            test.setText("Connected.");
                        }
                    });
                    try {
                        //接收資料
                        DataInputStream in = new DataInputStream(client.getInputStream());
                        line = in.readUTF();
                        while (line != null) {
                            handler.post(new Runnable() {
                                public void run() {
                                    test2.setText(line);
                                }
                            });
                        }
                        break;
                    } catch (Exception e) {
                        handler.post(new Runnable() {
                            public void run() {
                                test.setText("傳送失敗");
                            }
                        });
                    }
                }
            }catch(IOException e){
                handler.post(new Runnable() {
                    public void run() {
                        test.setText("建立socket失敗");
                    }
                });
            }
        }
    };
}
最後記得要加上權限
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
歡迎轉載,請註明出處。
 
作者已經移除這則留言。
回覆刪除想問一下這個範例是針對android 傳給androdi 嗎?
回覆刪除因為我現在想用PC傳給android,可是卻一直卡在line = in.readUTF();這行
因為我下面有寫println 結果東西傳進來連println都沒有動作
想問一下 Jing Xun Chen 大有發生過類似的情形嗎?
您好 :
刪除N acicor,發生您所說一直會卡在這一段(line = in.readUTF();)通常是等不到相關參數所造成的,如果可以的畫是否C端跟S端都用Android看看??
我也遇到這樣的問題過,
刪除有網友分享文提及相關問題:
後來於PC Sever發出的訊息尾端加入“\n",
Android Client就能正常收到訊息了!
作者已經移除這則留言。
回覆刪除你好:
回覆刪除請教一下,此範例只顯示第一次收到資料
那如果我要不斷接收,並顯示,該如何修改?
我與上面那個人有一樣的問題
回覆刪除此範例只顯示第一次收到資料
那如果我要不斷接收,並顯示,該如何修改?
謝謝您