linux系统下memcached启动正常但程序无法连接的问题解决

摘要:
在MyEclipse中执行java程序publicclassMycache{/***@paramargs*/@SuppressWarningspublicstaticvoidmain{MemCachedClient=newMemCachedCClient();String[]addrs={“192.168.168.2:1211”};整数[]权重={3};//SockIOPool是Memcached客户端提供的套接字连接池。一般来说,它是一个与Memcached服务器交换数据的对象//当应用程序启动时,SockIOPool可以初始化一次。SockIOPool=SockIOPool。getInstance();水塘setServers;水塘setWeights;水塘setInitCon;水塘setMinConn;水塘setMaxConn;水塘setMaxIdle;水塘设置维护睡眠;水塘setNagle;水塘setSocketTO;水塘setSocketConnectTO;水塘initialize();System.out。打印ln;////String[]s=池。获取服务器();客户设置压缩启用;客户setCompressThreshold;//将数据放入缓存客户端。set//将数据放入缓存并设置过期时间Datedate=newDate;客户设置TestBeanbean=newTestBean();豆集合名称;客户添加TestBeanbean1=客户端。收到System.out。打印ln;//删除缓存数据//客户端。delete//获取缓存数据Stringstr=客户端。收到System.out。打印ln;//System.out。println;}}输出结果: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

linux系统下memcached启动正常但程序无法连接的问题解决第1张

虚拟机连接正常啊,那就可能是端口出现了问题,telnet 192.168.168.2. 11211

linux系统下memcached启动正常但程序无法连接的问题解决第2张

端口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

linux系统下memcached启动正常但程序无法连接的问题解决第3张

重回cmd窗口,telnet 192.168.168.2 11211

linux系统下memcached启动正常但程序无法连接的问题解决第4张

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);
        
    }

}

输出结果:

linux系统下memcached启动正常但程序无法连接的问题解决第5张

memcached连接成功,大功告成!

ps:关于无法连接memcached的问题,网上还有一种可能情况就是linux的安全控制模块selinux的安全控制问题,具体可以在网上搜索。

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

免责声明:文章转载自《linux系统下memcached启动正常但程序无法连接的问题解决》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi 中多线程同步的一些处理方法Mac纯命令行实现分卷压缩和解压下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书

一、需求场景 自从数年前苹果开始强制要求所有IOS所有应用必须全部使用 https,以及google、baidu、bing 这三大搜索引擎开始大规模支持 https,https 已经成为现在保障网站完全的最基础需求,大量的供应商开始出现,并提供证书服务,但是对于一些非盈利性质的网站或博客站长,或公司测试环境也想使用https认证时,并不想在这上面投入太多的...

delphi TTcpClient TTcpServer分析

http://blog.csdn.net/andrew57/article/details/8767308 只描述windows socket部分。 sockets.pas中各个类得继承关系: TBaseSocket | ------------------------ | TIpSocket | -----------------------------...

Linux最大打开文件描述符数

1.    系统最大打开文件描述符数:/proc/sys/fs/file-max a.    查看 $ cat /proc/sys/fs/file-max 186405 2. 设置 a.    临时性 # echo 1000000 > /proc/sys/fs/file-max 2.    永久性:在/etc/sysctl.conf中设置 fs.fi...

Linux等待队列原理与实现

当进程要获取某些资源(例如从网卡读取数据)的时候,但资源并没有准备好(例如网卡还没接收到数据),这时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。 waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用  add_wait_queue() 函数把进程添加到  waitqueue 中,然...

Linux平台用C++实现事件对象,同步线程

前文在Win32平台上用C++实现了事件对象Event,对线程进行同步,以达到期望目的。这次在Linux平台上实现与之类似的事件对象。与其相关的一组API包括:pthread_mutex_init,pthread_cond_init,pthread_mutex_lock,pthread_cond_wait,pthread_mutex_unlock,pthr...

Linux图形界面开发—monodevelop初探

在ubutu10.04下,如果通过源码安装monodevelop有问题,建议用ubuntu自带的软件包管理器安装。 下面通过几个例子测试下monodevelop (1)控制台应用程序 u 强大的界面于windows下的vs差不多。输入项目的名称,保存位置,解决方案的名称,保存位置,与windows下一样的哦,其他设置都默认。 一切都是那么的熟悉,c#代码...