gpt4 book ai didi

wifi断开后,Android socket仍然可以正常写入

转载 作者:行者123 更新时间:2023-12-03 11:55:59 24 4
gpt4 key购买 nike

我编写了一个 Android 套接字演示,它只是将用户的输入发布到服务器。
我通过wifi连接从android客户端建立了一个socket,一切顺利,服务器可以接收到android客户端发送的消息。问题是,然后我关闭了手机的WIFI,但是socket可以正常写入。

安卓客户端代码:

public class MyActivity extends Activity {
private SocketHandlerThread thread;

/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
thread = new SocketHandlerThread("ScoketTest");
thread.start();
}

class SocketHandlerThread extends HandlerThread {
private Socket socket;
private Handler handler;

public SocketHandlerThread(String name) {
super(name);
}

public SocketHandlerThread(String name, int priority) {
super(name, priority);
}

@Override
public void run() {
try {
socket = new Socket("192.168.60.184", 1990);
} catch (IOException e) {
Log.e("SocketTest", e.getLocalizedMessage(), e);
}
super.run();
}

Handler getHandler() {
if (handler == null) {
handler = new Handler(getLooper());
}
return handler;
}

void send(final String text) {
Runnable runnable = new Runnable() {
public void run() {
Log.e("SocketTest", "Start send text: " + text);
try {
socket.getOutputStream().write((text + "\n").getBytes());
socket.getOutputStream().flush();
} catch (Exception e) {
Log.e("SocketTest", e.getLocalizedMessage(), e);
}
Log.e("SocketTest", "Text has been send:" + text);
}
};
getHandler().post(runnable);
}

@Override
protected void onLooperPrepared() {
runOnUiThread(new Runnable() {
@Override
public void run() {
findViewById(R.id.button).setEnabled(true);
}
});
}
}

public void send(View view) {
String text = ((EditText) findViewById(R.id.text)).getText().toString();
thread.send(text);
}
}

服务器代码:
public class SocketTestServer {
ServerSocket serverSocket;

SocketTestServer() throws IOException {
serverSocket = new ServerSocket(1990);
}

void start() throws IOException {
Socket clientSocket = serverSocket.accept();
clientSocket.getInputStream();
PrintWriter out = new PrintWriter(System.out, true);
BufferedReader in =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
}
}

public static void main(String[] args) throws IOException {
SocketTestServer server = new SocketTestServer();
server.start();
}
}

我尝试了几部手机。在 Galaxy Nexus(4.2.1) 上按预期抛出异常,但在某些 MOTO 或 HTC 手机上,套接字仍然可以毫无异常地写入,这意味着我可能会丢失一些我认为已成功接收的消息。
我怎么知道任何类型的手机上的套接字连接都断开了?

任何建议将不胜感激。

附言
我知道连接更改广播,但在接收广播之前,客户端可能已经通过损坏的套接字写入了一些消息。

虽然在应用协议(protocol)上添加接收检查可以解决消息丢失的问题,但我更喜欢保证 TCP 协议(protocol) promise 的传输层的可靠性。

最佳答案

我在我的套接字中使用 Writer & IOException,它工作正常。试试这个:

public static void sendUTF(String str)
{
try
{
outWriter.write(str + '\n');
outWriter.flush();
}
catch (IOException e)
{
e.printStackTrace();
outServ.setText("Connection lost!");
}
}

public static Writer outWriter = new OutputStreamWriter(outputStream, "UTF-8");

关于wifi断开后,Android socket仍然可以正常写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191934/

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