国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用java編寫客戶-服務器程序的若干心得

2019-11-18 12:42:52
字體:
來源:轉載
供稿:網友

  (1) 我們在DOS命令行上用jview啟動服務器server.class時,一般無法知道jview server.class的實例是否已在運行,利用c語言操作上鎖文件的_sopen及內部涉及系統調用的_locking函數,可解決此問題:
    #include < io.h >
    #include < fcntl.h >
    #include < process.h >
    #include < share.h >
    #include < stdio.h >
    #include < sys/locking.h >
    #include < sys/stat.h >
    #include < sys/types.h >
    void main(){
     int f,g;
     f=_sopen("c://f0",_O_CREAT_O_TRUNC,
      _SH_DENYNO,_S_IWRITE);
     if ((g=_locking(f,_LK_NBLCK,1))==0){
      system("jview server.class");exit(0);
     }
     else
          }
  先用建立方式打開"c:/f0",這一步總能成功,然后調用_locking,試圖上鎖其第1個字節,因系統調用期間不答應進程的切換,故這一步不會導致并發問題,返回值g是可靠的.若無實例正在運行,則上鎖成功,可用system啟動jview server.class,完成任務后,用exit釋放所有資源并退出;若有實例在運行,則上鎖失敗,顯示"jview server已啟動"后退出.
  
  (2) 客戶端的client.
java用TCP/ip協議的傳輸層socket接口與server連接時,若此時 server未運行,則Socket s=new Socket(InetAddress.getByName("server_ip"),port) 將無限等待.利用定時線程,可將無限等待變為等待3秒鐘:
    import java.net.*;
    import java.io.*;
    class timer extends Thread{
     public void run(){
      try{sleep(3000); // 3秒鐘
       System.out.println("server未啟");
       System.exit(1);
      }catch(Exception E){}
     }
    }
    public class client {
     public static void main (String arg[]){
      timer tm=new timer();
      tm.start();
      try {
       Socket so=new Socket(InetAddress.
        getByName("server_ip"),port);
       tm.stop();
       ...
      }
      catch(Exception E){}
     }
    }
  (3) 用Socket結合DataInputStream類,OutputStream類在客戶-服務器之間傳輸大于 9200字節時,結果不可靠,這時可在客戶進程,服務器進程中,用exec創建負責傳輸的同步的子進程child,在child中每次只同步傳輸2048個字節,child終止時,會刷新傳輸緩存,釋放相關資源,實踐證實結果是可靠的:
    public static void main (String arg[])
    { /*客戶,服務器進程*/
    String cmd[]=new String[1];
    cmd[0]="jview child_client";
    // cmd[0]="jview child_server";
    try {Runtime.getRuntime().exec(cmd).
    waitFor();...}
    ...
    }
    public class child_client
    { /* 客戶端child子進程 */
     public static void main(String[] arg) {
      try{
       int i,j,k;
       byte buf,z[]=new byte[1];
       FileInputStream f=new FileInputStream("transport_file");
       buf=new byte[f.available()];
       i=f.read(buf);
       f.close();
       Socket so=new Socket(InetAddress.
       getByName("server_ip"),port);
       DataInputStream is=new DataInputStream(so.getInputStream());
       OutputStream os=so.getOutputStream();
       for(j=0;j!=i;j+=k) {
        if ((k=(i-j)) >2048) k=2048;
        os.write(buf,j,k);
        is.read(z);
       }
       is.close();os.close();so.close();
      }
     }
    }
    public class child_server
    {
     /* 服務器端child子進程 */
     public static void main(String[] arg) {
      try{
       int i,j,k;
       byte buf,z[]=new byte[1];
       buf=new byte[new
       file("transport_file").length()];
       Socket so=new ServerSocket(port).accept();
       DataInputStream is=new DataInputStream(so.getInputStream());
       OutputStream os=so.getOutputStream();
       for(j=0;j!=i;j+=k) {
        if ((k=(i-j)) >2048) k=2048;
        k=is.read(buf,j,k);
        os.write(z); }
       os.close();is.close();so.close();
      }
     }
    }
  (4) 用String str=new String(buf)從字節數組buf構造字符串變量str,然后用 System.out.println(str)顯示str,當str含長度大于2400字節的漢字或非凡 字符的行時,可能因MalformedException例外而不能完全顯示str.這時可用FileOutputStream 類的write方法將buf寫入文件f1,然后用dos的"type f1"顯示文件。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沈丘县| 嘉义市| 五家渠市| 澜沧| 兰考县| 昌黎县| 丹凤县| 百色市| 岳西县| 长垣县| 维西| 井研县| 昭平县| 鄂托克旗| 江源县| 区。| 钟山县| 库车县| 泽库县| 阿拉善右旗| 巧家县| 交口县| 桐柏县| 理塘县| 札达县| 通州区| 唐海县| 阿坝县| 保靖县| 晴隆县| 永城市| 麦盖提县| 宁明县| 海伦市| 遵义县| 和硕县| 岗巴县| 确山县| 仙居县| 满洲里市| 射阳县|