2011-01-12 8 views
10

クライアントからサーバーにメッセージを送信できる単純なTCPサーバーとTCPクライアントクラスを実装しています。このメッセージはサーバー側で大文字に変換され、しかし、どのようにしてサーバーからクライアントにファイルを転送し、クライアントからサーバーにファイルをアップロードすることができますか?次のコードは私が持っているものです。ファイルを転送するためにTCPサーバーとTCPクライアントをJavaで実装する方法

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節を使用しようとしますユーザーの入力は何ですか、私は本当に両方の側からファイルを転送する方法(ダウンロードとアップロード)を実装したいと思います。

+0

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

+0

すべての回答に加えて、[readAllBytes(...)](http://docs.oracle.com/javase/8/docs/)で、すべてのファイルのすべてのバイトを一度に読み取ることができます。 api/java/nio/file/Files.html#readAllBytes-java.nio.file.Path-)ファイルwに書き出しますi [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

答えて

2

Thisリンクは助けが必要です。

+0

私はif(clientSentence。( "good")) \t {capitalizedSentence = "接続が設定されています"; \t //outToClient.writeBytes(capitalizedSentence); \t} \t他 \t \t \t {capitalizedSentence = clientSentence.toUpperCase()+ "の\ n"。 \t \t \t \t \t \t} outToClient.writeBytes(capitalizedSentence)。 welcomeSocket.close();サーバーコードには、しかし、それは動作していないようだ、あなたはそれで私を助けることができますしてください – starcaller

+0

あなたは現在どのようなコードを使用してどのような例外を取得しているか教えてくださいする必要があります。 – npinti

+0

質問を更新しました。ありがとう、ありがとう。 – starcaller

1

あなたが前後にファイルをメッセージを送信するだけでなく、送信を支援していきたいと仮定すると...

あなたが今、あなたがクライアントからサーバーにデータを送信するためのwriteBytesを使用していたように。

あなたはファイルの内容のように、何かを送信するためにそれを使用することができます...

しかし、あなたは、彼らは、ファイルがではなく、転送されているとき、知っているように、クライアントとサーバー間のプロトコルを定義する必要があります。チャットメッセージ。

たとえば、ファイルをサーバーに送信する前に、メッセージ/文字列 "FILECOMING"を送信すると、ファイルのバイトが予想されることがわかります。同様に、ファイルの末尾にもマークを付ける方法が必要です。

また、各メッセージの前にメッセージタイプを送信することもできます。

より効果的な解決策は、別のスレッド/ソケットでファイル転送を行うことです。つまり、チャットメッセージは転送によって保持されません。ファイル転送が必要なときはいつでも、新しいスレッド/ソケット接続が作成されます。

〜クリス・

+0

私は勉強するいくつかのコードサンプルを教えてください。 – starcaller

+0

理想的には、コマンドを処理するために別々のソケットを使用する必要があります。それがFTPで行われる方法は、コマンドチャネルとデータチャネルがあることです。 –

4

だからあなたは、ファイル名とファイルのパスを受けたサーバ側で想定することができます。このコードはあなたにいくつかのアイデアを与える必要があります。

サーバ

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

CLIENT

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

}