- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一项作业,我必须使用 Java Socket
和 Thread
制作一个聊天程序,但我无法让它工作。我从 DataInputStream
获取 EOFEception
。据我了解,DataInputStream
中的 EOFException
意味着流已关闭,但我尚未关闭该流。
编辑:我和我的教授一起坐了一个小时,但她也无法弄清楚,所以对任何能弄清楚的人表示敬意。
聊天.java
package dev.gigaboy.chat;
import java.io.IOException;
import java.net.Socket;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class Chat extends Application {
private static final int WIDTH = 600, HEIGHT = 290;
private static String name;
private static IOThread buffThread;
private static Insets ins = new Insets(2.5, 5, 2.5, 5);
private static Font fnt = new Font("Calibri", 13);
public static TextArea chatBox, userBox;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage prmStage) throws Exception {
////////// CHAT SCENE //////////
HBox hbox = new HBox();
// current message
TextField tf = new TextField();
tf.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
try {
buffThread.getWriter().writeUTF(name + ": " + tf.getText());
buffThread.getWriter().flush();
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("Buffer Flushed");
// append message and scroll TextArea to bottom
chatBox.appendText(name + ": " + tf.getText() + "\n");
chatBox.selectPositionCaret(chatBox.getLength());
chatBox.deselect();
tf.clear();
}
});
// box where messages show up
chatBox = new TextArea();
chatBox.setWrapText(true);
chatBox.setEditable(false);
// box where users show up
userBox = new TextArea();
userBox.setMinSize(140, 250);
userBox.setMaxSize(140, 250);
userBox.setEditable(false);
hbox.getChildren().addAll(chatBox, userBox);
VBox vbox = new VBox();
vbox.getChildren().addAll(hbox, tf);
HBox.setMargin(chatBox, ins);
HBox.setMargin(userBox, ins);
VBox.setMargin(tf, ins);
////////// CONNECTION SCENE //////////
VBox connBox = new VBox();
TextField usr = new TextField("Username");
usr.setFont(fnt);
TextField host = new TextField("localhost");
host.setFont(fnt);
// set port to only allow positive integers
TextField port = new TextField("7777");
port.setFont(fnt);
port.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (!newValue.matches("\\d*")) {
port.setText(newValue.replaceAll("[^\\d]", ""));
}
}
});
Button bttn = new Button("Connect");
bttn.setFont(fnt);
bttn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent evt) {
// connect to server or become server
try {
connect(host.getText(), Integer.parseInt(port.getText()));
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
prmStage.setScene(new Scene(vbox, WIDTH, HEIGHT));
prmStage.setTitle(usr.getText() + " at " + host.getText() + ":" + port.getText());
name = usr.getText();
// reposition window
Rectangle2D scrnBounds = Screen.getPrimary().getVisualBounds();
prmStage.setX((scrnBounds.getWidth() - WIDTH) / 2);
prmStage.setY((scrnBounds.getHeight() - HEIGHT) / 2 - 50);
}
});
connBox.getChildren().addAll(usr,host, port, bttn);
VBox.setMargin(usr, ins);
VBox.setMargin(host, ins);
VBox.setMargin(port, ins);
VBox.setMargin(bttn, ins);
Scene connScene = new Scene(connBox, 230, 130);
prmStage.setOnCloseRequest(evt -> {
try {
if (buffThread != null)
buffThread.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Platform.exit();
System.exit(0);
});
prmStage.setTitle("Connect...");
prmStage.setScene(connScene);
prmStage.setResizable(false);
prmStage.show();
}
private static boolean isHostAvailable(String host, int port) {
try (Socket socket = new Socket(host, port)) {
return true;
} catch (IOException e) {
}
return false;
}
private static void connect(String host, int port) throws IOException {
if (isHostAvailable(host, port)) {
buffThread = new ClientThread(host, port);
System.out.println("CLIENT");
} else {
buffThread = new ServerThread(port);
System.out.println("SERVER");
}
buffThread.start();
}
}
ClientThread.java
package dev.gigaboy.chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import javafx.application.Platform;
public class ClientThread extends IOThread {
private Socket socket;
private String host;
private int port;
public ClientThread(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public void close() throws IOException {
socket.close();
super.close();
}
@Override
public void run() {
try {
socket = new Socket(host, port);
// inherited from BufferedThread
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
while (true) {
Platform.runLater(() -> {
try {
String line;
line = in.readUTF();
Chat.chatBox.appendText(line);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
ServerThread.java
package dev.gigaboy.chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javafx.application.Platform;
public class ServerThread extends IOThread {
private ServerSocket server;
private Socket socket;
private int port;
public ServerThread(int port) {
super();
this.port = port;
}
@Override
public void close() throws IOException {
server.close();
socket.close();
super.close();
}
@Override
public void run() {
try {
server = new ServerSocket(port);
socket = server.accept();
// inherited from BufferedThread
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
while (true) {
Platform.runLater(() -> {
try {
String line;
line = in.readUTF();
Chat.chatBox.appendText(line);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
IOThread.java
package dev.gigaboy.chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class IOThread extends Thread {
protected DataInputStream in;
protected DataOutputStream out;
public IOThread() {
}
public DataInputStream getReader() {
return in;
}
public DataOutputStream getWriter() {
return out;
}
public String readUTF() throws IOException {
return in.readUTF();
}
public void close() throws IOException {
in.close();
out.close();
}
}
最佳答案
我认为 readUTF 可能不理解它应该等待行字符的结尾,这就是发生这种情况的原因。
使用 DataFetcher 和 FetcherListener ( https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io ) 可以让您的生活变得更轻松
package tjacobs.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import tjacobs.io.TimeOut.TimeOutCmd;
/**
* DataFetcher is a generic way to read data from an input stream (file, socket, etc)
* DataFetcher can be set up with a thread so that it reads from an input stream
* and report to registered listeners as it gets
* more information. This vastly simplifies the process of always re-writing
* the same code for reading from an input stream.
* @author tjacobs01
*/
public class DataFetcher implements Runnable, TimeOutCmd {
public byte[] buf;
public InputStream in;
public int waitTime;
private ArrayList<FetcherListener> mFetcherListeners;
public int got = 0;
protected boolean mClearBufferFlag = false;
public DataFetcher(InputStream in, byte[] buf, int waitTime) {
this.buf = buf;
this.in = in;
this.waitTime = waitTime;
}
public void addFetcherListener(FetcherListener listener) {
if (mFetcherListeners == null) {
mFetcherListeners = new ArrayList<FetcherListener>(2);
}
if (!mFetcherListeners.contains(listener)) {
mFetcherListeners.add(listener);
}
}
public void removeFetcherListener(FetcherListener fll) {
if (mFetcherListeners == null) {
return;
}
mFetcherListeners.remove(fll);
}
public byte[] readCompletely() {
run();
return buf;
}
public int got() {
return got;
}
/** Override this to implement other implementations
*
*/
public void timeOut() {
try {
if (in != null)
in.close();
}
catch (IOException iox) {
iox.printStackTrace();
}
}
public void run() {
TimeOut to = null;
if (waitTime > 0) {
to = new TimeOut(this, waitTime);
Thread t = new Thread(to);
t.start();
}
int b;
try {
if (in == null) {
signalListeners(true);
return;
}
while ((b = in.read()) != -1) {
if (to != null) to.tick();
if (got + 1 > buf.length) {
buf = IOUtils.expandBuf(buf);
}
int start = got;
buf[got++] = (byte) b;
int available = in.available();
//System.out.println("got = " + got + " available = " + available + " buf.length = " + buf.length);
if (got + available > buf.length) {
buf = IOUtils.expandBuf(buf, Math.max(got + available, buf.length * 2));
}
got += in.read(buf, got, available);
signalListeners(false, start);
if (mClearBufferFlag) {
mClearBufferFlag = false;
got = 0;
}
}
} catch (IOException iox) {
iox.printStackTrace();
throw new PartialReadException(got, buf.length);
} finally {
if (to != null) to.stop();
buf = IOUtils.trimBuf(buf, got);
signalListeners(true);
}
}
private void setClearBufferFlag(boolean status) {
mClearBufferFlag = status;
}
public void clearBuffer() {
setClearBufferFlag(true);
}
private void signalListeners(boolean over) {
signalListeners (over, 0);
}
private void signalListeners(boolean over, int start) {
if (mFetcherListeners != null) {
Iterator<FetcherListener> i = mFetcherListeners.iterator();
while (i.hasNext()) {
FetcherListener fll = i.next();
if (over) {
fll.fetchedAll(buf);
} else {
fll.fetchedMore(buf, start, got);
}
}
}
}
public static interface FetcherListener {
public void fetchedMore(byte[] buf, int start, int end);
public void fetchedAll(byte[] buf);
}
public static class ToPrintStream implements FetcherListener {
PrintStream stream;
public ToPrintStream(PrintStream ps) {
stream = ps;
}
@Override
public void fetchedAll(byte[] buf) {
}
@Override
public void fetchedMore(byte[] buf, int start, int end) {
stream.print(new String(buf, start, end - start));
}
}
public static class ToStandardOut extends ToPrintStream {
public ToStandardOut() {
super(System.out);
}
}
}
关于java - 为什么我在尝试读取 DataInputStream 时收到 EOFException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55854168/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!