2012年4月30日 星期一

使用 Socket 進行 Client-Server 檔案傳送:從 Client 端將檔案傳送給 Server 端

參考資料:
1、官方 Socket 文件(Client 端用來與 Server 連線的 Socket)
2、官方 ServerSocket 文件(Server 端用來接受 Client 端連線的 Socket)


Client 端的語法:
InetAddress addressOfServer = InetAddress.getByName("127.0.0.1");
int portOfServer = 22;

// File to be transmitted
File file = new File("/home/user/test.img");
// Create buffer
byte[] buffer = new byte[2048];
int bytesReaded;

// Socket connection for connecting to the server
Socket socketFromClient = null;
// Output stream for transmitting file to the server
DataOutputStream outputStream = null;
// Input stream for reading local file
FileInputStream fis = null;

try {
  // Create socket
  socketFromClient = new Socket(addressOfServer, portOfServer);

  // Create output stream for transmitting file
  outputStream = new DataOutputStream(socketFromClient.getOutputStream());
  // Create input Stream for reading file
  FileInputStream fis = new FileInputStream(file);

  // Start transmitting
  while( (bytesReaded = fis.read(buffer)) > -1 ) {
    outputStream.write(buffer, 0, bytesReaded);
    outputStream.flush();
  }
} finally {
  // Close the stream objects
  if(outputStream != null) outputStream.close();
  if(fis != null) fis.close();
}

// Close the connection of socket
if(socketFromClient != null) socketFromClient.close();

Server 端語法:
int portOfServer = 22;

// Start listening to port 22
ServerSocket serverSocket = new ServerSocket(serverPort);
Socket clientSocket = serverSocket.accept();

// Reader for accepting the transmission from client
BufferedInputStream bis = null;
DataInputStream dis = null;
// File writer for writing the file transmitted from the client
File writtenFile = null;
FileWriter fw = null;
BufferedWriter bw = null;

try {
  // Get the address of the connecting client
  String addressOfClient = clientSocket.getRemoteSocketAddress().toString();
  // Get the stream which the client tranmits
  bis = new BufferedInputStream(clientSocket.getInputStream());
  dis = new DataInputStream(bis);

  // Create file writer
  writtenFile = new File("transmittedFile");
  fw = new FileWriter(writtenFile);
  bw = new BufferedWriter(fw);

  // Create buffer
  byte[] buffer = new byte[2048];
  int bytesReaded;

  // Accept and write the file
  while( (bytesReaded = dis.read(buffer)) > -1) {
    bw.write(buffer, 0, bytesReaded);
    bw.flush();
  }
}finally {
  // Close the stream and writer objects
  if(bw != null) bw.close();
  if(fw != null) fw.close();
  if(dis != null) dis.close();
  if(bis != null) bis.close();
}

如果只是要傳送字串資料,而不是傳送檔案的話,作法好像是一樣的,可以參考以下的連結。

參考資料:
3、簡單的Socket Client Server

沒有留言: