單工連線應用

網路傳輸可分為三種傳輸模式:單工、半雙工、全雙工。單工通信(simplex)只能在一個方向傳輸,任何時候不能改變傳輸方向。 為保證正確傳送資料,接收端要對接收的數據進行校驗,若校驗出錯,則按照通訊協請求重發的信號。 此種方式適用於資料收集,如各地氣象資料的收集、交通流量的集中計算等。除資料收集外,也可使用於單工設備的控制。 例如...

單工客戶端(Client)程式 Socket03

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;

public class Socket03 {
 /**
  * 觸發單工伺服器
  * 
  * @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 outstream = new DataOutputStream(socket.getOutputStream());
  outstream.writeUTF("time");
  socket.close();// 結束連線

 }

}


建立socket後至結束連線的過程中,可以夾帶連線中要做的相關工作。
Socket socket = new Socket(InetAddress.getByName(ip), port);// 建立Socket連線

...
...
...
  
socket.close();// 結束連線
送出串流資料須用到 DataOutputStream ,writeUTF方法將字串編成UTF-8格式傳輸。
  DataOutputStream outstream = new DataOutputStream(socket.getOutputStream());
  outstream.writeUTF("time");


單工主機端(Server)程式 Socket04

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Socket04 {
 /**
  * 單工伺服器
  * 
  * @param args
  * @throws IOException
  * @throws InterruptedException
  */
 public static void main(String args[]) throws IOException {

  Socket socket;
  BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

  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("伺服器已建立, 等待連接...");

  while (true) {
   socket = server.accept();
   System.out.println("現在與 " + socket.getInetAddress().getHostAddress() + "連線");
   System.out.println("對方的電腦名稱:" + socket.getInetAddress().getHostName());
   java.awt.Toolkit.getDefaultToolkit().beep();
   socket.close();
  }
 }
}


建立伺服器後想要維持不中斷的服務,需要用到無窮迴圈。
while (true) {
  ...
  ...
  ...
  ...
}
迴圈中每次建立起來的socket連線在工作結束後中斷,但是在中斷前仍會佔用連線。
while (true) {
    socket = server.accept();

    ...
    ...
    ...

    socket.close();
}



單工 (Simplex) 通訊雙方只能進行單向的資料傳輸 發送端與接收端角色分得很清楚。發送端只能發送訊息出去,不能接收訊息;接收端只能接收訊息,不能發送訊息出去。 例如收音機、電視機,只能接收電視台的節目,但無法發出訊號給電台。

沒有留言:

張貼留言