1. 程式人生 > >Flash Socket 程式設計 1

Flash Socket 程式設計 1

               

 Flash 在8.0的時候已經有了關於socket 一些功能,但是功能還侷限在一定角落裡面。在9.0的 player 發展後,socket處理有了很大的改善,可以傳送一些二進位制的資料,從而通訊能力大大提高。在說socket程式設計之前,我們還是不能忘記,flash在伺服器領域還是“小學生”,不過在客戶端領域,它就是一個“研究生”;

首先我們看一些利用java做客戶端,java做伺服器來搭建一個最簡單的通訊。所用到的知識,包括輸入輸出流,還有Socket知識點。

原理: 通訊的過程,是一個雙工的過程,也就是說,客戶端既然 傳送端 也是接收端 。同樣伺服器也是一樣。

socket 圖解

從這裡可以看出,客戶端的輸入流 就是伺服器的輸出流所傳送來的資訊。而伺服器的輸入流同樣是客戶端所傳送來的

一,客戶端

[c-sharp] view plain copy print?
  1. package com;  
  2. import java.net.*;  
  3. import java.io.*;  
  4. publicclass TcpClient {  
  5.     publicstaticvoid main(String[] args) {  
  6.         String host="127.0.0.1";  
  7.         int port =8001;  
  8.         try {  
  9.             Socket s = new Socket(host,port);  
  10.             InputStream ips =s.getInputStream();  
  11.             OutputStream ops=s.getOutputStream();  
  12.             BufferedReader brNet = new BufferedReader(  
  13.                     new InputStreamReader(ips));//輸入流
  14.             PrintWriter pw = new PrintWriter(ops,true);  
  15.             BufferedReader brKeyBoard = new BufferedReader(  
  16.                     new InputStreamReader(System.
    in));//鍵盤緩衝
  17.             while(true){  
  18.                 String strWord =brKeyBoard.readLine();  
  19.                 pw.println("Jim:"+strWord+"/n");  
  20.                 System.out.println(brNet.readLine());  
  21.             }  
  22.             //pw.close();
  23.         //  brNet.close();
  24.         //  brKeyBoard.close();
  25.         //  s.close();
  26.         } catch (UnknownHostException e) {  
  27.             // TODO 自動生成 catch 塊
  28.             e.printStackTrace();  
  29.         } catch (IOException e) {  
  30.             // TODO 自動生成 catch 塊
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34. }  
package com;import java.net.*;import java.io.*;public class TcpClient { public static void main(String[] args) {  String host="127.0.0.1";  int port =8001;  try {   Socket s = new Socket(host,port);      InputStream ips =s.getInputStream();   OutputStream ops=s.getOutputStream();   BufferedReader brNet = new BufferedReader(     new InputStreamReader(ips));//輸入流        PrintWriter pw = new PrintWriter(ops,true);   BufferedReader brKeyBoard = new BufferedReader(     new InputStreamReader(System.in));//鍵盤緩衝   while(true){    String strWord =brKeyBoard.readLine();    pw.println("Jim:"+strWord+"/n");    System.out.println(brNet.readLine());      }   //pw.close();  // brNet.close();  // brKeyBoard.close();  // s.close();  } catch (UnknownHostException e) {   // TODO 自動生成 catch 塊   e.printStackTrace();  } catch (IOException e) {   // TODO 自動生成 catch 塊   e.printStackTrace();  } }}

程式的入口:是main 函式。

在main函式裡面建立一個socket物件: Socket s = new Socket(host,port);

並寫上兩個引數,一個是主機名,也是ip ,而port 就是埠,指定一個埠。(這個埠要在允許的範圍填寫)

接下來,建立兩個輸入輸出流:

InputStream ips =s.getInputStream();OutputStream ops=s.getOutputStream();

通過Socket類的 getInputStream 和getOutputStream 返回輸入輸出流資訊

為了使效率提高,在客戶端引用緩衝。BufferedReader類用於緩衝使用。

BufferedReader brNet = new BufferedReader(     new InputStreamReader(ips));//輸入流        BufferedReader brKeyBoard = new BufferedReader(     new InputStreamReader(System.in));//鍵盤緩衝

下一步 接收鍵盤輸入的資訊 以及 傳送資訊到伺服器端裡面去:

while(true){    String strWord =brKeyBoard.readLine();    pw.println("Jim:"+strWord+"/n");    System.out.println(brNet.readLine());      }

Socket 會丟擲OException 異常,所以要進行捕捉。try{}catch()處理機制

二 伺服器:

[c-sharp] view plain copy print?
  1. package com;  
  2. import java.net.*;  
  3. import java.io.*;  
  4. publicclass Server {  
  5.     publicstaticvoid main(String[] args) {  
  6.      PrintWriter os=null;  
  7.         try{  
  8.         ServerSocket ss=new ServerSocket(8001);  
  9.         System.out.println("等待連線....");  
  10.         Socket sk=ss.accept();  
  11.         System.out.println("連線成功....");  
  12.         BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));   
  13.         System.out.println("獲取裡面的內容......");   
  14.         //等待接受資訊 
  15.         os = new PrintWriter(sk.getOutputStream());   
  16.        String word=null ;  
  17.       //傳送資訊 
  18.       while((word=br.readLine())!=null)  
  19.       {      
  20.        os.println("你好我是伺服器");   
  21.        os.flush();   
  22.        System.out.println("內容:" + word);  
  23.       }  
  24.     }  
  25.         catch(IOException ex)  
  26.         {  
  27.             ex.printStackTrace();  
  28.         }  
  29.     }  
  30. }  
package com;import java.net.*;import java.io.*;public class Server {      public static void main(String[] args) {  PrintWriter os=null;  try{  ServerSocket ss=new ServerSocket(8001);  System.out.println("等待連線....");  Socket sk=ss.accept();  System.out.println("連線成功....");  BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));      System.out.println("獲取裡面的內容......");      //等待接受資訊         os = new PrintWriter(sk.getOutputStream());     String word=null ;   //傳送資訊    while((word=br.readLine())!=null)   {        os.println("你好我是伺服器");     os.flush();     System.out.println("內容:" + word);       } }  catch(IOException ex)  {   ex.printStackTrace();     } }}

伺服器搭建其實也很簡單

首先建立一個ServerSocket ss=new ServerSocket(8001);

ServerSocket 物件,然後呼叫 accept()方法

Socket sk=ss.accept();一直阻塞,直到返回Socket物件這樣我們就可以像在客戶端一樣進行輸入流和輸入出的處理。並返回輸出結果 緩衝等等

輸出結果:將客戶端傳送的字串進行輸出

  while((word=br.readLine())!=null)   {        os.println("你好我是伺服器");     os.flush();     System.out.println("內容:" + word);       }

但問題其實還是有的,在客戶端傳送的時候,由於沒有過濾掉回車符所以在伺服器裡面會輸出兩個結果

等待連線....連線成功....獲取裡面的內容......內容:Jim:dd

內容:

注意一個是有內容,一個是沒有內容導致這個Tcp的通訊出現問題。

接下來,我們嘗試搭建flash客戶端

Flash socket程式設計(2)