
半雙工
半雙工的系統可以比喻作單線雙向道路,若道路上無車時任一方向的車都可以通過。但若道路上有車,相反方向的車需等待路途中的車通過道路後才能通過。無線電對講機就是使用半雙工系統。由於對講機傳送及接收使用相同的頻率,不允許同時進行。因此一方講完後,需設法告知另一方講話結束,另一方才知道可以開始講話。半雙工客戶端(Client)程式 Socket05
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; public class Socket05 { /** * 觸發半雙工伺服器 * * @param args * @throws IOException */ public static void main(String args[]) throws IOException { BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); System.out.print( "請輸入IP: " ); String ip = buf.readLine(); // 讀取輸入值為IP System.out.print( "請輸入連接埠: " ); int port = Integer.parseInt(buf.readLine()); // 讀取輸入值為port Socket socket = new Socket(InetAddress.getByName(ip), port); // 建立Socket連線 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); DataInputStream input = new DataInputStream(socket.getInputStream()); String msg; while ( true ) { System.out.print( "請輸入訊息: " ); msg=buf.readLine(); out.writeUTF(msg); if (msg.equals( "bye" )) break ; msg = input.readUTF(); System.out.println( "接收到訊息: " + msg); if (msg.equals( "bye" )) break ; } input.close(); out.close(); socket.close(); // 結束連線 System.out.println( "與 " +ip+ " 連線已結束" ); } } |
建立半雙工的通信需要具備輸入串流與輸出串流
在迴圈中依照輸入或輸出的串流做readUTF、writeUTF方法將字串編成UTF-8格式存取。
12DataOutputStream out =
new
DataOutputStream(socket.getOutputStream());
DataInputStream input =
new
DataInputStream(socket.getInputStream());
1234outstream.writeUTF(msg);
...
...
msg = input.readUTF();
半雙工主機端(Server)程式 Socket06
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Socket06 { /** * 半雙工伺服器 * @param args * @throws IOException * @throws InterruptedException */ public static void main(String args[]) throws IOException { Socket socket; BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); DataInputStream input; DataOutputStream out; System.out.print( "請輸入連接埠號: " ); String port = buf.readLine(); ServerSocket server = new ServerSocket(Integer.parseInt(port)); System.out.print( "本機位址: " + InetAddress.getLocalHost().getHostAddress()); System.out.println( " 開放連接埠: " + port); System.out.println( "伺服器已建立, 等待連接..." ); String msg, ip; while ( true ) { socket = server.accept(); ip=socket.getInetAddress().getHostAddress(); System.out.println( "現在與 " + ip + "連線" ); System.out.println( "對方的電腦名稱:" + socket.getInetAddress().getHostName()); java.awt.Toolkit.getDefaultToolkit().beep(); input = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); while ( true ) { msg = input.readUTF(); System.out.println( "接收到訊息: " + msg); if (msg.equals( "bye" )) break ; System.out.print( "請輸入訊息: " ); msg=buf.readLine(); out.writeUTF(msg); } System.out.println( "與 " +ip+ " 連線已結束" ); input.close(); out.close(); socket.close(); //server.close(); } } } |
建立半雙工的通信需要具備輸入串流與輸出串流
在迴圈中依照輸入或輸出的串流做readUTF、writeUTF方法將字串編成UTF-8格式存取。與客戶端的連線結束後,並不會結束伺服器的服務。
12DataOutputStream out =
new
DataOutputStream(socket.getOutputStream());
DataInputStream input =
new
DataInputStream(socket.getInputStream());
123456789while
(
true
){
...
...
while
(
true
){
}
}
建立桌面應用程式
網路連線運作,經過設計後可以進一步應用在個人電腦成為通訊軟體。建立個人電腦上的應用程式,大多使用視窗操作介面。使用JAVA建立視窗介面可以參考這裡
桌面應用的客戶端程式至少需要下列元件,包括終端機介面中的所有輸入/出參數,以及取代暫存鍵盤輸入及終端機輸出。
請依據範例建立視窗,並且設定相對應的名稱。
可以使用範例中的建議名稱,或是自定易記名稱。
請注意,終端機視窗、訊息輸入欄位以及發送按鈕預設都是關閉使用的。
請至少要關閉掉發送按鈕
客戶端(Client)視窗程式(片段) Socket07
需要具備的工具先設定為全域可以存取的物件,因此放在最外層的範圍。
Socket socket;
DataOutputStream out;
DataInputStream input;
1 2 3 | Socket socket; DataOutputStream out; DataInputStream input; |
客戶端(Client)連線按鈕
在設計模式下(Design)以滑鼠連點2下連線用的按鈕物件,就會自動切到原始碼模式(Source)按鈕觸發的程式區塊。將下列程式碼複製進去,讓連線按鈕發生作用。1 2 3 4 5 6 7 8 9 10 | try { socket = new Socket(InetAddress.getByName(ip.getText()), Integer.parseInt(port.getText())); // 建立Socket連線 out = new DataOutputStream(socket.getOutputStream()); input = new DataInputStream(socket.getInputStream()); info.setEnabled( true ); msg.setEnabled( true ); } catch (Exception ex) { } |
客戶端(Client)訊息發送按鈕
在設計模式下(Design)以滑鼠連點2下連線用的按鈕物件,就會自動切到原始碼模式(Source)按鈕觸發的程式區塊。將下列程式碼複製進去,讓連線按鈕發生作用。1 2 3 4 5 6 7 8 9 10 11 | info.append( "我: " +msg.getText()+ "\n" ); System.out.println(msg.getText()); try { out.writeUTF(msg.getText()); while ( true ) { info.append( "對方: " +input.readUTF()+ "\n" ); break ; } } catch (IOException ex) { ex.printStackTrace(); } |
沒有留言:
張貼留言