2011-01-12 32 views
10

Tôi đã triển khai các máy chủ TCP đơn giản và các lớp máy khách TCP có thể gửi tin nhắn từ máy khách đến máy chủ và tin nhắn sẽ được chuyển thành chữ hoa ở phía máy chủ, nhưng làm thế nào tôi có thể đạt được chuyển các tập tin từ máy chủ cho khách hàng và tải lên các tập tin từ khách hàng đến máy chủ. các mã sau đây là những gì tôi đã có.cách triển khai máy chủ TCP và máy khách TCP trong java để chuyển các tệp

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"); 
     } 
    } 
} 

Vì vậy, TCPServer.java sẽ được thực hiện đầu tiên, và sau đó thực hiện các TCPClient.java, và tôi cố gắng sử dụng mệnh đề if trong TCPServer.java để kiểm tra đầu vào của người dùng là gì, bây giờ tôi thực sự muốn triển khai cách truyền tệp từ cả hai phía (tải xuống và tải lên) .Cảm ơn.

+0

http://stackoverflow.com/questions/4687615/how-to-achieve-transfer-file-between-client-and- server-using-java-socket –

+0

Ngoài tất cả các câu trả lời, bạn có thể đọc tất cả các byte của bất kỳ tập tin nào cùng một lúc với [readAllBytes (...)] (http://docs.oracle.com/javase/8/docs/ api/java/nio/file/Files.html # readAllBytes-java.nio.file.Path-) và ghi chúng vào bất kỳ tệp nào w ith [write (...)] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#write-java.nio.file.Path-byte: A-java.nio.file.OpenOption ...-). – thanopi57

Trả lời

2

This liên kết sẽ trợ giúp.

+0

Tôi đã thêm nếu (clientSentence.bằng ("tốt")) \t {capitalizedSentence = "kết nối được đặt"; \t //outToClient.writeBytes(capitalizedSentence); \t} \t khác \t \t \t {capitalizedSentence = clientSentence.toUpperCase() + "\ n"; \t \t \t \t \t \t} outToClient.writeBytes (capitalizedSentence); welcomeSocket.close(); với mã máy chủ, nhưng có vẻ như không hoạt động, bạn có thể giúp tôi với nó không – starcaller

+0

Bạn sẽ cần cho chúng tôi biết mã bạn hiện đang sử dụng và ngoại lệ bạn đang nhận được. – npinti

+0

Tôi đã cập nhật câu hỏi, vui lòng kiểm tra, cảm ơn. – starcaller

1

Giả sử bạn muốn tiếp tục hỗ trợ gửi tin nhắn cũng như gửi file qua lại ...

Như các bạn đã bây giờ, bạn đang sử dụng writeBytes để gửi dữ liệu từ client tới server.

Bạn có thể sử dụng để gửi bất cứ điều gì, giống như nội dung của file ...

Nhưng bạn sẽ cần phải xác định một giao thức giữa máy khách và máy chủ của bạn để họ biết khi nào một tập tin được chuyển chứ không phải là một tin nhắn trò chuyện.

Ví dụ: bạn có thể gửi thông báo/chuỗi "FILECOMING" trước khi gửi tệp đến máy chủ và sau đó nó sẽ biết để mong đợi byte cho tệp. Tương tự, bạn cũng cần cách đánh dấu phần cuối của tệp ...

Hoặc, bạn có thể gửi loại thư trước mỗi thư.

Giải pháp hiệu suất/đáp ứng tốt hơn là thực hiện truyền tệp trên một chuỗi/ổ cắm riêng biệt - điều này có nghĩa là các tin nhắn trò chuyện không được chuyển bởi các lần truyền. Bất cứ khi nào cần truyền tập tin, một kết nối mới chỉ được tạo ra.

~ chris

+0

bạn có thể cho tôi một số mẫu mã để nghiên cứu xin vui lòng, thx. – starcaller

+0

Lý tưởng nhất là bạn cần một số để sử dụng các Ổ cắm riêng biệt để xử lý các lệnh. Cách thực hiện với FTP là có một kênh lệnh và một kênh dữ liệu. –

4

Vì vậy, hãy giả sử ở phía máy chủ bạn đã nhận được tên tệp và đường dẫn tệp. Mã này sẽ cung cấp cho bạn một số ý tưởng.

MÁY CHỦ

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

KHÁCH HÀNG

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(); 
0
import java.io.*; 
import java.net.*; 

class TCPClient 
{ 
    public static void main(String argv[]) throws IOException 
    { 
     String sentence; 
     String modifiedSentence; 
     Socket clientSocket = new Socket("*localhost*", *portnum*); // new Socket("192.168.1.100", 80); 
     System.out.println("Enter your ASCII code here"); 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     sentence = inFromUser.readLine(); 
// System.out.println(sentence); 

      while(!(sentence.isEmpty())) 
      {   
       DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
       outToServer.writeBytes(sentence); 

       BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
       modifiedSentence = inFromServer.readLine(); 

        while(!(modifiedSentence.isEmpty())) 
        {     
         System.out.println("FROM SERVER: " + modifiedSentence); 
         break; 
        } 

       System.out.println("Enter your ASCII code here"); 
       inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
       sentence = inFromUser.readLine(); 
      } 

     System.out.println("socket connection going to be close");  
     clientSocket.close(); 
    } 

} 
Các vấn đề liên quan