Java 连接到<;主机名>;:5432人被拒绝

Java 连接到<;主机名>;:5432人被拒绝,java,postgresql,jdbc,Java,Postgresql,Jdbc,我不是通信网络专家,所以我不知道我的“主机名”应该是什么,我在哪里可以找到它 我在Ubuntu14.04上创建了一个postgreSQL服务器,通过将主机名设置为127.0.0.1(localhost),甚至192.168.1.42(我的私有ip),我可以从同一台计算机上毫无问题地连接到它。但我不能从任何其他计算机连接到我的服务器,即使它们是否在本地网络上。我总是收到这样的信息: "Connection to <hostname>:5432 refused. Check that t

我不是通信网络专家,所以我不知道我的“主机名”应该是什么,我在哪里可以找到它

我在Ubuntu14.04上创建了一个postgreSQL服务器,通过将主机名设置为127.0.0.1(localhost),甚至192.168.1.42(我的私有ip),我可以从同一台计算机上毫无问题地连接到它。但我不能从任何其他计算机连接到我的服务器,即使它们是否在本地网络上。我总是收到这样的信息:

"Connection to <hostname>:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections."
“与:5432的连接被拒绝。请检查主机名和端口是否正确,以及邮局主管是否正在接受TCP/IP连接。”
如果是127.0.1.1、127.0.0.1、192.168.1.42、98.765.432.123(公共ip)或其他任何内容,则它永远不起作用。 什么是正确的主机名


我已经将listen_地址设置为“*”,已经编辑了pg_hba.conf以接受0.0.0.0/0 IP-s,并禁用了ubuntu防火墙。

这可能是由许多原因造成的

  • 服务器有一个IP地址。这是JDBC连接字符串应该用于
    的地址,除非您有一些本地DNS解决方案。要排除后者的问题,请使用Ubuntu服务器的IP地址。在Ubuntu上键入
    ifconfig
    查看它;它可能是你提到的
    192.168.1.42
    因此,从使用Java应用程序的客户端,您可以使用服务器的IP地址。
  • 如果您有标准的PostgreSQL安装,它应该使用端口5432,您可以在
    PostgreSQL.conf
    中检查设置。在JDBC连接字符串中,还应指明端口:“JDBC:postgresql://192.168.1.42:5432/...“为了安全起见
  • 您需要有一个可以连接的数据库。请注意,默认情况下,只有数据库的所有者(在您的情况下可能是用户
    postgres
    )可以连接到数据库。再往下看
  • pg_hba.conf
    中,您需要为新数据库创建一个条目,以便它可以连接到(典型设置,请检查网络设置)此处指定的IP地址(范围)是连接到数据库的客户端的IP地址

    host my_db all 192.168.0.0/16 md5

  • 修改
    pg_hba.conf
    后,必须重新启动PostgreSQL server。(通常在Ubuntu上,do
    sudo./etc/init.d/postgrestart

    要创建数据库
    my_db
    (或您喜欢的任何名称),请转到您的Ubuntu框,以
    postgres
    用户身份输入
    psql

    vekszor@ubuntu:~$ sudo -u postgres psql
    [sudo] password for user:
    psql (9.3.5)
    Type "help" for help
    
    postgres=# 
    
    为了连接到数据库,您应该有一个数据库:

    postgres=# CREATE DATABASE my_db;
    CREATE DATABASE
    
    postgres=# CREATE ROLE vekszor LOGIN PASSWORD 'secret123' CREATEROLE;
    CREATE ROLE
    postgres=# ALTER DATABASE my_db OWNER TO vekszor;
    ALTER
    
    您还需要一个功能不如
    postgres
    超级用户的用户(角色),但仍然能够操作数据库。因此,请创建此用户角色并分配数据库的所有权:

    postgres=# CREATE DATABASE my_db;
    CREATE DATABASE
    
    postgres=# CREATE ROLE vekszor LOGIN PASSWORD 'secret123' CREATEROLE;
    CREATE ROLE
    postgres=# ALTER DATABASE my_db OWNER TO vekszor;
    ALTER
    
    现在,您可以使用Java应用程序返回到客户端计算机,并使用数据库名称、用户和密码完成JDBC连接字符串


    请注意,如果您想从internet访问数据库,您应该在路由器中设置NAT规则,将端口5432上的流量指向Ubuntu服务器的IP。只要路由器的内部地址与您在
    pg_hba.conf
    中指示的客户端计算机的地址范围相同,这应该很容易设置,否则,请在
    pg_hba.conf
    中添加一个新条目,阅读您对正确答案的评论:
    这就是向iptables添加规则的方式:

    iptables -A INPUT -s 0/0 -p tcp --dport 5432 -j ACCEPT
    

    0/0:如果您希望任何人访问它
    您可以将其更改为特定的ip地址或ip地址范围。

    如果您使用UI连接到服务器,您可以运行以下查询以获取服务器的ip地址,使用以下查询来验证您是否使用了正确的ip地址

    Select inet_server_addr();
    

    您可以发布jdbc连接字符串吗?很可能您已经安装了防火墙,可以防止来自外部的连接。Giovanni,是的,“jdbc:postgresql://”(内部是字符串变量,我用JTextField将它们输入到我的程序中)当您
    telnet hostname 5432
    时会发生什么?如果这不起作用,那实际上是一个网络问题,而不是Postgres或JDBC问题。Andomar,从哪台计算机,我自己的(ubuntu),还是从本地/非本地网络中的其他(windows)计算机?主机名是什么,我的公共IP?(我不是职业选手)。从我的计算机上看,telnet适用于127.0.0.1和192.168.1.42,但不适用于公共ip 98.765.432.123(?)非常感谢,这是一个非常好且结构良好的答案。我想了解更多关于设置NAT规则的信息“将端口5432上的流量指向Ubuntu服务器的IP”。我有汤姆森网关,它足够设置协议为:“任何”,触发范围为“5432-5432”,并离开翻译到。。。空、触发器协议空和触发器端口空?我一步一步地遵循您的指导原则,现在它非常适合本地网络。你可能还想在你的答案中加上一句,ubuntu防火墙必须用“sudoufwdisable”来禁用,才能让一切正常工作。(更复杂的方法是编辑iptables)@Vekszor很高兴能帮上忙。关于汤普森网关的问题,我没有这方面的经验,但网上有很多网站都有每个路由器和网关的具体细节。我还是不敢相信。