gpt4 book ai didi

java - Android套接字连接但无法写入

转载 作者:行者123 更新时间:2023-11-29 03:16:49 25 4
gpt4 key购买 nike

我试图在我的应用程序中建立一些网络,但我遇到了一些问题。似乎我无法写入 OutputStream 对象。虽然我的服务器收到连接,但它没有收到任何数据。我试过使用 Writer、DataOutputStream 等。似乎没有一个工作。我的应用程序使用使用 Socket 对象和消息调用此对象的异步任务。 (在使用 setStreams 方法初始化后,套接字对象已用于设置 Streams。)有人可以尝试找出问题所在吗?我将非常感激。

public class NetworkingUtils {
private OutputStream out = null;
private InputStream in = null;

//set streams
public void setStreams(Socket sock){
if (sock.isConnected()) {
try {
this.out = (OutputStream) sock.getOutputStream();
this.in = (InputStream) sock.getInputStream();
} catch (Throwable e) {
Log.d("SOCKET", "FAILED TO SET STREAMS");
e.printStackTrace();
}
}
}

//send \n terminated messages to pre defined socket
public void sendMessage(Socket sock, String message) throws Throwable {
if (sock.isConnected()) {
try {
this.out.write(message.getBytes());
Log.d("SOCKET","WRITING COMPLETE. " + message);
} catch (Throwable e) {
throw e;
}
}
}

public String recvMessage(Socket sock) throws Throwable {
//receives \n terminated message from pre defined socket
String answer = null;
if (sock.isConnected()){
try{
answer = this.convertStreamToString(this.in);
Log.d("SOCKET","READING COMPLETE");
}
catch (Throwable e){
Log.d("socket",e.getLocalizedMessage());
throw e;
}
}
else{
Log.d("socket","is not connected!!!");
}
if (answer.length() == 0){
//empty string answer from server
throw new IOException();
}
else {
return answer;
}

}

private String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = null;
try{
s = new java.util.Scanner(is).useDelimiter("\r\n");}
catch (Throwable e){
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}

最佳答案

我只能看到一个客户端可能导致此...我对此表示怀疑。 (也就是说:试试这个,以防万一它会有所不同,但我认为它不会。)

  this.out.write(message.getBytes());
Log.d("SOCKET","WRITING COMPLETE. " + message);

潜在的问题是,如果 out 是一个“缓冲”流,那么 write 可能只会导致将字节写入缓冲区。可能需要调用 this.out.flush() 以“推送”到服务器。

但我怀疑它是否有用,因为(据我所知)套接字输出流未在 Java 中进行缓冲。我认为真正的问题更有可能出在服务器端。

如果您无法确定问题出在哪一侧,我建议您尝试使用网络监控/数据包嗅探工具(在服务器端)检查数据是否到达服务器主机。


虽然我引起了你的注意,但你的异常代码真的非常糟糕。

  1. 不要将方法声明为throws Throwable(或throws Exception)。这基本上是说“这个方法可能会抛出任何异常,我不会告诉你是哪一个”。当您这样做时,调用者代码必须处理任何异常,这基本上不可能智能地做到。

    应该做的是将该方法声明为抛出代码可以抛出的已检查异常。例如,在您的情况下,IOException 可能就足够了。

  2. 捕获异常、记录它然后重新抛出它不是一个好主意。为什么?因为在堆栈的更上方,可能还有其他方法会看到异常。他们不知道异常是否已经被记录下来。所以他们应该记录它(可能导致同一问题的重复日志事件)还是不记录(可能导致异常被取消记录。)

  3. 不要在没有消息的情况下抛出异常:

          throw new IOException();

    懒惰。您应该始终包含一条可以(至少)被 grep 或 google 搜索到的简单消息。

此外,您不必到处测试 Socket.isConnected()。根据 javadoc:

Returns: true if the socket was successfuly connected to a server

Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed.

因此重复测试 isConnected 是无效的。如果它返回一次 true,从那时起它将始终返回 true

甚至 setStreams 中的初始 isConnected 测试也值得怀疑。我只是调用 getInputStream 而不进行测试,并依赖 Socket API 在套接字处于错误状态时抛出 IOException

关于java - Android套接字连接但无法写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069282/

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