Eine einfache client-server - Android<>PC
Ich die Prüfung socket-Programmierung unter Android allerdings habe ich ein problem. Der client ist im Grunde gestartet, durch die Haupt-Aktivität mit einem basic-Funktion senden einer Nachricht an den server und immer eine Antwort.
client Aktivität:
package com.test.socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class socketActivity extends Activity implements OnClickListener {
String input;
private EditText et;
private ObjectOutputStream oos;
private TextView tv;
private String message;
private ObjectInputStream ois;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
InetAddress host = InetAddress.getLocalHost();
Socket socket = new Socket(host.getHostName(),7777);
//send to server
oos = new ObjectOutputStream(socket.getOutputStream());
et = (EditText) findViewById(R.id.text);
Button sendButton = (Button) findViewById(R.id.button);
sendButton.setOnClickListener(this);
//read from server
ois = new ObjectInputStream(socket.getInputStream());
//System.out.println("Message from Server: "+message);
tv = (TextView) findViewById(R.id.textView);
}
catch(UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
//TODO Auto-generated method stub
switch(v.getId())
{
case R.id.button:
input = et.getText().toString();
try {
oos.writeObject(input);
ois.close();
oos.close();
message = (String) ois.readObject();
tv.setText("Message from Server: "+message);
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
Server-Klasse gestartet getrennt von JCreator hören auf port 7777:
import java.io.*;
import java.lang.*;
import java.net.*;
public class server {
private ServerSocket server;
private int port = 7777;
public server()
{
try{
server = new ServerSocket(port);
}
catch(IOException e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
server example = new server();
example.handleConnection();
}
public void handleConnection()
{
System.out.println("Waiting for client message...");
while(true)
{
try{
Socket socket = server.accept();
new ConnectionHandler(socket);
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}
ConnectionHandler-Klasse, die der Server zugreift:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class ConnectionHandler implements Runnable {
private Socket socket;
public ConnectionHandler(Socket socket)
{
this.socket = socket;
Thread t = new Thread(this);
t.start();
}
@Override
public void run() {
//TODO Auto-generated method stub
try{
//receive from client
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
System.out.println("Message from client: "+message);
if(message.equals("check"))
{
System.out.println("Checking for malicious interference...");
Thread.sleep(5000);
System.out.println("Status: Files are good.");
}
//send response to client
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
if(message.equals("check"))
{
oos.writeObject("Checking...");
}
else oos.writeObject("Invalid input");
ois.close();
oos.close();
socket.close();
System.out.println("Waiting for client message...");
}
catch(IOException e)
{
e.printStackTrace();
} catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Habe ich getestet, der code auf der JCreator und Eclipse, die durch die Java-Anwendung nicht Android app und es funktionierte perfekt. Jedoch, wenn ich versuche, es zu tun durch die Aktivität, funktioniert es nicht.
Irgendwelche Ideen?
InformationsquelleAutor Batzi | 2011-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Android, localhost würde, zeigen Sie auf das Handy/emulator selbst. Es muss nicht auf dem server zeigen. Die folgende Zeile unten zeigt auf Ihrem Android-Gerät/emulator und nicht dein server. Sie müssen, um die tatsächliche IP des Servers, um es arbeiten von Ihrem Android -
Es funktioniert durch die Java-App, weil, wenn Sie es ausführen aus dem Kontextmenü der Java-Anwendung, die localhost auf dem gleichen server.
Ich habe es versucht. Der emulator zeigt nicht mehr das layout, es friert und logcat Staaten: request time failed: java.net.SocketException: Address family not supported by protocol
Was haben Sie da eine Adresse?
meine computer-IP-Adresse, die ich aus der Ipconfig. das ist die, die ich brauche, zu verwenden, richtig?
das ist wahrscheinlich, weil Sie mit ObjectOutputStream. Gibt es irgendeinen bestimmten Grund, warum Sie das einwickeln der Schnur wie? Auch die Weise, wie Sie es jetzt blockiert den UI Thread. Sie sollten erwägen, das hören auf den eigenen Thread und Durchführung von Maßnahmen auf dem UI-thread, wie der input vom server kommt
InformationsquelleAutor momo