0

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

下面显示的代码是将字符串“消息”发送到服务器,但正如我所说,我希望用户能够输入字符串。我不知道如何解决他的问题,我是否需要在下面显示的活动中建立连接后调用第二个活动?在那种情况下,我不知道如何将套接字传递给另一个活动,我只知道如何传递字符串。此外,我需要另一个按钮,因此需要一个新的 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;
        }
    }
}
}
4

3 回答 3

1

那么一个快速的解决方法是通过隐藏当前显示的 EditText 和 Button

 view.setVisiblility(View.GONE)

并通过显示其他editText和按钮

 view.setVisibility(View.Visible)

并使用相同的活动...

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

于 2013-01-31T14:06:56.390 回答
1

不完全确定您在此处寻找什么,但如果我理解正确,您正在考虑如何发送消息。只需添加

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

然后你在哪里

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

用。。。来代替

         **out.println(message2send);** 

并在您的布局中添加一个额外的编辑文本字段。

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

希望这对您有所帮助!

于 2013-01-31T14:09:01.547 回答
1

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

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

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

 EditText serverIpAddressET;  
 EditText messageET ;  // Deafult visibility Gone

serverIpAddressET 在用户未提供套接字 IP 时可见。建立连接后,您可以将 serverIpAddressET 的可见性更改为 Gone 并使 messageET 可见。

于 2013-01-31T14:11:57.030 回答