Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 558|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-13 16:30:57 | 显示全部楼层 |阅读模式

    在虚拟机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都不熟悉吧。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 07:51 , Processed in 0.068082 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表