在虛擬機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都不熟悉吧。