2011年3月15日 星期二

Java 網路程式 - 網路對播

透過 Java Socket 的 Client/Server 的實作來達成 雙方間一對一的通訊

但是同一時間只能有一方傳送資料,且 Server 端只能同時服務一個 Client

這樣的對播較容易實作,如需服務多個 Client 實則需透過執行緒去處理

這個之後我在發文吧,先來看看以下簡易的網路對播程式 在 Server/Client 的作法都類似

透過 flag 變數去控制目前是該等待接收資料 還是 輸入傳送資料

end 變數則是控制目前對話的狀態,true 為中止。以下片斷程式以 Client 為例

while(!end)
{
          while(flag == 0){       //傳送
                  //.....
                  if(message.equals("@"))    //遇到 @ 時,轉換 flag
           }
           while(flag ==1){     //接收
                 //.....
                 if(message.equals("@"))    //遇到 @ 時,轉換 flag
           }
}

ClientCom.java
import java.io.*;
import java.net.*;
public class ClientCom {
    public ClientCom(int port) {
        try{
            int flag = 0;
            boolean end = false;
            Socket client = new Socket("xxx.xxx.x.xx", port);  //目的端IP位址
            System.out.println("----  connect to xxx.xxx.x.xx ----");

            DataOutputStream dataout = new DataOutputStream(client.getOutputStream());
            DataInputStream datain = new DataInputStream(client.getInputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
            
            String message;
            while(!end){
               while(flag == 0 && !end){   //send
                   message = br.readLine();
                   dataout.writeUTF(message);
                   if(message.equals("#")){   //# 為結束目前對播
                       end = true;
                   }
                   if(message.equals("@")){   //@ 為更換目前的 flag
                       flag = 1;
                   }
               }
               while(flag == 1 && !end){  //receive
                   message = datain.readUTF();
                   System.out.println("[from server] : " + message);
                   if(message.equals("#")){
                       end = true;
                   }
                   if(message.equals("@")){
                       flag = 0;
                   }
               }
            }
            client.close();
        }catch(Exception e){
            System.out.println(e.getMessage());
            System.exit(-1);
     }
    }
  
    public static void main(String[] args)
    {
        int port = 0;
        if(args.length < 1)
        {
            System.out.println("Usage: java ClientCom [port]");
            System.exit(1);
        }else{
            port = Integer.parseInt(args[0]);
            ClientCom client = new ClientCom(port);
        }
    }
}

ServerCom.java

import java.io.*;
import java.net.*;
public class ServerCom {
    public ServerCom(int port) 
    {
        try{
            int flag = 0;
            boolean end = false;
            ServerSocket server = new ServerSocket(port);
            System.out.println("waiting...");
            Socket clientSocket = server.accept();
            java.util.Date currentDate = new java.util.Date();
            /*** 印出 client 的資料 ***/
            System.out.println("-----  Accept a client  -----");
            System.out.println("Clinet IP: " + clientSocket.getInetAddress().getHostAddress());
            System.out.println("Client Port: " + clientSocket.getPort());
            System.out.println("connect date: " + currentDate);
            System.out.println("-----  Accept a client  -----");
      
            DataOutputStream dataout = new DataOutputStream(clientSocket.getOutputStream());
            DataInputStream datain = new DataInputStream(clientSocket.getInputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   
            String message;
            while(!end)
            {
                while(flag == 0 && !end){  //receive
                    message = datain.readUTF();
                    System.out.println("[from client] : " + message);
                    if(message.equals("#")){
                        end = true;
                    }
                    if(message.equals("@")){
                        System.out.println("change to you");
                        flag = 1;
                    }
                }
                while(flag == 1 && !end){
                    message = br.readLine();
                    dataout.writeUTF(message); 
                    if(message.equals("#")){
                        end = true;
                    }
                    if(message.equals("@")){
                        flag = 0; 
                    }
  }
            }
            clientSocket.close();
 }catch(IOException e){
            System.out.println("Could not listen on port:" + port);
            System.exit(-1);
        }
    }
    public static void main(String[] args) 
    {
        int port;
        if(args.length < 1)
        {
            System.out.println("Usage: java Server_7 [port]");
            System.exit(1);
        }
        try{
            port = Integer.parseInt(args[0]);
            ServerCom s = new ServerCom(port);
        }
        catch(NumberFormatException e){
            System.out.println("Port is Integer!!");
        }
     } 
}

沒有留言:

張貼留言