- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个简单的套接字客户端-服务器对,其中一个可以发送消息,但在我的一个运行方法中,我这样做:String servermessage = new String(dis.readUTF());
它返回一个 java.io.EOFException
我做错了什么,有没有更好的方法在客户端和服务器套接字之间发送消息?
编辑:我现在知道当输入流在所有字节之前到达末尾时会发生 EOFException,但我不明白它们的意思,有人可以澄清吗?
服务器:
public class Server {
String host = "localhost";
int port = 2484;
static boolean launched = false;
ServerSocket server;
static DataOutputStream dos;
public static void main(String args[]) throws IOException {
final Server serv = new Server();
final Thread socketThread = new Thread(new Runnable() {
ServerSocket server;
@Override
public void run() {
try {
Server serv = new Server();
ServerSocket server = new ServerSocket(serv.port);
System.out.println("Server: Launched!");
Socket client = server.accept();
OutputStream clientOut = client.getOutputStream();
DataOutputStream dos = new DataOutputStream(clientOut);
dos.close();
clientOut.close();
server.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Thread input = new Thread(new Runnable() { //Thread that reads from an input from the console
Server serv = new Server();
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
System.out.println("Type Something!");
while (true) {
String input = scanner.next();
if (input.equalsIgnoreCase("Start")) {
if(!launched) { //Checks if the ServerSocket server is already launched, and if not, launches it
System.out.println("Launching the socket!");
socketThread.start();
input = scanner.next();
launched = true;
} else if(launched){
System.err.println("ServerSocket is already Launched!");
}
} else if (input.equalsIgnoreCase("Send")) {
System.out.println("What would you like to send?");
input = null;
input = scanner.next();
System.out.println("Server: " + input);
try {
dos.writeUTF(input); //Sends the input to the client
} catch (IOException e) {
System.err.println("Unable to send the message");
e.printStackTrace();
}
} else {
System.err.println("Unknown Input!");
input = null;
}
}
}
});
input.start();
}
}
套接字管理器:
package Socket_Swing_Test_2;
public class SocketManager implements Runnable {
ClientMain c = new ClientMain();
ClientSwing cs = new ClientSwing();
Socket client;
PrintWriter output;
BufferedReader input;
InputStream clientIn;
DataInputStream dis;
String host = "localhost";
int port = 2484;
JTextArea textArea = cs.textArea;
public SocketManager(ClientMain c) {
this.c = c;
try {
client = new Socket(host, port);
System.out.println("SocketManager: Connected to the server!");
clientIn = client.getInputStream();
dis = new DataInputStream(clientIn);
} catch (Exception e) {
System.err.println("Client: Socket failed to Connect");
e.printStackTrace();
}
}
public synchronized void send(String message) {
try {
output.println(message);
output.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void connect() {
try {
client = new Socket(host, port);
} catch (Exception e) {
System.err.println("Client: Socket failed to Connect");
e.printStackTrace();
}
}
public synchronized void close() {
try {
client.close();
} catch (Exception e) {
System.err.println("Unable to close the socket!");
e.printStackTrace();
}
clientIn = null;
dis = null;
System.gc(); // Garbage Collector, recycles unused objects that are taking up RAM
}
public synchronized boolean checkConnection() {
return client.isConnected();
}
public synchronized void listenStream() { //Unused, keeping for reference
try {
while (input.ready()) {
System.out.println(input.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized Socket getSocket() {
return client;
}
public void receive() {
}
@Override
public void run() {
System.out.println("SocketManager.run: Is running!");
try {
//Read for a message from the server
System.out.println("SocketManager.run: Checking for messages from the server");
String servermessage = new String(dis.readUTF());
textArea.append(servermessage);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.close();
close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
你们可能不需要,但以防万一
ClientSwing:
public class ClientSwing extends JFrame {
JPanel panel;
JTextArea textArea;
JTextField textField;
int WIDTH = 640;
int HEIGHT = 480;
public ClientSwing() {
super("Client");
panel = new JPanel();
panel.setLayout(null);
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setBounds(0, 0, WIDTH, HEIGHT - 15);
textArea.setFont(new Font("Impact", Font.PLAIN, 13 + 1/2));
textField = new JTextField();
textField.setLocation(0, HEIGHT - 47);
textField.setSize(WIDTH, 20);
textField.addActionListener(new ActionListener() { //I AM RIGHT HERE
@Override
public void actionPerformed(ActionEvent e) {
String input = textField.getText();
if(input.equalsIgnoreCase("Launch")) {
SwingWorker socketLaunch = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
ClientMain main = new ClientMain();
main.run();
return null;
}
};
socketLaunch.execute();
}
}
});
panel.add(textArea);
panel.add(textField);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(WIDTH, HEIGHT);
setLocationRelativeTo(null);
setResizable(false);
add(textField);
add(textArea);
}
}
客户端主:
public class ClientMain extends JFrame {
private SocketManager network;
int a = 1;
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ClientSwing window = new ClientSwing();
window.setVisible(true);
}
});
}
public void run() {
network = new SocketManager(new ClientMain());
Thread thread = new Thread(network);
thread.run();
}
public SocketManager getSocketM() {
return network;
}
}
跟踪:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at Socket_Swing_Test_2.SocketManager.run(SocketManager.java:114)
at java.lang.Thread.run(Unknown Source)
at Socket_Swing_Test_2.ClientMain.run(ClientMain.java:26)
at Socket_Swing_Test_2.ClientSwing$1$1.doInBackground(ClientSwing.java:46)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
最佳答案
摘自 Data Streams 上的教程:
Notice that
DataStreams
detects an end-of-file condition by catchingEOFException
, instead of testing for an invalid return value.
数据流为原始数据值提供二进制 I/O;没有任何方法可以读取代表结束的值。
关于Java - DataInputStream readUTF 返回 EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21191017/
我编写了以下客户端-服务器对来设置一个非常简化版本的 IPSec 连接(与加密相关)。 问题是,在第二次调用 readObject() 时,即: // Receive finished
我创建了一个 Talend 作业,它执行以下操作:从表 A 中读取记录 x。将记录 x + 1.000.000 写入表 A 中。这很有效,但在 310 条记录后失败。它显然与记录中的值无关。如果我将输
我正在使用iText将html转换为pdf,当我尝试注册fontProvider时,我得到EOFException,这里是相关代码: XMLWorkerFontProvider fontProvide
以下代码在反序列化期间抛出 EOFException [in line size = in.readInt();],我很困惑为什么会发生这种情况。 import java.io.IOException
我正在使用此代码读取 Java 中的文件 import java.io.*; public class IOReadDataStreams { public static void main(
我的目标是将远程服务器中的 200 个 .jpg 文件下载到我的 Android 手机(运行 jellybeans)。为了做到这一点,我在循环中运行下面的方法,并将不同的文件名分配给文件名参数。它运行
输出正确,但后面跟着一个 EOFException。我阅读了文档,但仍然不知道如何解决这个问题 try(ObjectInputStream ois = new ObjectInputStream(ne
我有一个通过套接字向主机发送数据的客户端。有时我会得到java.io.EOFException。 问题是:我如何知道是谁导致套接字关闭?由于远程主机关闭了套接字,该异常是否总是引发? 或者也可能是内部
这个问题已经有答案了: Java FileInputStream ObjectInputStream reaches end of file EOF (9 个回答) 已关闭 9 年前。 请看下面的代码
我尝试使用 this question's answer 来获得功能实现,但出现各种错误,现在出现 EOFException,并且在调试时,似乎文件未写入。 目标是从 URL 下载图像,将其保存到内部
我正在测试 ObjectInputStream 和 ObjectOutputStream 类 尝试在缓冲流对象中扭曲两者.. File file = new File("file.lel"); //A
我使用文件来缓冲它来显示流内容(因为它可能足够大以将其保存在 RAM 中)。我有两个线程:第一个线程从服务器下载文件并将其写入本地存储,第二个线程读取该文件并显示内容。 问题是,当第二个线程到达文件末
`INFO 11:44:29,874 Listening for thrift clients... ERROR 11:47:01,471 Exception in thread Thread[Rea
我在反序列化对象时遇到此异常: 控制台输出 sending request: GET_OBJS java.io.EOFException receiving response at java.io.O
我正在使用以下代码进行发布请求 public String executeHttpPost(String uri, String data) { HttpURLConnection conn
我正在通过加密的 ByteArrayOutputStream 将一个序列化和加密的对象写入数据库到一个大对象中。我可以检索这个大对象,但无法反序列化它。 这是我编写的代码: public void a
这个问题在这里已经有了答案: java.io.EOFException while writing and reading froma servlet (2 个答案) 关闭 10 年前。 当我尝试通
我正在尝试编写一个消息传递应用程序,并且我能够发送消息(显示为服务器客户端正确显示消息)但随后将我的客户端踢出服务器。服务器打印以下错误: java.io.EOFException at java.i
我有以下问题: 这段代码... try { fis = new FileInputStream(serializedKeyIndex); in = new Ob
我正在使用随机访问文件来编写一个使用 arrayList 存储的 raf。我不知道它是否可以完成,但我正在试一试,因为它是我创建此应用程序的最佳解决方案。 这是我遇到的运行时错误: Exception
我是一名优秀的程序员,十分优秀!