Flash Socket 程式設計 1
Flash 在8.0的時候已經有了關於socket 一些功能,但是功能還侷限在一定角落裡面。在9.0的 player 發展後,socket處理有了很大的改善,可以傳送一些二進位制的資料,從而通訊能力大大提高。在說socket程式設計之前,我們還是不能忘記,flash在伺服器領域還是“小學生”,不過在客戶端領域,它就是一個“研究生”;
首先我們看一些利用java做客戶端,java做伺服器來搭建一個最簡單的通訊。所用到的知識,包括輸入輸出流,還有Socket知識點。
原理: 通訊的過程,是一個雙工的過程,也就是說,客戶端既然 傳送端 也是接收端 。同樣伺服器也是一樣。
從這裡可以看出,客戶端的輸入流 就是伺服器的輸出流所傳送來的資訊。而伺服器的輸入流同樣是客戶端所傳送來的
一,客戶端
[c-sharp] view plain copy print?- package com;
- import java.net.*;
- import java.io.*;
- publicclass TcpClient {
- publicstaticvoid 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.
- 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?- package com;
- import java.net.*;
- import java.io.*;
- publicclass Server {
- publicstaticvoid 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)