Unix domain socket和memcached

简介:
  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"

文章转自庄周梦蝶  ,原文发布时间 2009-10-15

目录
相关文章
|
1月前
|
监控 安全 Unix
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
41 2
|
1月前
|
网络协议 安全 Unix
UNIX域套接字(Unix Domain Socket,UDS)之所以高效
UNIX域套接字(Unix Domain Socket,UDS)之所以高效
39 3
|
5月前
|
Unix Docker 容器
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker
|
4月前
|
网络协议 Unix Go
Go unix domain socket通信
Go unix domain socket通信
|
网络协议 Unix Docker
网络协议之:socket协议详解之Unix domain Socket
网络协议之:socket协议详解之Unix domain Socket
|
7天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
11天前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
|
1月前
|
网络协议 安全 API
计算机网络之Socket编程
计算机网络之Socket编程
|
2月前
|
网络协议 安全 开发者
Python 中的 Socket 编程
Python 中的 Socket 编程
40 4