伺服器廣播程式範例

 範例二-伺服器廣播程式
連線程式的伺服器有很多時候都必須用到廣播的功能,以下就為各位示範基礎的伺服器廣播程式。

 圖1-2為伺服器執行成功的畫面,可以看到下方的訊息欄顯示"Server is start. Wait client connect",也就是持續等待客戶端連入。
server2.JPG
圖1-2

 圖1-3為使用模擬器開啟客戶端後連入伺服器的展示圖,可以看到下方訊息欄除了一開始的"Server is start. Wait client connect"外,還出現了"Server:",用意在於讓伺服端可以輸入欲廣播的訊息,讓伺服器廣播給客戶端。

Client2.JPG
圖1-3

 以下為客戶端與伺服端的程式碼

 廣播程式-客戶端
專案下載:ClientSocketDemo2.rar

package ccc.ClientSocketDemo2;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;            // 引用Hander 
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
 
import ccc.ClientSocketDemo2.R; // ?????????
 
public class ClientSocketDemo2 extends Activity {
    public static Handler mHandler = new Handler();
    TextView TextView01;
    String tmp;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        TextView01 =(TextView)findViewById(R.id.TextView01);
 
        // 初始化執行緒 
          Thread t=new Thread(readData);
          t.start();
    }
 
    // 用來更新文字方塊中的文字
    private Runnable updateText = new Runnable() {
        public void run() {           
            TextView01.append(tmp+"\n");
        }
    };
 
    // Listen
    private Runnable readData = new Runnable() {
        public void run() {
                InetAddress serverIp;
 
                try {
                    serverIp = InetAddress.getByName("192.168.60.251");
                    int serverPort=5050;
                    Socket clientSocket=new Socket(serverIp,serverPort);
                    BufferedReader  br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
 
                    // 當連接成功的時候接收傳來的訊息
                    while(clientSocket.isConnected()){    
                     tmp= br.readLine();
                     mHandler.post(updateText);
                    }
 
                } catch (IOException e) {
 
                }
        }
    };
}

 廣播程式-伺服器
SocketServerDemo2.rar

import java.io.BufferedReader;            // 引用讀取串流
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;        // 引用串流讀取
import java.io.OutputStreamWriter;
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class SocketServerDemo2 {
    private static ServerSocket serverSocket;
 
    public static void main(String[] args) {
        int port=5050;
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Server is start.Wait clinet connect");
            Socket socket = serverSocket.accept();
            BufferedWriter bw =    new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
            bw.write("Hello! This is sever msg.\n");
            bw.flush();
 
            // 當連線成功時不斷執行
            while(socket.isConnected()){
 
                // 初始化從鍵盤讀取文字功能
                BufferedReader  br=new BufferedReader(new InputStreamReader(System.in));
                System.out.printf("Server:");
 
                // 傳送鍵盤輸入的訊息 
                bw.write(br.readLine()+"\n");
 
                // 立即傳送
                bw.flush();
            }
        } catch (IOException e) {
            System.out.println("Socket ERROR");
        }
        System.out.println("Socket is End");
    }
}

Activity介面程式碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:id="@+id/TextView01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="ccc.ClientSocketDemo2"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ClientSocketDemo1"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
    </application>
    <uses-sdk android:minSdkVersion="4" />
 
    <!-- 這是註解 -->
    <uses-permission android:name="android.permission.INTERNET" />  
    <!--  由於需使用到網路的功能,所以必須加上面這行來取得權限-->
</manifest>

 程式影片解說