【问题标题】:Socket Connection Timeout on Android PhoneAndroid 手机上的套接字连接超时
【发布时间】:2012-06-18 21:25:34
【问题描述】:

我正在尝试做一些服务器/套接字编程。服务器代码是在 Ubuntu 机器上用纯 Java 编写的。客户端代码是为我的 LG Thrill 编写的。服务器似乎工作正常。我已经通过在普通 java 中编写一个简单的测试客户端来测试服务器,该客户端基本上使用带有“localhost”ip 的 try/catch 块。我通过从我的手机 ssh 进入服务器机器检查了该 ip 是否可以访问(是的,它是可以访问的)。

我的服务器代码如下:

package org.vsector.server;

import java.io.IOException;
import java.net.ServerSocket;

public class SceneFlowServer {

    int port;
    Thread running = null;
    CameraHandler handler = null;

    public SceneFlowServer( int port, CameraHandler handler ){

        this.port = port;
        this.handler = handler;

    }

    public void start(){

        if( handler == null ) return;

        try{

            running = new Thread(){

                public void run(){

                    try{

                        ServerSocket listen = new ServerSocket( port );
                        while( true ){

                            System.out.print( "I am waiting on port " + port + "... " );
                            handler.accept( listen.accept() );
                            System.out.println( "Got someone!" );
                            Thread spinoff = new Thread( handler );
                            spinoff.start();

                        }

                    }catch( IOException e ){

                        System.err.println( "Could not listen on port " + port + "!" );
                        System.err.flush();
                        return;

                    }

                }

            };
            running.start();
            running.join();

        }catch( Exception e ){

            System.err.println( "Could not start thread!" );
            System.err.flush();

        }

    }

}

我的 CameraHandler 代码:

package org.vsector.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class CameraHandler implements Runnable {

    Socket client = null;

    public CameraHandler(){ }

    public void accept( Socket client ){

        this.client = client;

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        BufferedReader in;
        try {
            in = new BufferedReader( new InputStreamReader( client.getInputStream() ));
            System.out.println( in.readLine() );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            client.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

我的客户端代码如下:

package org.vsector.client;

import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ProcessingClientActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView) findViewById( R.id.textBox );

        Socket sock;
        try {
            text.append( "\nOpening and writing to socket... " );
            sock = new Socket();
            sock.connect( new InetSocketAddress( "some ip", 4444 ), 30000 );
            PrintWriter out = new PrintWriter( sock.getOutputStream(), true );
            out.println( "Hello!" );
            out.close();
            sock.close();
            text.append( "Done!" );
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            text.append( "Error: " + e + "\n" );
            text.append( e.getMessage() );
        } 

    }
}

权限已设置,但这仍会导致“错误:java.net.SocketTimeoutException:连接超时。”

我不知道是什么原因造成的!有什么想法吗?

编辑:

没关系。网络问题。我在我的家庭网络上运行了代码,一切正常。

【问题讨论】:

  • 我已经添加了自己编写的服务器端代码。
  • 尝试运行您的测试客户端,但不要使用“localhost”,而是使用服务器 IP,看看它是否仍然有效。
  • 代码看起来不错。您确定您使用的是正确的服务器地址和相同的端口吗?
  • 抱歉回复晚了。我已经尝试在ip上使用客户端代码,它仍然可以工作,但是在android手机上运行并没有......
  • 有趣的是,它反过来工作:android 手机作为服务器,pc 作为客户端。

标签: java android sockets client


【解决方案1】:

老兄,尝试在它们之间添加flush():

out.println( "Hello!" );
out.flush();  //add this line
out.close();

您可能正在关闭套接字以快速..

【讨论】:

  • 感谢您的提示,但它似乎根本没有连接。所以没有要写入或关闭的套接字连接。
  • tnx,(检查'up'?)你的电脑呢,你在听你电脑上的这个端口吗?可达没有在听...你需要 sreverSocket 或其他 3dp 派对应用程序,如 netcat(我用于测试...)
  • 是的,我的电脑正在监听这个端口,我用纯java编写了服务器端代码。我已经测试过是否可以通过手机的 ssh 访问 pc,并且我已经通过在同一台 pc 上运行代码测试了端口是否打开。我不知道手机是否无法连接到该特定端口或其他东西。
  • btw,刚刚得知根据api,close()也执行flush()
【解决方案2】:

代码没有实际问题,但我所在的网络一切正常。

在我搬到我的家庭网络后,一切正常。

【讨论】:

  • 但是应用程序没有发送或接收数据,那么有什么解决方案呢?
猜你喜欢
  • 2012-11-17
  • 2016-10-02
  • 2014-07-05
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2011-02-05
  • 2018-11-26
相关资源
最近更新 更多