我試圖做一些服務器/套接字編程。服務器代碼是在Ubuntu機器上用純java編寫的。客戶端代碼是爲我的LG Thrill編寫的。服務器似乎工作正常。我已經通過編寫一個簡單的測試客戶端在純java中測試服務器,該測試客戶端基本上使用ip爲「localhost」的try/catch塊。我檢查了ip是否可以通過ssh'ing從我的手機進入服務器(可以,可以到達)。Android手機上的套接字連接超時
我的服務器代碼如下所示:
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:連接超時。」
我找不出是什麼原因造成的!有任何想法嗎?
編輯:
沒關係。網絡問題。我在家庭網絡上運行了代碼,一切正常。
我已經添加了我編寫的服務器端代碼。 – vsector
嘗試運行您的測試客戶端,而不是「本地主機」,使用服務器IP並查看它是否仍然有效。 – Dalmas
代碼看起來不錯。你確定你正在使用正確的服務器地址和相同的端口嗎? – alaster