Android客户端无法连接到Java服务器
问题描述:
我正试图在java和android中实现一个非常简单的客户端/服务器应用程序。服务器似乎运行良好,当我执行它,Android客户端打开我的手机。但是,当我尝试通过WiFi连接向服务器发送消息时,它不起作用。Android客户端无法连接到Java服务器
这里是我的服务器代码:
package com.SentientShadow;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
Thread thread = new Thread(){
public void run() {
System.out.println("Server has started and is listening...");
try{
ServerSocket socket = new ServerSocket(6879);
while (true){
Socket connection = socket.accept();
DataInputStream input = new DataInputStream(connection.getInputStream());
System.out.println("Received from client: " + input.readUTF());
input.close();
connection.close();
}
}catch(IOException e){
System.out.println("problem accepting connection");
}
}
};
thread.start();
}
}
这里是我的客户端活动代码:
package com.SentientShadow;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Bundle;
public class Client extends ActionBarActivity implements OnClickListener {
private EditText etMessage;
private Button bSend;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
etMessage = (EditText)findViewById(R.id.etMessage);
bSend = (Button)findViewById(R.id.bSend);
bSend.setOnClickListener(this);
}
public void onClick(View view) {
Thread thread = new Thread(){
public void run() {
try {
Socket connection = new Socket("127.0.0.1", 6789);
DataOutputStream output = new DataOutputStream(connection.getOutputStream());
output.writeUTF(etMessage.getText().toString());
output.flush();
output.close();
connection.close();
} catch (UnknownHostException e) {
System.out.println("problem connecting to specified address");
} catch (IOException e) {
System.out.println("problem connecting to port");
}
}
};
thread.start();
Toast.makeText(this, "Message has been sent!", Toast.LENGTH_SHORT).show();
}
}
下面是客户端活动XML布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.SentientShadow.Client" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter message:" />
<EditText
android:id="@+id/etMessage"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginTop="14dp"
android:ems="10" />
<Button
android:id="@+id/bSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText1"
android:layout_below="@+id/editText1"
android:text="Send" />
</RelativeLayout>
这是我的代码为xml清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.SentientShadow"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="Client"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
我用System.out.println消息替换了IOException和UnknownHostException printstacktrace,以便我可以确定问题是否来自其中任何一个错误。但是,控制台没有打印任何内容。
我还使用端口扫描仪扫描了几个端口,似乎我的学校网络已经阻止了所有这些端口,因为它们返回时关闭。但是,我早先制作了另一个客户端/服务器应用程序,其中客户端和服务器都是纯粹用java编码的桌面应用程序。在这种情况下,我使用localhost(127.0.0.1)作为IP地址,并尝试使用多个端口的应用程序,并且它工作正常。我也尝试与我的连接的公共IP地址的应用程序,它的工作。
因此,我开始认为这不是连接到端口的问题,而是应用程序的Android客户端问题。但我无法弄清楚什么是错的。
顺便说一下,当我尝试发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到同一网络。
答
好的,我终于发现这个问题得益于greenapps的建议。基本上,事实证明,防火墙阻止了任何传入的连接到我的电脑上的Java平台。
要解决这个问题:
- 打开控制面板,然后搜索Windows防火墙
- 在Windows防火墙与左边高级安全对话框中,单击“入站规则”
- 浏览和查看哪些应用程序被阻止接收连接
- 选择要允许入站连接并右键单击它的应用程序
- 选择属性并按“允许连接”或“允许连接,如果安全”
您不能使用127.0.0.1,因为您将用于连接到同一设备上的服务器。您应该使用服务器pc的本地ip地址。经常像192.168.0.23。如果使用ipconfig从命令行找到运行的窗口。 – greenapps 2014-09-24 19:04:34
是的,我试着输入本地和公共IP。但是,都没有工作。 – SentientShadow 2014-09-25 05:49:20
防火墙没有防止这种情况发生? – greenapps 2014-09-25 06:27:43