如何使用套接字,活动和视图?

时间:2013-01-31 13:47:34

标签: android

我是Android新手编程的新手,我需要帮助来构建一个应用程序。我希望两部手机相互连接,一部是客户端,另一部是服务器。我希望客户有2个阶段。在第一个用户输入服务器的IP时,单击按钮以建立连接。在第二个用户输入消息并单击按钮将其发送到服务器。

下面显示的代码是将字符串“message”发送到服务器,但正如我所说,我希望用户能够输入字符串。我不知道如何解决他的问题,一旦在我展示的活动中建立连接,我是否需要第二个活动?在那种情况下,我不知道如何将套接字传递给另一个活动,我只知道如何传递字符串。此外,我需要另一个按钮,因此需要一个新的OnClickListener,我仍然需要将套接字传递给该函数。

在不使用第二个活动的情况下,我不知道如何在建立连接后显示第二个输入字段(用户将输入要发送到服务器的消息的字段)。此活动的视图(layout.xml)已经相关联,我不能只是清除屏幕并动态创建一个新的EditText字段。

我希望我能说清楚。

提前致谢

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

    serverIp = (EditText) findViewById(R.id.server_ip);
    connectPhones = (Button) findViewById(R.id.connect_phones);
    connectPhones.setOnClickListener(connectListener);       

}

private OnClickListener connectListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }
};

public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
            connected = true;
            while (connected) {
                try {
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);
                    **out.println("messageToSend");**
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}
}

3 个答案:

答案 0 :(得分:1)

快速解决方法是通过

隐藏当前显示的EditText和Button
 view.setVisiblility(View.GONE)

并通过

显示另一个editText和按钮
 view.setVisibility(View.Visible)

并使用相同的活动...

但是更好的解决方案是在服务中打开用于通信的套接字查看带有套接字的android服务...在第一个活动中启动服务并在建立连接时转移第二个活动并将活动与服务绑定可以进行通信btw活动和服务...

答案 1 :(得分:1)

不完全确定你在这里寻找什么,但如果我理解正确你就会想知道如何发送信息。只需添加

     message2send= (EditText) findViewById(R.id.user_message); 

然后你在哪里

         **out.println("messageToSend");**

替换为

         **out.println(message2send);** 

并为您的布局添加额外的编辑文本字段。

应该注意的是,你所采用的方式并不理想,因为另一部电话(服务器)必须正在收听套接字才能接收消息,这会导致额外的数据费用以及浪费电池电量(移动服务器中的传统服务器位于两部手机之间以存储信息,以防用户离线或手机死机)

希望这有助于减少!

答案 2 :(得分:1)

我不认为,您需要第二个活动来通过套接字发送消息。

无论如何,这取决于你的设计 -

你可以同时拥有两个editTexts,但它们的可见性会有所不同。

 EditText serverIpAddressET;  
 EditText messageET ;  // Deafult visibility Gone
当用户未提供套接字IP时,

serverIpAddressET可见。 建立连接后,您可以将serverIpAddressET的可见性更改为Gone,并使Messageible成为可见。