From 93fb4b8e6778432275ab6e9ea0be6b7dead31f85 Mon Sep 17 00:00:00 2001 From: WMJ Date: Sat, 22 Apr 2017 12:24:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=9F=BA=E7=A1=80=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Client/app/build.gradle | 1 + .../InnerLayer/Network/NetWork.java | 132 ++++- .../timemanager/InnerLayer/User.java | 13 +- .../timemanager/surface/MainActivity.java | 16 +- .../{ => activitiesFragment}/Activities.java | 41 +- .../ActivityListAdapter.java | 77 +++ .../activitiesFragment/ActivityViewItem.java | 17 + .../src/main/res/layout/activities_item.xml | 20 + .../main/res/layout/fragment_activities.xml | 10 +- Client/app/src/main/res/menu/navigation.xml | 4 - .../.idea/FileDownloadServer.iml | 11 + .../inspectionProfiles/profiles_settings.xml | 7 + FileDownloadServer/.idea/misc.xml | 4 + FileDownloadServer/.idea/modules.xml | 8 + FileDownloadServer/.idea/workspace.xml | 486 ++++++++++++++++++ FileDownloadServer/client.py | 40 ++ FileDownloadServer/gp_G1003.xml | 1 + FileDownloadServer/java | 8 + FileDownloadServer/server.py | 86 ++++ .../test}/cal_U1234567.xml | 0 .../test}/gp_G1003.xml | 0 .../test}/gpl_U1234567.xml | 0 .../test}/user_U1234567.xml | 0 24 files changed, 946 insertions(+), 37 deletions(-) create mode 100644 .gitignore rename Client/app/src/main/java/wesayallright/timemanager/surface/{ => activitiesFragment}/Activities.java (72%) create mode 100644 Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityListAdapter.java create mode 100644 Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityViewItem.java create mode 100644 Client/app/src/main/res/layout/activities_item.xml create mode 100644 FileDownloadServer/.idea/FileDownloadServer.iml create mode 100644 FileDownloadServer/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 FileDownloadServer/.idea/misc.xml create mode 100644 FileDownloadServer/.idea/modules.xml create mode 100644 FileDownloadServer/.idea/workspace.xml create mode 100644 FileDownloadServer/client.py create mode 100644 FileDownloadServer/gp_G1003.xml create mode 100644 FileDownloadServer/java create mode 100644 FileDownloadServer/server.py rename {test => FileDownloadServer/test}/cal_U1234567.xml (100%) rename {test => FileDownloadServer/test}/gp_G1003.xml (100%) rename {test => FileDownloadServer/test}/gpl_U1234567.xml (100%) rename {test => FileDownloadServer/test}/user_U1234567.xml (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25c6bb7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.directory diff --git a/Client/app/build.gradle b/Client/app/build.gradle index ed604dc..f1098ab 100644 --- a/Client/app/build.gradle +++ b/Client/app/build.gradle @@ -28,4 +28,5 @@ dependencies { compile 'com.android.support:design:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' + compile 'com.google.code.findbugs:jsr305:2.0.1' } diff --git a/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/Network/NetWork.java b/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/Network/NetWork.java index ae0522f..9ce2b28 100644 --- a/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/Network/NetWork.java +++ b/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/Network/NetWork.java @@ -1,6 +1,21 @@ package wesayallright.timemanager.InnerLayer.Network; +import android.accounts.NetworkErrorException; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; import java.util.Date; +import java.net.Socket; /** * Created by mj on 17-4-16. @@ -8,12 +23,17 @@ import java.util.Date; */ public class NetWork { - private static String addr; + private static String host; + private static int port; private static boolean connected; public NetWork() {} public void setAddress(String s) { - addr = s; + NetWork.host = s; + } + public void setAddress() { + NetWork.host = "127.0.0.1"; + NetWork.port = 9999; } // 登陆,登陆成功返回用户ID,失败抛异常 @@ -21,8 +41,90 @@ public class NetWork { return "U1234567"; } - static public void downloadUserInformation(String userid) { - // TODO:下载 + static public void downloadUserInformation(String userid) throws UnsupportedEncodingException { + request("user_" + userid + ".xml"); + } + + static public void downlocaUserCalendar(String userid) throws UnsupportedEncodingException { + request("cal_" + userid + ".xml"); + } + + static public void downloadUserGroupList(String userid) throws UnsupportedEncodingException { + request("gpl" + userid + ".xml"); + } + + static public void request(String requestFile) throws UnsupportedEncodingException { + byte[] fnameBytes = new byte[128]; + byte[] fnameLengthBytes = new byte[16]; + byte[] fsizeBytes = new byte[8]; + byte[] md5Bytes = new byte[32]; + byte[] endSign = new byte[3]; + try { + Socket sock = new Socket(NetWork.host, NetWork.port); + Log.i("Network", "Connected successful"); // 连接到服务器 + DataInputStream is = new DataInputStream(sock.getInputStream()); // 创建读取数据流 + DataOutputStream os =new DataOutputStream(sock.getOutputStream()); // 发送数据流 + + ByteBuffer requestFileBytes = ByteBuffer.allocate(128); // 要下载的文件名数据缓冲,128字节 + requestFileBytes.put(requestFile.getBytes()); // 把文件名转化成字节数组 + os.write(requestFileBytes.array()); // 发送数据 + + byte[] header = new byte[179]; + // header长179字节, 128字节文件名, 8字节文件名长度, 8字节文件长度, 32字节MD5, 3字节EOS + //is.read(header); // 读取header + + + is.read(fnameBytes); // 读入文件名 + is.read(fnameLengthBytes); // 读入文件名长度 + is.read(fsizeBytes); // 读入 文件大小 + is.read(md5Bytes); // 读入MD5 + is.read(endSign); // 读入结束符 + + String fname = new String(fnameBytes, "utf8"); + long fnameLength = toInteger(fnameLengthBytes, 8); + long fsize = toInteger(fsizeBytes, 8); + String md5 = new String(md5Bytes, "utf8"); + + if (!(new String(endSign, "utf8")).equals("EOS")) { + // 如果结束符不是EOS,说明传输遇到问题 + throw new NetworkErrorException(); + } + Log.i("文件Header:", "文件名:" + fname); + Log.i("文件Header:", "文件名长度:" + fnameLength); + Log.i("文件Header:", "文件大小:" + fsize); + Log.i("文件Header:", "md5:" + md5); + + byte[] buffer = new byte[128]; + long recvSize = 0; + File f = new File(requestFile); + if (!f.exists()) + if (! f.createNewFile()) { + throw new UnknownError(); + } + FileOutputStream of = new FileOutputStream(f); + + while (recvSize < fsize) { + is.read(buffer); + of.write(buffer); + recvSize += 1024; + } + + Log.i("接收文件", "接收文件" + requestFile + "成功"); + + of.close(); + + + } catch (IOException | NetworkErrorException | UnknownError e) { + if(e.equals(new NetworkErrorException())) { + Log.e("网络错误", "接收文件header失败"); + Log.e("文件Header:", "文件名:" + (new String(fnameBytes, "utf8"))); + Log.e("文件Header:", "文件名长度:" + toInteger(fnameLengthBytes, 8)); + Log.e("文件Header:", "文件大小:" + toInteger(fsizeBytes, 8)); + Log.e("文件Header:", "md5:" + (new String(md5Bytes, "utf8"))); + Log.e("文件Header:", "结束符:" + (new String(endSign, "utf8"))); + } + e.printStackTrace(); + } } static public void uploadUserInformation(String userid) { @@ -33,4 +135,26 @@ public class NetWork { // TODO: 远程个人信息更新时间 return null; } + + private static long toInteger(byte[] b, int n) { + long ans = 0; + /* + for (int i = 0; i < n; i++) { + for (int j = 0; j < 8; j++) { + if ((b[i] & (0x80 >> j)) != 0) + System.out.print('1'); + else + System.out.print('0'); + } + System.out.print(" "); + } + System.out.print('\n'); + */ + ans = 0; + for (int i = n - 1; i >= 0; i--) { + ans |= b[i] << i * 8; + + } + return ans; + } } diff --git a/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/User.java b/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/User.java index 99ebf1c..4515ee7 100644 --- a/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/User.java +++ b/Client/app/src/main/java/wesayallright/timemanager/InnerLayer/User.java @@ -15,6 +15,7 @@ import wesayallright.timemanager.InnerLayer.LocalFile.LocalFile; import wesayallright.timemanager.InnerLayer.Network.NetWork; import java.io.File; +import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.text.FieldPosition; import java.text.ParseException; @@ -61,7 +62,7 @@ public class User { public User() {} // 登陆 - public static User signIn(String identified, String password) { + public static User signIn(String identified, String password) throws UnsupportedEncodingException { User u = new User(); NetWork n = new NetWork(); try { @@ -76,13 +77,13 @@ public class User { return u; } // 注册 - public static User signUp(String identified, String password, String email) { + public static User signUp(String identified, String password, String email) throws UnsupportedEncodingException { // TODO: 注册 return signIn(identified, password); } // 同步数据 - public void update() { + public void update() throws UnsupportedEncodingException { if (updateTime == null) { NetWork.downloadUserInformation(userId); } else { @@ -105,16 +106,16 @@ public class User { return false; } // 读取个人信息 - public void loadInformation() { + public void loadInformation() throws UnsupportedEncodingException { Package.currentUser = this; // 把当前登陆的用户保存到Package中 // 从服务器上下载文件 // TODO:网络模块 - /* + NetWork.downloadUserInformation(userId); NetWork.downlocaUserCalendar(userId); NetWork.downloadUserGroupList(userId); - */ + // 在本地加载文件 try { diff --git a/Client/app/src/main/java/wesayallright/timemanager/surface/MainActivity.java b/Client/app/src/main/java/wesayallright/timemanager/surface/MainActivity.java index 5d8d1bd..bc7d625 100644 --- a/Client/app/src/main/java/wesayallright/timemanager/surface/MainActivity.java +++ b/Client/app/src/main/java/wesayallright/timemanager/surface/MainActivity.java @@ -12,14 +12,12 @@ import android.util.Log; import android.view.MenuItem; import android.widget.TextView; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.UnsupportedEncodingException; import wesayallright.timemanager.InnerLayer.LocalFile.LocalFile; import wesayallright.timemanager.InnerLayer.User; import wesayallright.timemanager.R; +import wesayallright.timemanager.surface.activitiesFragment.Activities; public class MainActivity extends AppCompatActivity implements Calendar.OnFragmentInteractionListener, @@ -54,10 +52,6 @@ public class MainActivity extends AppCompatActivity implements showFragment(ACTIVITIES); break; - case R.id.navigation_groups: - showFragment(GROUPS); - break; - case R.id.navigation_me: showFragment(ME); @@ -76,7 +70,11 @@ public class MainActivity extends AppCompatActivity implements // 设置程序路径 LocalFile.setCwd(getApplicationContext().getFilesDir().getAbsolutePath()); Log.i("Path", getApplicationContext().getFilesDir().getAbsolutePath()); - User u = User.signIn("rightID", "rightPassword"); + try { + User u = User.signIn("rightID", "rightPassword"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); diff --git a/Client/app/src/main/java/wesayallright/timemanager/surface/Activities.java b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/Activities.java similarity index 72% rename from Client/app/src/main/java/wesayallright/timemanager/surface/Activities.java rename to Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/Activities.java index 855a591..a7bf1fa 100644 --- a/Client/app/src/main/java/wesayallright/timemanager/surface/Activities.java +++ b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/Activities.java @@ -1,12 +1,24 @@ -package wesayallright.timemanager.surface; +package wesayallright.timemanager.surface.activitiesFragment; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import org.w3c.dom.Text; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.annotation.Nonnull; import wesayallright.timemanager.R; @@ -20,14 +32,10 @@ import wesayallright.timemanager.R; * create an instance of this fragment. */ public class Activities extends Fragment { - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; + + List activitiesData = new ArrayList<>(); + private OnFragmentInteractionListener mListener; @@ -51,14 +59,27 @@ public class Activities extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + Log.i("活动界面", "进入onCreate方法"); + // 测试 + for (int i = 0; i < 20; i++) { + activitiesData.add(new ActivityViewItem("活动"+i, new Date(i + 3600))); + } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_activities, container, false); + + Log.i("活动界面", "进入onCreateView方法"); + + View v = inflater.inflate(R.layout.fragment_activities, container, false); + ListView activitiesList = (ListView)v.findViewById(R.id.fa_activityList); + // 首先用inflater取得相应的布局文件,然后再findview. + // 设置适配器 + ActivityListAdapter ap = new ActivityListAdapter(this.getContext(), activitiesData); + activitiesList.setAdapter(ap); + return v; } // TODO: Rename method, update argument and hook method into UI event diff --git a/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityListAdapter.java b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityListAdapter.java new file mode 100644 index 0000000..70eb770 --- /dev/null +++ b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityListAdapter.java @@ -0,0 +1,77 @@ +package wesayallright.timemanager.surface.activitiesFragment; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import java.util.Date; +import java.util.List; + +import wesayallright.timemanager.R; + +/** + * Created by mj on 17-4-22. + * 活动列表的适配器 + */ + +public class ActivityListAdapter extends BaseAdapter { + private List list; // 数据源 + private LayoutInflater inflater; // 布局装载器 + + public ActivityListAdapter(Context context, List l) { + list = l; + inflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return list.size(); + } + + @Override + public ActivityViewItem getItem(int position) { + return list.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder; + if (convertView == null) { + // 第一次运行, 分配空间 + convertView = inflater.inflate(R.layout.activities_item, null); // 创建一个新的Item + + viewHolder = new ViewHolder(); + viewHolder.name = (TextView)convertView.findViewById(R.id.ai_activityName); + viewHolder.data = (TextView)convertView.findViewById(R.id.ai_activityTime); + + // 缓存view + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder)convertView.getTag(); + } + + ActivityViewItem item = list.get(position); + viewHolder.name.setText(item.name); + viewHolder.data.setText(item.date.toString()); + // Log.i("时间", item.date.toString()); + + return convertView; + } + + /** + * 用于缓存view,findViewByID是线性查找,在数据经常修改时效率低 + */ + class ViewHolder { + TextView name; + TextView data; + } +} diff --git a/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityViewItem.java b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityViewItem.java new file mode 100644 index 0000000..c0d59fa --- /dev/null +++ b/Client/app/src/main/java/wesayallright/timemanager/surface/activitiesFragment/ActivityViewItem.java @@ -0,0 +1,17 @@ +package wesayallright.timemanager.surface.activitiesFragment; + +import java.util.Date; + +/** + * Created by mj on 17-4-22. + * 用于显示每一个活动 + */ + +public class ActivityViewItem { + public String name; + public Date date; + public ActivityViewItem(String n, Date d) { + name = n; + date = d; + } +} \ No newline at end of file diff --git a/Client/app/src/main/res/layout/activities_item.xml b/Client/app/src/main/res/layout/activities_item.xml new file mode 100644 index 0000000..746c6cd --- /dev/null +++ b/Client/app/src/main/res/layout/activities_item.xml @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file diff --git a/Client/app/src/main/res/layout/fragment_activities.xml b/Client/app/src/main/res/layout/fragment_activities.xml index 6f35a75..8af6d16 100644 --- a/Client/app/src/main/res/layout/fragment_activities.xml +++ b/Client/app/src/main/res/layout/fragment_activities.xml @@ -2,12 +2,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="wesayallright.timemanager.surface.Activities"> + tools:context="wesayallright.timemanager.surface.activitiesFragment.Activities"> - - + android:id="@+id/fa_activityList" + > + + diff --git a/Client/app/src/main/res/menu/navigation.xml b/Client/app/src/main/res/menu/navigation.xml index b0c4804..ea879c1 100644 --- a/Client/app/src/main/res/menu/navigation.xml +++ b/Client/app/src/main/res/menu/navigation.xml @@ -11,10 +11,6 @@ android:icon="@drawable/ic_dashboard_black_24dp" android:title="@string/title_activities" /> - + + + + + + + + + \ No newline at end of file diff --git a/FileDownloadServer/.idea/inspectionProfiles/profiles_settings.xml b/FileDownloadServer/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..c23ecac --- /dev/null +++ b/FileDownloadServer/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/FileDownloadServer/.idea/misc.xml b/FileDownloadServer/.idea/misc.xml new file mode 100644 index 0000000..0c153f3 --- /dev/null +++ b/FileDownloadServer/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/FileDownloadServer/.idea/modules.xml b/FileDownloadServer/.idea/modules.xml new file mode 100644 index 0000000..34ae191 --- /dev/null +++ b/FileDownloadServer/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FileDownloadServer/.idea/workspace.xml b/FileDownloadServer/.idea/workspace.xml new file mode 100644 index 0000000..55de79b --- /dev/null +++ b/FileDownloadServer/.idea/workspace.xml @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + recv + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1492774061336 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FileDownloadServer/client.py b/FileDownloadServer/client.py new file mode 100644 index 0000000..a86d630 --- /dev/null +++ b/FileDownloadServer/client.py @@ -0,0 +1,40 @@ +import socket +import os +import struct +import traceback + +FILENAME_LENGTH = struct.calcsize(b'128s') +FILE_INFO_LENGTH = struct.calcsize(b'128sq32s') # 文件名, 文件大小, MD5 + + +if __name__ == '__main__': + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + server.connect(('127.0.0.1', 9999)) + print('connected to server') + cmdPack = struct.pack(b'128s', 'gp_G1003.xml'.encode()) + server.send(cmdPack) + recv = server.recv(FILE_INFO_LENGTH) + fname, fsize, md5 = struct.unpack(b'128sq32s', recv) + fname = fname.decode() + fize = int(fsize) + if fsize == 0: + print('Server returns error, No such a file %s ' % fname) + else : + recvSize = 0 + f = open(fname.split("xml")[0]+"xml", "wb") + while (recvSize < fsize): + if (fsize - recvSize > 1024): + fileData = server.recv(1024) + recvSize += 1024 + else : + fileData = server.recv(fsize - recvSize) + recvSize = fsize + f.write(fileData) + f.close() + print('File receive success') + except Exception: + print('Oops, something goes wrong.') + traceback.print_exc() + cmdPack = struct.pack(b'128s', 'exit'.encode()) + server.send(cmdPack) diff --git a/FileDownloadServer/gp_G1003.xml b/FileDownloadServer/gp_G1003.xml new file mode 100644 index 0000000..9e94057 --- /dev/null +++ b/FileDownloadServer/gp_G1003.xml @@ -0,0 +1 @@ +eec4fd6fEOS< \ No newline at end of file diff --git a/FileDownloadServer/java b/FileDownloadServer/java new file mode 100644 index 0000000..5ff7abf --- /dev/null +++ b/FileDownloadServer/java @@ -0,0 +1,8 @@ +Integer: 4 +Short: 2 +Long: 8 +Byte: 1 +Character: 2 +Float: 4 +Double: 8 + diff --git a/FileDownloadServer/server.py b/FileDownloadServer/server.py new file mode 100644 index 0000000..c887854 --- /dev/null +++ b/FileDownloadServer/server.py @@ -0,0 +1,86 @@ +import hashlib +import socket +import struct +import threading +import os + + + +def sendFile(filename, sock): + # filename = filename.decode() + try: + filename = filename.split('xml')[0]+'xml' + path = "test/" + filename + # path = path.split(".xml")[0] + ".xml" + print("start sending progress %s.." % (path)) + # print("path=%s" % path) + + f = open(path, 'rb') + fsize = os.path.getsize(path) + md5 = hashlib.md5() + md5.update(f.read()) + f.seek(0) + + header = struct.pack(b'128sIq32s3s', filename.encode(), len(filename),fsize, md5.hexdigest().encode(), 'EOS'.encode()) + print("Find %s %d %s." % (filename, fsize, md5.hexdigest())) + sock.send(header) + sendSize = 0 + lastPrint = 0 + print('fname size is ==================%d' % len(filename)) + print('File size is ===================%d' % fsize) + print("Sending file %s" % (filename), end='') + while (sendSize < fsize): + if (fsize - sendSize >= 1024): + # 如果剩余文件大小大于1024字节 + fileData = f.read(1024) + sendSize += 1024 + else : + # 文件剩余部分不足1024字节, 全部读入 + fileData = f.read() + sendSize = fsize + sock.send(fileData) + if ((sendSize - lastPrint) > (fsize / 10)): + print("%.2f%%" % (lastPrint / fsize * 100)) + lastPrint = sendSize + print("") + print("Finish.") + except: + pass + + +def transportation(userSock, userAddress): + global FILENAME_LENGTH + # cmdLength = int(userSock.recv(64).decode()) + # 先发送64个字节表示接下来的文件名有多长 + command = userSock.recv(struct.calcsize(b'128s')) + command, = struct.unpack(b'128s', command) # 解码 + command = command.decode() + + while True: + print("%s: start send %s" % (userAddress, command)) + sendFile(command, userSock) + # cmdLength = int(userSock.recv(64).decode()) + command = userSock.recv(struct.calcsize(b'128s')) + command, = struct.unpack(b'128s', command) # 解码 + command = command.decode() + if (command[:4] == 'exit'): + break + print("disconnect to %s" % (str(userAddress))) + userSock.close() + + + +if __name__ == '__main__': + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, -1) + sock.bind(('127.0.0.1', 9999)) + sock.listen(10) + print("Start sever, waiting for connect...") + while True: + userBundle = sock.accept() + print("Connected to %s." % (str(userBundle[1]))) + startMission = threading.Thread(target=transportation, args=(userBundle)) + print("Start progress.") + startMission.start() + + diff --git a/test/cal_U1234567.xml b/FileDownloadServer/test/cal_U1234567.xml similarity index 100% rename from test/cal_U1234567.xml rename to FileDownloadServer/test/cal_U1234567.xml diff --git a/test/gp_G1003.xml b/FileDownloadServer/test/gp_G1003.xml similarity index 100% rename from test/gp_G1003.xml rename to FileDownloadServer/test/gp_G1003.xml diff --git a/test/gpl_U1234567.xml b/FileDownloadServer/test/gpl_U1234567.xml similarity index 100% rename from test/gpl_U1234567.xml rename to FileDownloadServer/test/gpl_U1234567.xml diff --git a/test/user_U1234567.xml b/FileDownloadServer/test/user_U1234567.xml similarity index 100% rename from test/user_U1234567.xml rename to FileDownloadServer/test/user_U1234567.xml