由于项目的需要,需要在手机平台上面进行传输,但是,由于android平台的开发环境比较容易使用,而且免费,同时,因为在编写数据包的时候,已经在数据包中加入了发送数据包和接收数据包的函数,因此,考虑到开发投入的情况下,选择了使用Android平台。
由于在Android的应用大部分是使用Java进行开发的,而在Android中,并没有特殊的TCP的API,Android使用的TCP就是标准的Java的TCP的类,因此对于Android客户端来说,只需要将服务器版本的数据包代码中使用到TCP进行传输的代码,也就是Transfer.java进行简单的修改即可。
由于在Android的应用大部分是使用Java进行开发的,而在Android中,并没有特殊的TCP的API,Android使用的TCP就是标准的Java的TCP的类,因此对于Android客户端来说,只需要将服务器版本的数据包代码中使用到TCP进行传输的代码,也就是Transfer.java进行简单的修改即可。
具体的代码如下:
/**
*
*/
package edu.pkusz.sheng;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
/**
* @author sheng
*
*/
public class Transfer
{
private static Socket ClientSocket = null;
private static BufferedOutputStream SocketOutputStream = null;
private static BufferedInputStream SocketInputStream = null;
private static void CreateSocket()
{
try
{
ClientSocket = new Socket(CONSTANT.IP, CONSTANT.PORT);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void CreateSocketOutputStream()
{
if (ClientSocket == null)
{
CreateSocket();
}
try {
SocketOutputStream = new BufferedOutputStream(ClientSocket.getOutputStream());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void CreateSocketInputStream()
{
if (ClientSocket == null)
{
CreateSocket();
}
try {
SocketInputStream = new BufferedInputStream(ClientSocket.getInputStream());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static boolean SendPackage(DataPackage PackageOfData)
{
if (SocketOutputStream == null)
{
CreateSocketOutputStream();
}
return PackageOfData.Send(SocketOutputStream);
}
public static boolean SendPackage(BufferedInputStream InputFile, PackageType Type, int LenOfData) throws IOException
{
final int LENOFCONTENT = BufferSize.BUFFERSIZE - BufferSize.PACKAGEHEADERSIZE;
// The number of packages.
int NumberOfPackages = LenOfData / LENOFCONTENT;
if ((LenOfData % LENOFCONTENT) != 0)
{
NumberOfPackages++;
}
DataPackage PackageOfData = new DataPackage(false);
// set the type and the number of packages.
PackageOfData.SetType(Type);
PackageOfData.SetNumberOfPackages(NumberOfPackages);
boolean result = false;
byte[] TmpBuffer = new byte[LENOFCONTENT];
int Len = 0;
int IndexOfPackages = 1;
while ((Len = InputFile.read(TmpBuffer)) != -1)
{
PackageOfData.SetIndexOfPackages(IndexOfPackages);
PackageOfData.SetSizeOfData(Len);
// set content
PackageOfData.SetContent(TmpBuffer);
// send data
result = SendPackage(PackageOfData);
IndexOfPackages++;
}
return result;
}
public static boolean SendString(PackageType Type, String InputString)
{
if (InputString.length() > BufferSize.BUFFERSIZE)
{
return false;
}
DataPackage PackageOfData = new DataPackage(false);
// set the package header
PackageOfData.SetType(Type);
PackageOfData.SetNumberOfPackages(1);
PackageOfData.SetIndexOfPackages(1);
PackageOfData.SetSizeOfData(InputString.length());
// set the content
PackageOfData.SetContent(InputString.getBytes());
return SendPackage(PackageOfData);
}
public static boolean SendUserName(String UserName)
{
PackageType Type = PackageType.USERNAME;
return SendString(Type, UserName);
}
public static boolean SendAuthorisztionRequest()
{
PackageType Type = PackageType.REQUESTAUTHORIZATION;
String Request = new String("RequestAuthorization");
return SendString(Type, Request);
}
public static boolean SendRequest()
{
PackageType Type = PackageType.REQUESTRESULT;
String Request = new String("Request");
return SendString(Type, Request);
}
public static boolean SendTextRequest()
{
PackageType Type = PackageType.REQUESTTEXT;
String Request = new String("TextRequest");
return SendString(Type, Request);
}
public static boolean SendClosedRequest()
{
PackageType Type = PackageType.CLOSED;
String Request = new String("Closed");
boolean result = SendString(Type, Request);
try
{
result = Close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public static boolean SendFile(String FileName) throws IOException
{
File RawFile = null;
BufferedInputStream InputFile = null;
try
{
RawFile = new File(FileName);
InputFile = new BufferedInputStream(new FileInputStream(RawFile));
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int Len = (int) RawFile.length();
PackageType Type = PackageType.FILEDATA;
boolean result = false;
result = SendPackage(InputFile, Type, Len);
InputFile.close();
return result;
}
public static boolean Close() throws IOException
{
if (SocketInputStream != null)
{
SocketInputStream.close();
}
if (SocketOutputStream != null)
{
SocketOutputStream.close();
}
if (ClientSocket != null)
{
ClientSocket.close();
}
return true;
}
public static String ReceiveString(PackageType Type)
{
DataPackage Data = new DataPackage(true);
boolean run = true;
if (SocketInputStream == null)
{
CreateSocketInputStream();
}
while (run)
{
int Len = 0;
if ((Len = Data.Receive(SocketInputStream)) != -1)
{
if (Data.GetType() == Type)
{
run = false;
}
}
}
return new String(Data.Content, 0, Data.SizeOfData);
}
public static String ReceiveText()
{
PackageType Type = PackageType.REPLAYTEXT;
return ReceiveString(Type);
}
public static String ReceiveUserName()
{
PackageType Type = PackageType.USERNAME;
return ReceiveString(Type);
}
public static String ReceiveAuthorizen()
{
PackageType Type = PackageType.REPLAYAUTHORIZATION;
return ReceiveString(Type);
}
public static String ReceiveResult()
{
PackageType Type = PackageType.REPLAYRESULT;
return ReceiveString(Type);
}
}