<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    Unix domain socket和memcached

    Posted on 2009-10-15 06:12 dennis 閱讀(5393) 評論(0)  編輯  收藏 所屬分類: javaunix網絡編程
        unix域協議并不是一個實際的協議族,而是在單個主機上執行客戶/服務器通信的一種方法,是IPC的方法之一,特定于*nix平臺。使用unix domain socket有三個好處:
    1)在同一主機上,unix domain socket比一般的tcp socket快上一倍,性能因素這是一個主要原因。
    2)unix domain socket可以在同一主機的不同進程之間傳遞文件描述符
    3)較新的unix domain socket實現把客戶的ID和組ID提供給服務器,可以讓服務器作安全檢查。

       memcached的FAQ中也提到為了安全驗證,可以考慮讓memcached監聽unix domain socket。Memcached支持這一點,可以通過-s選項指定unix domain socket的路徑名,注意,為了可移植性,盡量使用絕對路徑,因為Posix標準聲稱給unix domain socket綁定相對路徑將導致不可預計的后果,我在linux的測試是可以使用相對路徑。假設我將memcached綁定到/home/dennis/memcached,可以這樣啟動memcached:

    memcached -s /home/dennis/memcached


    端口呢?沒有端口了,/home/dennis/memcached這個文件你可以理解成FIFO的管道,unix domain socket的server/client通過這個管道通訊。

       libmemcached支持通過unix domain socket來訪問memcached,基于libmemcached實現的client應該都可以使用這一功能。目前來看,java平臺由于不支持平臺相關的unix domain socket,因此無法享受memcached的這一特性。

       不過有一個開源項目通過jni支持實現了unix domain socket,這個項目稱為juds。核心類就三個,使用非常簡單。下載文件后,解壓縮,make & make install即可。注意,Makefile中寫死了JAVA_HOME,手工修改即可。看一個例子,經典的Time server:
    package com.google.code.juds.test;

    import java.io.IOException;

    import com.google.code.juds.*;
    import java.io.*;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    public class TimeServer {
        
    public static void main(String[] args) {
            
    try {
                UnixDomainSocketServer server 
    = new UnixDomainSocketServer(
                        
    "/home/dennis/time", UnixDomainSocket.SOCK_STREAM);
                OutputStream output 
    = server.getOutputStream();
                 Date date 
    = new Date();
                 DateFormat dateFormat 
    = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                output.write(dateFormat.format(date).getBytes());
            } 
    catch (IOException e) {
                        e.printStackTrace();
            }

        }

    }

        通過UnixDomainSocketServer創建server,指定類型為SOCK_STREAM,juds也支持UDP類型。client的使用如下:
            byte[] b = new byte[128];
           
    UnixDomainSocketClient socket = new UnixDomainSocketClient("/home/dennis/time",
                    UnixDomainSocket.SOCK_STREAM);
            InputStream in 
    = socket.getInputStream();
            in.read(b);
            System.out.println(
    "Text received: \"" + new String(b) + "\"");
            socket.close();
        顯然,juds還只支持阻塞IO,考慮可進一步使用select、poll來擴展實現非阻塞IO。

        最后一個例子,通過juds訪問memcached的unix domain socket,簡單的version協議調用:
    byte[] b = new byte[128];
            UnixDomainSocketClient socket 
    = new UnixDomainSocketClient("/home/dennis/memcached",
                    UnixDomainSocket.SOCK_STREAM);
            OutputStream out 
    = socket.getOutputStream();
            String text 
    = "version\r\n";
            out.write(text.getBytes());
            InputStream in 
    = socket.getInputStream();
            in.read(b);
            System.out.println(
    "Text received: \"" + new String(b) + "\"");
            socket.close();
       輸出
         Text received: "VERSION 1.4.1"
    主站蜘蛛池模板: 菠萝菠萝蜜在线免费视频| 性感美女视频在线观看免费精品| 99久久国产免费中文无字幕| 亚洲男女内射在线播放| 久久精品国产亚洲AV电影| a级毛片免费播放| 亚洲AV无码精品色午夜在线观看| 99免费精品视频| 亚洲人成影院在线| 亚洲免费在线观看视频| 亚洲伊人久久成综合人影院| 亚洲午夜国产精品无卡| 美女视频黄免费亚洲| 亚洲精品伦理熟女国产一区二区 | fc2成年免费共享视频18| 国产亚洲情侣一区二区无码AV| 国产免费131美女视频| 黄色毛片免费观看| 日本免费一区二区在线观看| 亚洲13又紧又嫩又水多| 99在线免费视频| 国产真实伦在线视频免费观看| 亚洲乱亚洲乱淫久久| 91精品成人免费国产| 亚洲视频中文字幕在线| 久久免费观看视频| 亚洲精品私拍国产福利在线| 无码国产精品一区二区免费式直播| 亚洲精品永久在线观看| 亚洲午夜成人精品电影在线观看| 国产成人精品无码免费看| 国产婷婷综合丁香亚洲欧洲| 99久久久国产精品免费牛牛| 亚洲人成人网站色www| 免费精品国偷自产在线在线| 免费播放国产性色生活片| 四虎影库久免费视频| 性无码免费一区二区三区在线| 亚洲人AV在线无码影院观看| 亚洲精品国产精品乱码视色| 最新欧洲大片免费在线|