linux系統下memcached啟動正常但程序無法連接的問題解決


在虛擬機linux安裝好memcached之后,試着用java程序連接一下memcached的服務端,但卻出現了以下錯誤

com.schooner.MemCached.SchoonerSockIOPool Fri Jan 09 09:45:59 CST 2015 - ++++ failed to get SockIO obj for: 192.168.168.2:11211
com.schooner.MemCached.SchoonerSockIOPool Fri Jan 09 09:45:59 CST 2015 - ++++ failed to create connection to: 192.168.168.2:11211 -- only 0 created.

 

提示無法建立memcached的connection和SockIO,用ps -ef|grep memcached 命令查看memcached進程

nobody    1871     1  0 08:40 ?        00:00:00 /usr/local/memcached-1.4.17/bin/memcached -d -p 11211 -u nobody -m 64 -c 1024 -P /usr/local/memcached-1.4.17/memcached.pid

 

說明memcached服務啟動正常,難道無法連接虛擬機,這不太可能啊,打開cmd命令,ping 192.168.168.2

虛擬機連接正常啊,那就可能是端口出現了問題,telnet 192.168.168.2. 11211

端口11211連接失敗,果然是端口出現了問題。

於是在網上查了一下,原來是由於linux的iptables防火牆原因,需要在iptables里開放11211端口的訪問權限,

用ssh客戶端連接虛擬機,找到目錄/etc/sysconfig下iptables文件,下載下來,用記事本打開

# Generated by iptables-save v1.4.7 on Thu Jan 8 13:46:05 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59:6824]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT
# Completed on Thu Jan 8 13:46:05 2015

 

發現只有一個22端口,怪不得可以直接使用ssh client連接虛擬機,原來iptables默認是開放22端口的,照葫蘆畫瓢,copy22端口的那行代碼,端口改為11211,

# Generated by iptables-save v1.4.7 on Thu Jan 8 13:46:05 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59:6824]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT
# Completed on Thu Jan 8 13:46:05 2015

 

Ctrl+S,保存,上傳,執行命令 service iptables restart

 

重回cmd窗口,telnet 192.168.168.2 11211

OK,端口連接成功。

在MyEclipse執行java程序

public class Mycache {

    /**
     * @param args
     */
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        
        MemCachedClient client = new MemCachedClient();
        String[] addrs = {"192.168.168.2:11211"}; 
        Integer [] weights = {3};
        
        //SockIOPool是Memcached客戶端提供的一個套接字    連接池,通俗講,就是與Memcached服務器端交換數據的對象。
        //SockIOPool在應用程序啟動時初始化一次就可以了
        SockIOPool pool = SockIOPool.getInstance();
        pool.setServers(addrs);
        pool.setWeights(weights);
        pool.setInitConn(5);
        pool.setMinConn(5);  
        pool.setMaxConn(200);  
        pool.setMaxIdle(1000*30*30);  
        pool.setMaintSleep(30);  
        pool.setNagle(false);  
        pool.setSocketTO(30);  
        pool.setSocketConnectTO(0);  
        pool.initialize(); 
        System.out.println(pool.getServers()[0]);
//        
//        String[] s  =pool.getServers();  
        client.setCompressEnable(true);  
        client.setCompressThreshold(1000*1024);  
          
//      將數據放入緩存  
        client.set("test2","test2");  
          
//      將數據放入緩存,並設置失效時間  
        Date date=new Date(2);  
        client.set("test1","test1", date);
        
        
        TestBean bean =  new TestBean();
        bean.setName("bean1");
        client.add("bean1", bean);
        
        TestBean bean1 = (TestBean)client.get("bean1");
        System.out.println(bean1.getName());
          
//      刪除緩存數據  
//      client.delete("test1");  
          
//      獲取緩存數據  
        String str =(String)client.get("test1");  
        System.out.println(str);  
//        System.out.println(s.length);
        
    }

}

 

輸出結果:

memcached連接成功,大功告成!

 

ps:關於無法連接memcached的問題,網上還有一種可能情況就是linux的安全控制模塊selinux的安全控制問題,具體可以在網上搜索。

工作三年多了。混了三年多,什么都不懂,linux也很少接觸,原諒我連iptables都不熟悉吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM