【发布时间】: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