租了一个百度云服务器,搭建好数据库环境后,成功在自己电脑上通过ssms远程连接上了云服务器上的数据库,但接着我在Androidstudio中用Java进行连接时却一直报错,下面是报错:
E/SqlConnect: 数据库连接失败
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host .....(此处省略为ip), port 1433 has failed. Error: "socket failed: EPERM (Operation not permitted). Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2574)
at com.microsoft.sqlserver.jdbc.TDSChannel.open(IOBuffer.java:715)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3427)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:3077)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2919)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1787)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1229)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:236)
at com.example.jianxing.SqlConnect$1.run(SqlConnect.java:44)
at java.lang.Thread.run(Thread.java:919)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误是因为在云服务器上的SQL Server实例禁止了TCP / IP连接。要解决这个问题,您需要按照以下步骤进行操作:
确认您使用的SqlServer实例配置中启用了TCP/IP协议。在SqlServer配置管理器中找到SqlServer网络配置,确认TCP/IP协议已启用。如果没有,则需要启用TCP/IP协议。
检查SQL Server默认实例的网络配置中TCP/IP端口号是否为1433。如果您使用的是命名实例,则需要找到为该实例分配的端口号。可以在SqlServer配置管理器中找到这些信息。
打开云服务器的防火墙端口以允许流量通过1433端口。在百度云服务器的安全组设置中将1433端口设置为允许。
检查云服务器的防火墙配置是否禁止了入站流量。确保它们允许入站流量。如果禁用了入站流量,您需要启用它。
以下是Android Studio中连接SqlServer的代码示例:
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://yourserver.database.windows.net:1433;" +
"database=yourdatabase;user=yourusername@yourserver;password=yourpassword;" +
"encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
Connection connection = DriverManager.getConnection(connectionUrl);
Log.i("SqlConnect", "数据库连接成功");
} catch (Exception e) {
Log.e("SqlConnect", "数据库连接失败", e);
}
需要将yourserver
,yourdatabase
,yourusername
和yourpassword
替换为您的SqlServer实例的详细信息。
如果我的回答解决了您的问题,请采纳!
这个可能是你的代码有问题,你贴下你代码或者对照正确的代码改改
你的百度云服务器安装的SQLServer 没有启用TCP/IP协议造成的。需要启用。步骤如下
1、打开SQLServer配置管理器
2、启用TCP/IP
然后确保防火墙开放了1433端口 或者关闭了防火墙
引用chatGPT作答,这个错误信息表明无法连接到主机的1433端口,而这个端口通常是SQL Server数据库实例监听的端口。具体的错误提示是“socket failed: EPERM (Operation not permitted)”,这通常是由于操作系统权限问题导致的。
有几个原因可能导致这个问题:
1.防火墙设置:检查是否有任何防火墙设置(包括云服务器和本地计算机),这些设置可能会阻止连接。
2.数据库服务是否正在运行:确保在云服务器上SQL Server服务正在运行,并且已启用TCP/IP协议。
3.端口是否正确:确保连接字符串中指定的端口号是正确的,通常是1433。
4.权限问题:检查登录到 SQL Server 的帐户是否有足够的权限,以及是否在服务器上启用了远程连接功能。
你可以先检查这些问题,看是否能够解决你的连接问题。如果还有问题,请提供更多细节信息,我会尽力帮助你解决问题。
不知道你这个问题是否已经解决, 如果还没有解决的话:Java连接SqlServer错误
可以借鉴下
https://blog.csdn.net/qq_58608526/article/details/129853228
1.网络权限没有开启
2.不支持http
在AndroidManifest.xml 中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
如果还是报错在AndroidManifest.xml 文件的Application中添加
android:usesCleartextTraffic="true"
原因:Android9.0的机器上,默认不支持http的访问,所有网络访问必须使用https。当然Android早几个版本已经支持https了,只不过在9.0上默认使用https不支持http。
如以上操作后不能解决,请先卸载该应用程序,然后再次运行它即可。
以下内容引用CHATGPT:
这个报错提示连接失败,可能是防火墙的问题,建议检查一下云服务器上的防火墙是否开启了1433端口,并且是否允许外部访问。如果防火墙已经配置好了,还需要检查一下SQL Server的配置,确保它在1433端口上监听,并且允许TCP/IP连接。
另外,你可以尝试使用Java的JDBC连接SQL Server数据库,具体步骤如下:
下载并安装Microsoft JDBC Driver for SQL Server,下载链接:https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
在Java代码中引入JDBC Driver:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://{serverName}:{port};databaseName={databaseName}";
String username = "yourUsername";
String password = "yourPassword";
Connection conn = DriverManager.getConnection(url, username, password);
其中,{serverName}为SQL Server的名称或IP地址,{port}为端口号,{databaseName}为数据库名称。
希望这些步骤能够帮助你解决问题。