【问题标题】:Problems with catching dataInputStream.readUTF();捕获 dataInputStream.readUTF() 的问题;
【发布时间】:2015-06-18 08:02:44
【问题描述】:

我正在编写一个 Java 程序,以使我的计算机成为服务器,以通过 WiFi 与我的智能手机进行通信。因此我使用了 Socket 类,如下代码所示(基于Android-er):

package main;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerCommunication {

    @SuppressWarnings("resource")
    public static void main(String[] args){
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        String message = null;

        try {
            int portNumber = 8888;
            serverSocket = new ServerSocket(portNumber);
            System.out.println("Listening :" + Integer.toString(portNumber));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        while(true){
            try {
                clientSocket = serverSocket.accept();
                dataInputStream = new DataInputStream(clientSocket.getInputStream());
                dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
                System.out.println("ip: " + clientSocket.getInetAddress());
                System.out.println("message: " + dataInputStream.readUTF());
                dataOutputStream.writeUTF("test");

                message = dataInputStream.readUTF(); // <--- PROBLEM LINE

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally{
                if( clientSocket!= null){
                    try {
                        clientSocket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if( dataInputStream!= null){
                    try {
                        dataInputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if( dataOutputStream!= null){
                    try {
                        dataOutputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

当文件中不存在问题行(用

谁能告诉我为什么我可以打印消息,但不能将其存储为字符串?

提前致谢!

【问题讨论】:

  • 先存储在字符串中,然后打印。现在您正在尝试读取 2 个字符串(第一个有效,第二个不存在)。
  • 您在打印日志消息时已经使用了流的内容。

标签: java android sockets datainputstream


【解决方案1】:

异常 java.io.EOFException 表示读取了流中的所有数据,看起来您正在尝试使用两次数据,一次在以下语句中,

System.out.println("message: " + dataInputStream.readUTF());

还有下一个,

dataInputStream.readUTF()

要么从写入端(客户端)写入更多数据,要么消耗一次。希望对您有所帮助。

【讨论】:

  • 这有帮助。我不熟悉流式传输原理。非常感谢。
【解决方案2】:

一旦你打电话

  dataInputStream.readUTF();

它会弹出字符串,然后打印那个字符串。然后在第二次调用中,由于输出流中没有更多数据,发生文件结束异常。

您可以尝试将弹出的字符串存储到一个变量中,然后打印它:

String  message = dataInputStream.readUTF();
System.out.println("message: " + message);

【讨论】:

  • 根据@Sathish 的评论,我按照您的指示解决了问题。感谢您的支持!
【解决方案3】:

删除你的问题行

message = dataInputStream.readUTF(); //

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 2012-12-29
    • 2011-03-16
    • 1970-01-01
    • 2013-03-14
    • 2015-06-21
    • 2011-09-17
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多