- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在两端使用 BufferedOutputStream 和 BufferedInputStream 将文件从“服务器”发送到“客户端”。问题是,虽然我在每次写入(右侧)时刷新()服务器上的 BufferedOutputStream,但每刷新一次(左侧),数据就会到达客户端套接字。
正如您所看到的,上面的文件发送得很好,但是如果我使用不同的文件或不同的缓冲区大小,如下所示......
...它“坏了”。客户端上的读取被阻止,因为流中没有任何内容,而且应该有。这整件事让我很困惑,显然我错过了一些东西。这是我的代码:
客户端
import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.lang.Math.*;
/**
* Client application which allows the user to connect with server
* and execute simple file transfers.
*
*/
public class Client
{
private BufferedReader textFromSocket;
private PrintWriter textToSocket;
private BufferedInputStream fileFromSocket;
private BufferedOutputStream fileToSocket;
private Socket connection;
private static final int port = 8888;
private static final String host = "localhost";
private static final String filesFolder = "client/clientFiles/";
/**
* Initializes all the streams and the socket
*
* @throws IOException
*/
public Client() throws IOException {
// Try to open up a connection with cslin152, port number 4242. If cslin152 is unavailable,
// run the this on the same machine as the client, and use the hostname host.
connection = new Socket( host, port);
// Buffer the reading stream for performance.
textFromSocket = new BufferedReader( new InputStreamReader( connection.getInputStream()));
// Writing stream
textToSocket = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(connection.getOutputStream())), true);
// Data input (incoming) stream
fileFromSocket = new BufferedInputStream( new DataInputStream(connection.getInputStream()),8*1024);
// Data output (outgoing) stream
fileToSocket = new BufferedOutputStream( new DataOutputStream(connection.getOutputStream()));
}
/**
* Sends a request to server
*
* @param cmd request to send
* @throws IOException
*/
public void askServer(String cmd) throws IOException {
if (cmd != null) {
// write to this
textToSocket.println(cmd);
}
String[] command = cmd.split(" ");
switch (command[0]) {
case "list":
this.readList();
break;
case "get":
if (command.length < 2){
System.out.println("Filename not specified");
}else{
this.getFile(command[1]);
}
break;
case "put":
if (command.length < 2){
System.out.println("Filename not specified");
}else{
this.putFile(command[1]);
}
break;
case "bye":
this.byeBye();
break;
default:
System.out.println(textFromSocket.readLine());
break;
}
}
/**
* Executes client-side commands for "list" command
* "list" command, lists all files available on the server
*/
public void readList(){
try {
String line;
while ( !(line = textFromSocket.readLine()).equals("")) {
System.out.println(line);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* Executes client-side commands for "get" command
* "get" command, downloads a file from server
*
* @param filename the name of the file where data will be saved
*/
public void getFile(String fileName) throws IOException {
File downloadFile = new File(filesFolder, fileName);
try (FileOutputStream fos = new FileOutputStream(downloadFile)) {
copy(fileFromSocket, fos);
fos.flush();
}
}
public long copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8 * 1024];
long total = 0L;
while (true) {
int read = in.read(buffer);
if (read < 0) {
break;
}
out.write(buffer, 0, read);
total += read;
}
return total;
}
/**
* Executes client-side commands for "put" command
* "put" command, uploads a file to server
*
* @param filename the name of the file to upload
*/
public void putFile(String filename){
File sendFile = new File(filesFolder + filename);
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sendFile));
int fileSize = (int)sendFile.length();
if (sendFile.exists()) {
textToSocket.println(fileSize);
byte[] myBuffer = new byte[fileSize];
bis.read(myBuffer, 0, fileSize);
fileToSocket.write(myBuffer);
fileToSocket.flush();
bis.close();
}else {
System.out.println("Error: File not found");
}
}
catch (FileNotFoundException e) {
System.out.println("Error: File doesn't exist");
}
catch (IOException e){
System.out.println("Error: Couldn't read the file");
}
}
/**
* Closes all the streams, connection and terminates the client
*/
public void byeBye(){
try {
connection.close();
fileFromSocket.close();
fileToSocket.close();
textToSocket.close();
textFromSocket.close();
}
catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
/**
* Connects with the server and continuously scans for user input
*
*/
public static void main(String[] args)
{
Client client = null;
Scanner keyboardInput = new Scanner(System.in);
while (client == null){
try {
client = new Client();
System.out.println("Connected to server at : "+ host +":"+ port);
}
catch (IOException e) {
System.out.println("ERROR: Couldn't connect to server, press ENTER to try again");
// Wait for ENTER
keyboardInput.nextLine();
}
}
while (true) {
System.out.printf("client>");
String cmd = keyboardInput.nextLine();
try {
client.askServer(cmd);
}
catch (IOException e) {
System.out.println("Error: Server didn't reply");
}
}
}
}
每个线程(连接的客户端)CLIENT_HANDLER
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Client handler application which is run as a separate thread for each connected client
*
*/
public class ClientHandler extends Thread
{
private BufferedReader textFromSocket;
private PrintWriter textToSocket;
private BufferedInputStream fileFromSocket;
private BufferedOutputStream fileToSocket;
private Socket connection;
private static final String filesFolder = "server/serverFiles/";
private static final String logFile = "server/log.txt";
/**
* Initializes all the streams and the socket
*
* @throws IOException
*/
public ClientHandler(Socket client){
try {
connection = client;
// Buffer the reading stream for performance.
textFromSocket = new BufferedReader( new InputStreamReader( connection.getInputStream()));
// Writing stream
textToSocket = new PrintWriter( new BufferedWriter( new OutputStreamWriter(connection.getOutputStream())), true);
// Data input (incoming) stream
fileFromSocket = new BufferedInputStream( new DataInputStream(connection.getInputStream()));
// Data output (outgoing) stream
fileToSocket = new BufferedOutputStream( new DataOutputStream(connection.getOutputStream()),8*1024);
}
catch( IOException e )
{
System.out.println( e );
}
}
/**
* Reads a request from client
*
* @return client request
*/
public String getLine(){
try {
return textFromSocket.readLine();
}
catch (IOException e) {
System.out.println("error: Couldn't read from client (Connection Lost)");
return null;
}
}
/**
* Executes server-side commands for "list" command
* "list" command, lists all files available on the server
*/
public void list(){
File serverDir = new File(filesFolder);
File[] fileList = serverDir.listFiles();
for (int i=0;i<fileList.length;i++){
textToSocket.println(fileList[i].getName());
}
textToSocket.println("");
textToSocket.flush();
}
/**
* Executes server-side commands for "get" command
* "get" command, downloads a file from server
*
* @param filename the name of the file to be sent to client
*/
public void get(String filename) throws IOException {
File fileToSend = new File(filesFolder, filename);
try (FileInputStream in = new FileInputStream(fileToSend)) {
copy(in, fileToSocket);
fileToSocket.flush();
}
}
public long copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8 * 1024];
long total = 0L;
while (true) {
int read = in.read(buffer);
if (read < 0) {
break;
}
out.write(buffer, 0, read);
total += read;
}
return total;
}
/**
* Executes client-side commands for "put" command
* "put" command, uploads a file to server
*
* @param filename the name of the file to be received from client
*/
public void put(String filename){
try{
String text = textFromSocket.readLine();
if (text.indexOf("ERROR") == -1) {
int fileSize = Integer.parseInt(text);
File downloadFile = new File(filesFolder + filename);
FileOutputStream fos = new FileOutputStream(downloadFile);
byte[] myBuffer = new byte[16 * 1024];
int readBytes = 0;
int currentBytes = 0;
while (readBytes < fileSize) {
currentBytes = fileFromSocket.read(myBuffer, 0, myBuffer.length);
readBytes += currentBytes;
fos.write(myBuffer, 0, currentBytes);
}
fos.close();
System.out.println("File downloaded");
}else{
System.out.println(text);
}
}
catch (IOException e) {
System.out.println("ERROR: Couldn't download\\save the file");
}
}
/**
* Closes all the streams and connection
*/
public void byeBye(){
try {
connection.close();
fileFromSocket.close();
fileToSocket.close();
textToSocket.close();
textFromSocket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* Stores a request from client in a log.txt file
* each request is stored in a form: date:time:client IP address:request
*
* @param request the request made by client
*/
public void logRequest(String request){
File file = new File (logFile);
try {
PrintWriter log = new PrintWriter(new BufferedWriter(new FileWriter(file,true)));
// Get all the details
Date today = new Date();
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy:hh:mm:ss");
String date = dateFormatter.format(today);
String address = connection.getInetAddress().toString();
System.out.println("log: " + date+":"+address+":"+request);
// Save request with details to file
log.println(date + ":" + address + ":" + request);
}
catch (FileNotFoundException e) {
System.out.println("error: log.txt couldn't be created");
}
catch (IOException e){
System.out.println("File writer");
}
}
/**
* Sends an error message to a client
*
* @param text content of the message
*/
public void error(String text){
textToSocket.println("ERROR Server: "+text);
textToSocket.flush();
}
/**
* Continuously reads requests from clients and executes them
*/
public void run() {
String read;
while (( read = (this.getLine())) != null) {
// log the request
this.logRequest(read);
// split command for potential arguments
String[] command = read.split(" ");
if (command.length > 2) {
this.error("Too many arguments");
} else {
switch (command[0]) {
case "list":
this.list();
break;
case "get":
if (command.length < 2){
System.out.printf("Filename not provided");
}else {
try {
this.get(command[1]);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case "put":
if (command.length < 2){
System.out.printf("Filename not provided");
}else {
this.put(command[1]);
}
break;
case "bye":
this.byeBye();
break;
default:
this.error("illegal command");
break;
}
}
}
}
}
服务器
import java.net.*;
import java.io.*;
import java.util.concurrent.*;
/**
* Server application which allows multiple clients to connect and execute simple file transfers.
*
* Manages a fixed thread pool of maximum 10 threads (connections)
*
*/
public class Server {
private static final int port = 8888;
// As a demonstration, put everything into main(); obviously you would probably want
// to use instance variables and break this up into separate methods for a real application.
public static void main(String[] args) throws IOException {
ServerSocket server = null;
ExecutorService service = null;
File file = new File("server/log.txt");
// Try to open up the listening port
try {
server = new ServerSocket(port);
}
catch (IOException e) {
System.err.println("Could not listen on port: "+ port);
System.exit(-1);
}
System.out.println("Server Running");
// Initialise the executor.
service = Executors.newFixedThreadPool(10);
// Clear/Delete log.txt from last execution
if (file.exists()){
if(file.delete()){
System.out.println("Log cleared");
}else{
System.out.println("Log couldn't be cleared");
}
}else{
System.out.println("Log empty, nothing to clear");
}
// For each new client, submit a new handler to the thread pool.
while( true )
{
Socket client = server.accept();
service.submit( new ClientHandler(client) );
System.out.println("Client connected");
}
}
}
最佳答案
在客户端代码中,您需要在关闭之前调用fos.flush()
。
顺便说一句,客户端的最小逻辑并不是真正必要的。有更简单的方法可以实现这些目标。
关于Java BufferedOutputStream.flush() 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331898/
我们知道,当使用 hibernate 对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到存储在当前 session 中的实体。 所以我可以调用 session.refresh 来加载对
我正在做一个项目,所有的东西都保存在事件中,所以服务器需要一些时间来响应新数据。我正在使用 Fluent 等待使用 ajax 的页面,但是这个不使用任何 ajax。所以我想刷新页面检查是否有新项目,如
我有一个从 Vector 创建的 JTable。 如何刷新 JTable 以显示添加到 Vector 的新数据? 最佳答案 当 TableModel 发生更改时,您的 JTable 应该会自动更新。我
有没有办法使用下面的代码来刷新已经存在的 div id,而不是刷新时间? window.onload = startInterval; function startInterval() {
我更新了在 Shiny Server 上运行的 Shiny 应用程序使用的 DataSet.RData。但是, Shiny 的应用程序仍在旧数据上运行。我已通过浏览器历史记录清除并重新启动浏览器几次,
我的应用程序中有一个无限滚动的网格面板(ExtJs 4.2.1),类似于 this example .用户可以单击刷新按钮,然后必须使用数据库中的数据更新网格的行。我在刷新按钮处理程序中调用 stor
我不知道这三种方法中哪一种最适合我。他们都为我工作。有谁知道刷新、更新和重画之间的区别吗? 最佳答案 根据在线文档: Refresh - 重新绘制屏幕上的控件。 Call Refresh method
有什么办法吗 ICollectionView.Refresh() 或者 CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); 在
这个问题已经有答案了: Updating address bar with new URL without hash or reloading the page [duplicate] (4 个回答)
我有一个 javascript 设置超时以在 10 秒后关闭 div,并且我想在 div 关闭时添加页面刷新。我正在使用的代码如下。 var container_close_sec = "1
我有一组具有以下名称的页面.... update1.php update2.php update3.php update4.php update5.php update6.php update7.ph
如果是则触发js函数。我可以使一个复选框保持选中状态,并在页面刷新时检查值并选中“checked”,并提交以下内容... checked="checked" /> 你都不记得触发js函数。 这是我的
我正在尝试刷新 php 脚本以在数据库更新时显示更新的内容。我首先构建了我的 php,然后刷新代码,然后合并它们。但是,脚本不会更新。有谁知道为什么吗? $(document).ready
当我要删除的节点扩展集合类型时,Grails中有一个错误阻止我使用removeFrom *。直接从关联中删除节点不会更新二级缓存。 A hasMany B 有什么方法可以使关联缓存手动无效或强制重新加
我正在使用 hibernate 和 mysql 来抽象一个数据库,以便在 java 驱动的网站中使用。我使用 hibernate 很好地解决了所有查询,但似乎无法弄清楚如何使用它进行更新、插入和删除,
如何通过调用 oncreateview 方法重新创建 fragment ?我有一个 fragment ,用于通过表单插入新数据,单击按钮后,我想通过删除在 EditText 中输入的数据来重新创建 f
当我从一个到另一个时,我试图刷新我的观点。我知道我应该将刷新代码放在 viewWillAppear 中,但我不知道该放什么代码。 你们能帮帮我吗? 谢谢! 最佳答案 在您看来,请调用 setNeeds
我正在开发 iPhone 应用程序并希望使用: CFStreamCreatePairWithSocketToHost(NULL, url, port, &serverReadStream, &serv
看到我已经创建了一个用于登录用户的脚本。而且我还添加了设置选项卡,以便用户可以编辑他们的设置!但是当我尝试它时,mysql 表中的数据发生了变化,但配置文件中显示的用户名和用户电子邮件保持不变!当我注
好的。这就是它的样子。 当我启动应用程序时,我从服务器收到的第一件事是数据: {name: "test", type: "checkbox" checked: true, } 这使得其中一个复选框
我是一名优秀的程序员,十分优秀!