java - java实现TCP server和TCP client传输文件的方法

标签 java tcp client

我已经实现了简单的 TCP 服务器和 TCP 客户端类,它们可以将消息从客户端发送到服务器,消息将在服务器端转换为大写,但是如何实现从服务器到客户端的传输文件并上传从客户端到服务器的文件。以下代码是我得到的。

TCPClient.java:

import java.io.*;
import java.net.*;

class TCPClient {
 public static void main(String args[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("127.0.0.1", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + "\n");
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER:" + modifiedSentence);
        clientSocket.close();
    }
}

TCPServer.java:

import java.io.*;
import java.net.*;

class TCPServer {
    public static void main(String args[]) throws Exception {
        int firsttime = 1;
        while (true) {
            String clientSentence;
            String capitalizedSentence="";
            ServerSocket welcomeSocket = new ServerSocket(3248);
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            //System.out.println(clientSentence);
            if (clientSentence.equals("set")) {
                outToClient.writeBytes("connection is ");
                System.out.println("running here");
                //welcomeSocket.close();
                //outToClient.writeBytes(capitalizedSentence);
            }
            capitalizedSentence = clientSentence.toUpperCase() + "\n";
            //if(!clientSentence.equals("quit"))
            outToClient.writeBytes(capitalizedSentence+"enter the message or command: ");
            System.out.println("passed");
            //outToClient.writeBytes("enter the message or command: ");
            welcomeSocket.close();
            System.out.println("connection terminated");
        }
    }
}

所以,TCPServer.java会先执行,然后再执行TCPClient.java,我尝试在TCPServer中使用if子句.java 来测试用户输入的是什么,现在我真的想实现如何从双方传输文件(下载和上传)。谢谢。

最佳答案

因此让我们假设在服务器端您已经收到文件名和文件路径。这段代码应该会给你一些想法。

服务器

PrintStream out = new PrintStream(socket.getOutputStream(), true);
FileInputStream requestedfile = new FileInputStream(completeFilePath);
byte[] buffer = new byte[1];
out.println("Content-Length: "+new File(completeFilePath).length()); // for the client to receive file
while((requestedfile.read(buffer)!=-1)){
    out.write(buffer);
    out.flush();    
    out.close();    
}
requestedfile.close();

客户

DataInputStream in = new DataInputStream(socket.getInputStream());
int size = Integer.parseInt(in.readLine().split(": ")[1]);
byte[] item = new byte[size];
for(int i = 0; i < size; i++)
    item[i] = in.readByte();
FileOutputStream requestedfile = new FileOutputStream(new File(fileName));
BufferedOutputStream bos = new BufferedOutputStream(requestedfile);
bos.write(item);
bos.close();
fos.close();

关于java - java实现TCP server和TCP client传输文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4666180/

相关文章:

java - 关于以0开头的 "int"数字的说明

java - 基于 Ç 的字符串分割

javascript - 有没有办法从 AVI 视频文件创建ObjectURL?

java - 使用 JSCH 在 Java 中维护 SSH channel

java - 在这种情况下,我选择组合而不是继承是正确的吗?

Java效率

linux unix套接字与tcp套接字发送缓冲区大小

tcp - 将 keep-alive 与负载平衡器和防火墙一起使用很有用

go - 如何使用 tls.Dial 添加 10 秒超时? (没有tls.DialTimeout对应net.DialTimeout)

java - 部署客户端/服务器 Java 应用程序