当前位置: 首页 > 知识库问答 >
问题:

Android客户端未连接到Java服务器

蓬弘
2023-03-14

下面是我的服务器代码:

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

因此,我开始认为这不是连接端口的问题,而是应用程序的android客户端的问题。但我想不出有什么问题。

顺便说一下,当我试图发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到了同一个网络。

共有1个答案

王季萌
2023-03-14

好吧,多亏了GreenApps的建议,我终于找到了问题所在。基本上,结果是防火墙阻塞了到我计算机上的java平台的任何传入连接。

要解决此问题,请执行以下操作:

  1. 打开“控制面板”并搜索windows防火墙
  2. 在左侧的“具有高级安全性的Windows防火墙”对话框中,单击“入站规则”
  3. 浏览并查看哪些应用程序被阻止接收连接
  4. 选择要允许入站连接的应用程序,然后右键单击它
  5. 选择“属性”并按“允许连接”或“允许连接(如果安全)”
 类似资料:
  • 关于:Hazelcast远程缓存服务器-客户端Spring Boot 我也有同样的问题,但对于hazelcast 5.1和java 17: 和用法: 国家类是: 与活动服务器和客户端的通话是正常的,但当我关闭服务器时,我得到了: 没有找到到集群的连接 第5版中有更改或我的配置错误? 谢谢

  • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。

  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • 我想知道,如果可能的话,如何执行在 C 中创建/模拟 java 服务器套接字的任务?我是C的新手,但我相当精通Java。我的服务器(用java编写)需要从所有Java / C客户端接收数据(数据使用JSON Strings传输),但我不确定如何在C中与NIO服务器建立连接。 提前感谢任何帮助!

  • 客户端应用程序在以下代码处挂起:

  • 我正在使用和NIO通道编写一个简单的NIO服务器。每次我有一个传入连接,我都使用以下代码向选择器注册它: 在客户端,因为我只有一个socketChannel,所以很容易关闭通道并使用选择器取消注册。然而,在服务器端,我所做的只是等待任何连接过的客户端(可能有数千个)的写操作。有什么方法可以检测到客户端已在服务器端断开连接?例如,10K连接后,选择器似乎会变得非常低效,其中大多数可能会在短时间内失效