无法运行客户端/服务器应用程序

时间:2013-03-11 21:10:04

标签: java android sockets client-server

我目前正致力于在Android上编写一个简单的消息应用程序。我在一个名为RunServer的类中有服务器,它运行得很好。然后我的MainActivity中的方法中有一个名为startClient()的客户端。我有一个按钮,其中有一个onclick="startClient"。但每当我点击按钮时,都没有任何反应。我试图在各处放入日志,这就是它不起作用的地方:

socket.connect(ipPort);

我似乎无法弄清问题是什么。我尝试了不同的端口和IP地址,但仍然没有。

MainActivity

public class MainActivity extends Activity {

    private Socket socket;
    private ObjectInputStream ois;
    private DataOutputStream dos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        runOnUiThread(new Runnable() {

            public void run() {
                EditText et = (EditText) findViewById(R.id.message_id);
                String message = et.getText().toString();
                EditText et1 = (EditText) findViewById(R.id.messages);
                et1.append(message);
            }
        });
    }

    public void startClient(View v) {
        socket = new Socket();
        InetSocketAddress ipPort = new InetSocketAddress("10.0.2.2", 4444);
        System.out.println("HEJ!");
        try {
            socket.connect(ipPort); // här tar det stop
            Log.v("It works", "Hello");
            dos = new DataOutputStream(socket.getOutputStream());
        } catch (Exception e) {
        }
        Thread thread = new Thread();
        thread.start();
    }
}

RunServer

public class RunServer {

    private ServerSocket server;
    private Socket socket;
    private DataInputStream dis;
    private int port;

    public RunServer(int port) {
        this.port = port;
        Thread connectThread = new Thread(new Connect());
        connectThread.start();
    }

    private class Connect implements Runnable {

        public void run() {
            try {
                server = new ServerSocket(port);
                System.out.println("Server running");
                while (true) {
                    socket = server.accept();
                    Thread clientThread = new Thread(new TalkToClient(socket));
                    clientThread.start();
                    System.out.println("someone connected");
                }
            } catch (IOException ex) {
                Logger.getLogger(RunServer.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
            try {
                server.close();
            } catch (Exception e) {
            }
        }
    }

    private class TalkToClient implements Runnable {

        private Socket socket;

        public TalkToClient(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            String clientMsg;
            try {
                dis = new DataInputStream(socket.getInputStream());
                while ((clientMsg = dis.readUTF()) != null) {
                    if (clientMsg.length() > 0) {
                        System.out.println("Whatup");
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }

    public static void main(String[] args) {
        new RunServer(4444);
    }
}

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bakgrund"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/ip"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

    <EditText
        android:id="@+id/ip_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:background="@color/white"
        android:ems="10"
        android:hint="@string/get_ip"
        android:inputType="numberDecimal" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/ip_id"
        android:text="@string/port"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

    <EditText
        android:id="@+id/port_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView2"
        android:background="@color/white"
        android:ems="10"
        android:hint="@string/get_port"
        android:inputType="number" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/port_id"
        android:layout_below="@+id/port_id"
        android:text="@string/message"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

    <EditText
        android:id="@+id/message_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView3"
        android:background="@color/white"
        android:ems="10"
        android:hint="@string/get_message" />

    <Button
        android:id="@+id/connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/message_id"
        android:onClick="startClient"
        android:text="@string/connect"
        android:textColor="@color/white" />

    <Button
        android:id="@+id/send"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/connect"
        android:layout_alignBottom="@+id/connect"
        android:layout_toRightOf="@+id/connect"
        android:text="@string/send"
        android:textColor="@color/white" />

    <TextView
        android:id="@+id/status_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/connect"
        android:layout_below="@+id/send"
        android:layout_marginTop="23dp"
        android:text="@string/status"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

    <EditText
        android:id="@+id/messages"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/status_id"
        android:background="@color/white"
        android:ems="10"
        android:inputType="textMultiLine" />

</RelativeLayout>

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.datorkomprojekt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.datorkomprojekt.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

1 个答案:

答案 0 :(得分:0)

我要做的第一件事就是验证代码是否在Android之外运行。也就是说,只是简单的java代码。

顺便说一下,您不需要runOnUiThread方法。 onCreate方法始终在主UI线程上运行。

不确定为什么XML中的onClick不起作用,但您可以通过编程方式执行此操作:

public class MyActivity extends Activity {
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);

         setContentView(R.layout.content_layout_id);

         final Button button = (Button) findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Perform action on click
             }
         });
     }
 }