如何在java中实现TCP服务器和TCP客户端传输文件

时间:2011-01-12 07:09:18

标签: 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.java中的if子句来测试用户的输入,现在我真的想实现如何从双方传输文件(下载和上传)。谢谢。

3 个答案:

答案 0 :(得分:4)

因此,假设您在服务器端收到了文件名和文件路径。这段代码可以给你一些想法。

SERVER

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();

答案 1 :(得分:1)

假设您想继续支持发送消息以及来回发送文件......

正如您现在所使用的那样,您正在使用writeBytes将数据从客户端发送到服务器。

您可以使用它来发送任何内容,例如文件内容......

但您需要在客户端和服务器之间定义协议,以便他们知道何时传输文件而不是聊天消息。

例如,您可以在将文件发送到服务器之前发送消息/字符串“ FILECOMING ”,然后它会知道期望文件的字节。同样,你也需要一种标记文件结尾的方法......

或者,您可以在每条消息之前发送消息类型。

更高性能/响应式解决方案是在单独的线程/套接字上执行文件传输 - 这意味着传输不会阻止聊天消息。无论何时需要文件传输,都会为此创建一个新的线程/套接字连接。

〜克里斯

答案 2 :(得分:0)

implode()