我一直在嘗試幾天,現在創建一個應用程序客戶端服務器,在Android上,在同一臺機器上運行.... 我已經使用各種顯示功能來顯示狀態的客戶端和服務器...掙扎後,我已經成功地連接他們兩個,這並不是很難做到。Android的客戶端服務器
我面臨的最大問題是何時將數據從客戶端發送到服務器。
我已經使用了DisplayTitle()
功能,在服務器端顯示,達到有來自未來的數據的客戶機,但它從來沒有顯示什麼
我覺得現在的問題是在發送數據,因爲我使用PrintWriter發送數據,我已經讀過,我應該刷新它,以便這樣做 - 否則數據將發送只有當我的緩衝區已滿....我已經完成了,仍然沒有!
這是我的客戶端代碼:
public class screen1 extends Activity {
private TextView clientState;
private String serverIpAddress="10.0.2.2";
public static final int ClientPort = 8080;
String message="Hello Server!";
int longitude;
int latitude;
Cursor c;
DBAdapter db;
private Handler handler=new Handler();
Socket socket;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen1);
clientState = (TextView) findViewById(R.id.client_Status);
Button b = (Button)findViewById(R.id.mainMenu);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent i = new Intent(screen1.this, screen2.class);
startActivity(i);
}
});
Thread cThread=new Thread(new ClientThread());
cThread.start();
db=new DBAdapter(this);
db.createDatabase();
db.openDataBase();
}
public class ClientThread implements Runnable{
private PrintWriter out=null;
public void run()
{
try
{
InetAddress serverAddr=InetAddress.getByName(serverIpAddress);
handler.post(new Runnable(){
public void run(){
clientState.setText(" try to connect!");
}
});
socket=new Socket(serverAddr,ClientPort);
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
}
catch(UnknownHostException e){
System.err.println("Don't know about host");
}
catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to host");
}
if(socket!=null && out!=null){
try{
c=db.getAllData();
if(c.moveToFirst())
{
do{
longitude=Integer.parseInt(c.getString(1));
out.println(longitude);
out.flush();
latitude=Integer.parseInt(c.getString(2));
out.println(latitude);
out.flush();
}while(c.moveToNext());
}
out.close();
socket.close();
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
}
}
}
}
這裏是我的服務器在DisplayTitle()
,我嘗試顯示緯度和經度,我應該從客戶端接收:
public class Server1 extends Activity {
//the ip the server is listening to
public static String SERVERIP="10.0.2.15";
Socket client;
Scanner s=null;
TextView serverStatus;
Handler handler=new Handler();
protected int ServerPort= 6000;
int longitude;
int latitude;
protected boolean isStopped = false;
private ServerSocket serverSocket=null;
private Socket clientSocket=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server1);
Button b = (Button)findViewById(R.id.mainMenu);
serverStatus =(TextView)findViewById(R.id.server_Status);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0){Intent i = new Intent(Server1.this, Server2.class);
startActivity(i);}});
Thread fst=new Thread(new ServerThread());
fst.start();
// MultiThreadedServer server = new MultiThreadedServer(6000);
// new Thread(server).start();
}
public class ServerThread implements Runnable{
public void run(){
try{
InetSocketAddress serverAddr =new InetSocketAddress(SERVERIP,6000);
serverSocket = new ServerSocket();
serverSocket.bind(serverAddr);
handler.post(new Runnable(){public void run() {
serverStatus.setText("wait for clients");
}});
while(true){
//accept for incoming clients
client= serverSocket.accept();
handler.post(new Runnable(){public void run() {
serverStatus.setText("Connected.");
}});
try{
s=new Scanner(new BufferedReader(new InputStreamReader(client.getInputStream())));
while(s.hasNext()){
longitude=Integer.parseInt(s.next());
System.out.println(longitude);
latitude=Integer.parseInt(s.next());
System.out.println(latitude);
// db.insertData2(longitude,latitude);
handler.post(new Runnable() {
public void run() {
DisplayTitle(longitude,latitude);
}
});
}
break;
}
catch(Exception e)
{
handler.post(new Runnable(){
public void run(){
serverStatus.setText("Connection interrupted!!");
}
});
e.printStackTrace();
}
}
}
catch(Exception e)
{
handler.post(new Runnable()
{
public void run(){
serverStatus.setText("Error");
}
});
e.printStackTrace();
}
}
}
public void DisplayTitle(int longitude,int latitude)
{
Toast.makeText(this,
"longitude: " + longitude +"\n" +
"latitude: " + latitude +"\n" ,
Toast.LENGTH_LONG).show();
}
}
如果有人有任何想法我做錯了,請告訴我!我在這裏瞭解更多細節。
你重定向使用控制檯Telnet會話的端口,像REDIR添加TCP :XXXX:YYYY?如果不是,那麼這將是你的問題。 – NickT 2011-04-18 19:12:20
是的是的......我已經做到了......我成功地連接了他們......問題是發送數據:) – adrian 2011-04-18 19:15:17