シンプルなTCP serverおよびTCPクライアントからサーバーにメッセージを送信できるクライアントクラスを実装すると、メッセージはサーバー上で大文字に変換されます側ですが、サーバーからクライアントへファイルを転送し、クライアントからサーバーにファイルをアップロードするにはどうすればよいですか?次のコードは私が持っているものです。
TCPClient.Java
import Java.io.*;
import Java.net.*;
import Java.util.Scanner;
class TCPClient {
public static void main(String args[]) throws Exception {
int filesize=6022386;
int bytesRead;
int current = 0;
String ipAdd="";
int portNum=0;
boolean goes=false;
if(goes==false){
System.out.println("please input the ip address of the file server");
Scanner scan=new Scanner(System.in);
ipAdd=scan.nextLine();
System.out.println("please input the port number of the file server");
Scanner scan1=new Scanner(System.in);
portNum=scan1.nextInt();
goes=true;
}
System.out.println("input done");
int timeCount=1;
while(goes==true){
//System.out.println("connection establishing");
String sentence="";
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
Socket clientSocket = new Socket(ipAdd, portNum);
//System.out.println("connecting");
//System.out.println(timeCount);
if(timeCount==1){
sentence="set";
//System.out.println(sentence);
}
if(timeCount!=1)
sentence = inFromUser.readLine();
if(sentence.equals("close"))
clientSocket.close();
if(sentence.equals("download"))
{
byte [] mybytearray = new byte [filesize];
InputStream is = clientSocket.getInputStream();
FileOutputStream fos = new FileOutputStream("C:\\users\\cguo\\kk.lsp");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
//System.out.println(end-start);
bos.close();
clientSocket.close();
}
// if(sentence.equals("send"))
// clientSocket.
timeCount--;
//System.out.println("connecting1");
DataOutputStream outToServer = new DataOutputStream(clientSocket
.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
//System.out.println("connecting2");
//System.out.println(sentence);
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 {
Socket s = null;
int firsttime=1;
while (true) {
String clientSentence;
String capitalizedSentence="";
ServerSocket welcomeSocket = new ServerSocket(3248);
Socket connectionSocket = welcomeSocket.accept();
//Socket sock = 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("download"))
{
File myFile = new File ("C:\\Users\\cguo\\11.lsp");
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = connectionSocket.getOutputStream();
System.out.println("Sending...");
os.write(mybytearray,0,mybytearray.length);
os.flush();
connectionSocket.close();
}
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句を使用してユーザーの入力をテストしようとしますが、実際にはファイルの転送方法を実装したい両方(ダウンロードとアップロード)。ありがとう。
ソースをすばやく読むと、それほど遠くないようです。次のリンクが役立ちます(FTPの場合と似たようなことをしました)。サーバーからクライアントにファイルを送信するには、ファイルインスタンスとバイトの配列から始めます。次に、ファイルをバイト配列に読み取り、クライアント側のInputStreamに対応するOutputStreamにバイト配列を書き込みます。
http://www.rgagnon.com/javadetails/Java-0542.html
編集:これは、非常にシンプルなファイル送信者と受信者です。コードが両側で何をしているのかを理解してください。
package filesendtest;
import Java.io.*;
import Java.net.*;
class TCPServer {
private final static String fileToSend = "C:\\test1.pdf";
public static void main(String args[]) {
while (true) {
ServerSocket welcomeSocket = null;
Socket connectionSocket = null;
BufferedOutputStream outToClient = null;
try {
welcomeSocket = new ServerSocket(3248);
connectionSocket = welcomeSocket.accept();
outToClient = new BufferedOutputStream(connectionSocket.getOutputStream());
} catch (IOException ex) {
// Do exception handling
}
if (outToClient != null) {
File myFile = new File( fileToSend );
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = null;
try {
fis = new FileInputStream(myFile);
} catch (FileNotFoundException ex) {
// Do exception handling
}
BufferedInputStream bis = new BufferedInputStream(fis);
try {
bis.read(mybytearray, 0, mybytearray.length);
outToClient.write(mybytearray, 0, mybytearray.length);
outToClient.flush();
outToClient.close();
connectionSocket.close();
// File sent, exit the main method
return;
} catch (IOException ex) {
// Do exception handling
}
}
}
}
}
package filesendtest;
import Java.io.*;
import Java.io.ByteArrayOutputStream;
import Java.net.*;
class TCPClient {
private final static String serverIP = "127.0.0.1";
private final static int serverPort = 3248;
private final static String fileOutput = "C:\\testout.pdf";
public static void main(String args[]) {
byte[] aByte = new byte[1];
int bytesRead;
Socket clientSocket = null;
InputStream is = null;
try {
clientSocket = new Socket( serverIP , serverPort );
is = clientSocket.getInputStream();
} catch (IOException ex) {
// Do exception handling
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (is != null) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream( fileOutput );
bos = new BufferedOutputStream(fos);
bytesRead = is.read(aByte, 0, aByte.length);
do {
baos.write(aByte);
bytesRead = is.read(aByte);
} while (bytesRead != -1);
bos.write(baos.toByteArray());
bos.flush();
bos.close();
clientSocket.close();
} catch (IOException ex) {
// Do exception handling
}
}
}
}
関連
編集:以下を使用して、転送の前後に小さなファイルをフィンガープリントできます(必要に応じてSHAを使用):
public static String md5String(File file) {
try {
InputStream fin = new FileInputStream(file);
Java.security.MessageDigest md5er = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int read;
do {
read = fin.read(buffer);
if (read > 0) {
md5er.update(buffer, 0, read);
}
} while (read != -1);
fin.close();
byte[] digest = md5er.digest();
if (digest == null) {
return null;
}
String strDigest = "0x";
for (int i = 0; i < digest.length; i++) {
strDigest += Integer.toString((digest[i] & 0xff)
+ 0x100, 16).substring(1).toUpperCase();
}
return strDigest;
} catch (Exception e) {
return null;
}
}