gpt4 book ai didi

java - 如何编写一个将在后台监听已经创建的客户端套接字?

转载 作者:行者123 更新时间:2023-12-01 14:39:29 25 4
gpt4 key购买 nike

首先,我对此相当陌生,我有服务器/客户端套接字正在运行,服务器正在发送/接收数据,但我的客户端目前仅在 try/catch block 中发送数据,我需要编写一个另一种捕获传入数据的方法?并将其保留在我原来的 try/ctach* 之外

任何帮助都会很棒

public void onClick(View v)
{
setMyIp(ipaddress.getText().toString());
// myComs.sending_data(getMyIp() , "Got connected");
try
{
InetAddress inet = InetAddress.getByName(getMyIp());
Socket s = new Socket(inet, 2000);
OutputStream o = s.getOutputStream();
PrintWriter p = new PrintWriter(o);
InputStream in = s.getInputStream();


p.println("You are connected");
p.flush();

readContacts();
//inboxConversations();
//outboxConversations();
readSms();


}
catch (UnknownHostException e)
{
ipaddress.setText("Unknown host");
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}


});

这是我的代码,我需要在按钮之外创建一个单独的监听器,任何想法

谢谢

<小时/>

最佳答案

您必须保持套接字在循环中打开,不断监听任何要写入的数据。当然,在单独的线程/进程上执行此操作。实际上,我认为服务器端和客户端都应该位于单独的线程上。您可以查找 java NIO,但这里有一些代码只是为了帮助您入门,因为 android 有一个类可以在后台执行操作并在之后更新主 UI,称为 ASYNCHTASK。您可以通过其他方式生成线程,当然只是向您展示一种便捷的方式:(注意,我还没有运行这个,我只是写了我将如何做的,所以它将它作为伪代码)

class ClientTask extends AsyncTask<Void, Void, Void> // or whatever you want to pass in
{

public static String ip = "10.0.2.1";
public static int port = 5061;
Socket socket;
public DataInputStream dis;
public DataOutputStream dos;
public String message;

@Override
protected Void doInBackground(Void... params) {


/* set up our socket and open a stream to read */

try {
socket = new Socket(ip, port);
dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));

} catch (Exception e) {
Log.i("AsyncTank class", "Socket has some trouble opening");
}

/*heres the stuff your looking for to listen to a socket all day long*/

while(socket.isConnected()){
String mymessage=dis.readLine(); //readline blocks
/* do something with your message */
publishProgress(mymessage); //publishes update to main UI thread
}
}

}
return null;
}



@Override
protected void onProgressUpdate(String... messages) {

Toast.makeText(this, messages,Toast.LENGTH_LONG).show(); //announce updates on incoming socket

}


}

-------- 如果您在套接字因任何原因关闭后不需要更新主 UI,只需执行相同的操作,但使用可运行或 Thread 类来创建和监听。

关于java - 如何编写一个将在后台监听已经创建的客户端套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com