捕捉 dataInputStream.readUTF(); 的问题
Problems with catching dataInputStream.readUTF();
我正在制作一个 Java 程序,使我的计算机成为服务器,通过 WiFi 与我的智能手机通信。因此我使用 Socket class,如下面的代码所示(基于 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();
}
}
}
}
}
}
当问题行(用 <--- 表示)不在文件中时,一切正常。我收到的消息已正确打印在控制台中。但是当我想将这条消息存储在一个字符串中时,我得到一个 java.io.EOFException...
谁能告诉我为什么我可以打印消息,但不能将其存储为字符串?
提前致谢!
异常java.io.EOFException表示流中的所有数据都被读取了,看起来你正在尝试使用数据两次,一次在下面的语句中,
System.out.println("message: " + dataInputStream.readUTF());
和下一个,
dataInputStream.readUTF()
要么从写入端(客户端)写入更多数据,要么消费一次。希望对你有帮助。
一旦你打电话
dataInputStream.readUTF();
它会弹出字符串,然后您打印那个字符串。然后在第二次调用中,由于输出流中没有更多数据,因此发生文件结束异常。
您可以尝试将弹出的字符串存储到一个变量中,然后打印它:
String message = dataInputStream.readUTF();
System.out.println("message: " + message);
删除问题行
消息=dataInputStream.readUTF(); // <--- 问题行
我正在制作一个 Java 程序,使我的计算机成为服务器,通过 WiFi 与我的智能手机通信。因此我使用 Socket class,如下面的代码所示(基于 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();
}
}
}
}
}
}
当问题行(用 <--- 表示)不在文件中时,一切正常。我收到的消息已正确打印在控制台中。但是当我想将这条消息存储在一个字符串中时,我得到一个 java.io.EOFException...
谁能告诉我为什么我可以打印消息,但不能将其存储为字符串?
提前致谢!
异常java.io.EOFException表示流中的所有数据都被读取了,看起来你正在尝试使用数据两次,一次在下面的语句中,
System.out.println("message: " + dataInputStream.readUTF());
和下一个,
dataInputStream.readUTF()
要么从写入端(客户端)写入更多数据,要么消费一次。希望对你有帮助。
一旦你打电话
dataInputStream.readUTF();
它会弹出字符串,然后您打印那个字符串。然后在第二次调用中,由于输出流中没有更多数据,因此发生文件结束异常。
您可以尝试将弹出的字符串存储到一个变量中,然后打印它:
String message = dataInputStream.readUTF();
System.out.println("message: " + message);
删除问题行
消息=dataInputStream.readUTF(); // <--- 问题行