単純な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句を使用して、ユーザーの入力をテストしていますが、今は本当に両側からファイルを転送する方法を実装します(ダウンロードとアップロード)。ありがとうございます。
それでは、サーバー側でファイル名とファイルパスを受け取ったとしましょう。このコードはあなたにいくつかの考えを与えるはずです。
サーバ
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();
メッセージの送信とファイルの送受信のサポートを継続したいとします...
現在のように、writeBytesを使用してクライアントからサーバーにデータを送信しています。
これを使用して、ファイルの内容など、何でも送信できます...
ただし、チャットメッセージではなくファイルが転送されていることをクライアントとサーバーが認識できるように、クライアントとサーバー間のプロトコルを定義する必要があります。
たとえば、サーバーにファイルを送信する前にメッセージ/文字列 "[〜#〜] filecoming [〜#〜]"を送信すると、ファイルのバイト数を予期していることがわかります。同様に、ファイルの終わりをマークする方法も必要です...
または、各メッセージの前にメッセージタイプを送信することもできます。
より高性能で応答性の高いソリューションは、別のスレッド/ソケットでファイル転送を行うことです。これは、チャットメッセージが転送によって保留されないことを意味します。ファイル転送が必要なときはいつでも、そのために新しいスレッド/ソケット接続が作成されます。
〜クリス
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();
}
}