تشاركك الأمثلة في هذه المقالة في عملية Java باستخدام Socket لإنشاء تنزيل ورمز ذي صلة للرجوع إليه. المحتوى المحدد كما يلي
1. أولاً ، قم بإنشاء خادم لمعالجة المعلومات ونقل الملفات إلى العميل (الكمبيوتر)
قمت بتشغيل شبكة WiFi باستخدام جهاز الكمبيوتر الخاص بي ، ثم قمت بالتوصيل بالهاتف واستخدمت Scoket لنقله.
يجب تغيير Serverip وفقًا لموقفك الفعلي. يمكن أيضًا تغيير المنفذ عند الإرادة 0 ~ 65535 ، حاول اختيار واحد أكبر
استيراد java.io.bufferedInputStream ؛ import java.io.bufferedoutputstream ؛ import java.io.bufferedreader ؛ import java.io.bufferedreader ؛ import java.io.bufferedWriter ؛ import java.io.file java.io.printwriter ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛/** * اختبر أن نظام Android Client وخادم الكمبيوتر الشخصي يتفاعل من خلال Socket Server Side: تلقي معلومات العميل وإرسالها إلى الخادم المصلح * * Author Ameyume */public Class Server runnable "192.168.155.1" ؛ // تحديد 9888 PORT Public Static Final Serverport = 9888 ؛ // تحديد ملف ملف الملف الخاص = null ؛ Public Static Void Main (String [] args) {// قم بإنشاء طريقة لاستدعاء مؤشر ترابط لتنفيذ Transmission Thread DesktopServerThread = New Thread (New Server ()) ؛ سطح المكتب serververthread.start () ؛ } public void run () {try {system.out.println ("s: connecting ... 9888") ؛ // إنشاء Socket Serversocket STERVESCOTCE = ServersOcket (ServerPort) ؛ بينما (صحيح) {// انتظر قبول طلبات العميل عميل المقبس = serversocket.accept () ؛ System.out.println ("S: استلام ... 9888") ؛ حاول {// قبول معلومات العميل bufferedReader في = جديد bufferedReader (new inputStreamReader (client.getInputStream ())) ؛ System.out.println ("S: تلقي معلومات العميل") ؛ // قراءة سلسلة معلومات العميل str = in.readline () ؛ String str1 = str.substring (0،2) ؛ String str2 = str.substring (2) ؛ system.out.println (str) ؛ // ابحث عن الملف المقابل وفقًا لطلب العميل وقم بتمرير قيمة حجم الملف إذا (str.equals ("file_size")) {// تحديد الملف الذي تريد نقله (كتبت ملفًا ضمن e disk) ملف = ملف جديد ("e: // ملف") ؛ // input dester fileInputStream fis = new FileInputStream (file) ؛ // إخراج دفق BufferedInputStream Bis = جديد BufferedInputStream (FIS) ؛ // حساب حجم الملف المراد نقله int sum = bis.available () ؛ // قم بتحويل حجم الملف من النوع int إلى سلسلة سلسلة s = string.valueof (sum) ؛ system.out.println (s) ؛ // إنشاء دفق الإخراج لإرسال معلومات حجم الملف printWriter Out = new PrintWriter (New BufferedWriter (New OutputStreamWriter (client.getOutputStream ())) ، True) ؛ // إرسال معلومات حجم الملف Out.println (s) ؛ // Close Stream Out.flush () ؛ bis.close () ؛ } آخر إذا (str1.equals ("ok")) {int a = integer.parseint (str2) ؛ // بعد أن يستقبل العميل قيمة حجم الملف ، يمرر الملف وفقًا لـ "OK" الذي أرسله العميل bufferedoutputstream bos = جديد bufferedoutputstream (client.getOutputStream ()) ؛ System.out.println ("S: START TRANSFORMENT") ؛ // ابدأ النقل if (true) {// input tream fileInputStream fis = new FileInputStream (file) ؛ // تخطي البايتات التي تم نقلها قبل fis.skip (a) ؛ . int t = -1 ؛ بينما ((t = bis.read ())> = 0) {bos.write (t) ؛ } string s = "transmitted" ؛ // Close Stream bos.flush () ؛ bis.close () ؛ bos.close () ؛ // serversocket.close () ؛ system.out.println ("s: receed: '" + s + "' ') ؛ }} آخر {system.out .println ("لا يستقبل أي شيء من العميل!") ؛ }} catch (استثناء e) {system.out.println ("s: error 1") ؛ E.PrintStackTrace () ؛ } أخيرًا {client.close () ؛ System.out.println ("S: Done.") ؛ }}} catch (استثناء e) {system.out.println ("s: error 2") ؛ E.PrintStackTrace () ؛ }}} 2. إنشاء عميل آخر ، أستخدم MainActivity.java مكتوب في Android (أقوم بتشغيله على هاتفي)
package com.xhy.zz ؛ import Android.App.activity ؛ import Android.Content.intent ؛ Import Android.Os.Bundle ؛ Import Android.Os.Handler ؛ Import Android.Message ؛ Import Android.View ؛ import Android.View.OnclickListener ؛ import. // تحديد المعالج الثابت العام MyHandler ؛ // تحديد نية النية النية ؛ // احصل على التحكم في TextView Text_name ؛ TextView الخاص text_percent ؛ زر خاص btn_start ؛ زر خاص btn_stop ؛ // عرض الملف الخاص textView text_sel_file ؛ Override محمي void oncreate (backdle SaveInstancestate) {// todo method method method super.oncreate (saveInstancestate) ؛ setContentView (r.layout.activity_main) ؛ text_name = (textView) findViewById (r.id.text_name) ؛ text_percent = (textView) findViewById (r.id.text_percent) ؛ btn_start = (button) findViewById (r.id.btn_start) ؛ btn_stop = (button) findViewById (r.id.btn_stop) ؛ // إرجاع معلومات الزر الأول ، عرض التقدم myHandler = New Handler () {Override public void handlemessage (message msg) {super.handlemessage (msg) ؛ if (msg.what == 0x0001) {bundle data = msg.getData () ؛ String str = data.getString ("value") ؛ text_percent.settext (str) ؛ }}}} ؛ // بطريقة صريحة ، استدعاء HelloService NEW = نية جديدة (هذا ، Downservice.class) ؛ // قم بتعيين زر البدء ، انقر فوق الحدث btn_start.setonClickListener (new onClickListener () {Override public void onClick (view v) {// ابدأ الخدمة startervice (intent) ؛}}) ؛ // قم بتعيين زر التوقف انقر فوق حدث BTN_STOP.SetOnClickListener (جديد OnClickListener () {Override public void onClick (View V) {// أغلق Service StopService (intent) ؛}}) ؛ } / ****سيتم استدعاء طريقة رد الاتصال تلقائيًا من قبل النظام بمجرد إرجاع قيمة الإرجاع* / Override void onActivityResult (int requestcode ، int resultcode ، intent intent) {super.onactivityResult (requestcode ، resultcode ، intent) ؛ // إذا كان رمز الطلب هو 0 // ، فإن رمز النتيجة التي تم إرجاعها هي 1 // قد يقوم النشاط المطلوب بإرجاع رموز نتائج متعددة إذا (requestCode == 0 && resultcode == 1) {// أخذ بيانات حزمة البيانات = intent.getExtras () ؛ String str = data.getString ("ملفات") ؛ // إظهار text_sel_file.settext (str) ؛ }}} 3
<؟ Android: extream = "vertical"> <linearlayout android: layout_width = "wall_content" Android: layout_height = "wall_content" Android: layout_margintop = "20dp" android: extrection = "horizontal"> <textview android: id = Android: layout_height = "wall_content" Android: layout_gravity = "center_vertical" Android: text = "1" /> <textView android: id = "@id /text_percen Android: layout_marginleft = "20dp" Android: text = "0 ٪"/> <linearlayout android: layout_width = "wall_content" android: layout_height = "wall_content" Android: layout_marginleft = "20 dp" Android: direction = "vertical"> Android: layout_width = "wall_content" Android: layout_height = "wall_content" android: text = "start" /> <button android: id = "@+id /btn_stop" Android: layout_width = "wall_content" android: layout_height = </linearlayout> </linearlayout> </linearlayout>
4. يتم استخدام خدمة الخدمات لتمكين مؤشرات الترابط لتنفيذ التنزيلات في الخلفية
package com.xhy.zz ؛ import java.io.bufferedInputStream ؛ import java.io.bufferedreader ؛ import java.io.bufferedreader ؛ import java.io.bufferedWriter java.io.outputStreamWriter ؛ import java.io.printwriter ؛ استيراد java.net.inetaddress ؛ استيراد java.net.socket ؛ import java.net.unknownhostexception ؛ import android.service ؛ import Android.content.context ؛ Android.OS.Bundle ؛ Import Android.OS.Environment ؛ Import Android.os.ibinder ؛ Import Android.Os.Message ؛ Import Android.Util.log ؛ Sublic Downservice يمتد الخدمة {private Static Final String = "Socket_android" ؛ // اسم الملف لآلية التفضيل العملية العامة ثابت السلسلة النهائية المتفضلة _name = "Downservice" ؛ // وضع التشغيل لآلية PRIETECE Public Static int mode = context.mode_private ؛ // Thread Private Thread Workthread ؛ // تحديد اسم FileName filename = "file" ؛ // رقم المنفذ منفذ int الخاص = 9888 ؛ منطقية خاصة isStop = false ؛ / ****الأساليب التي يجب تنفيذها*/ Override public ibinder onBind (intent intent) {return null ؛ } Override public void onCreate () {super.oncreate () ؛ } Override public int onstartCommand (intent intent ، int flags ، int startId) {log.v ("tcp" ، filename) ؛ // إنشاء طريقة نقل backgroundwork = new RunNable () {Override public void run () {// settitle ("Test Socket Connection") ؛ مقبس المقبس = فارغ ؛ Socket Socket1 = NULL ؛ جرب { / * * حدد عنوان IP للخادم ، هذا العنوان هو عنوان LAN. إذا كنت تستخدم WiFi لتصفح الإنترنت ، فهو عنوان IP WiFi للكمبيوتر * عنوان IP الذي شاهدته في IpConfig كما يلي: اتصال شبكة Ethernet Wireless Network: * لاحقة DNS الخاصة بالاتصال. : عنوان IP. . . *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . استخدم IP ومنفذ الخادم لإنشاء كائن مقبس ، وأرسل طلبًا إلى الخادم للحصول على قيمة حجم الملف Socket1 = New Socket (Serveraddr ، Port) ؛ رسالة سلسلة = "--- test_socket_android ---" ؛ log.d ("TCP" ، "C: Sending:" " + Message +" "") ؛ // أرسل المعلومات إلى الخادم من خلال هذا الكائن printwriter out = new printWriter (جديد bufferedWriter (New OutputStreamWriter (Socket1.getOutputStream ())) ، True) ؛ // أرسل المحتوى الذي أدخله المستخدم إلى الخادم Out.println ("file_size") ؛ out.flush () ؛ // استلام معلومات الخادم BufferedReader في = جديد BufferEdReader (New InputStreamReader (Socket1.getInputStream ())) ؛ // الحصول على سلسلة حجم الملف str1 = in.readline () ؛ log.d ("tcp" ، str1) ؛ // تحويل حجم الملف إلى int-type int sum = integer.parseint (str1) ؛ log.d ("tcp" ، str1) ؛ // إغلاق دفق الإدخال in.close () ؛ sharedpreferences serventPreferences = getSharedPreferences (PRIFERMANKE_NAME ، MODE) ؛ ServentPreferences.Editor Editor = sharepreferences .edit () ؛ // جلب البايتات المنقولة int pre = sharepreferences.getInt ("Downservice" ، 0) ؛ int _pre = pre ؛ // قم بتحويله إلى سلسلة للإرسال إلى سلسلة الخادم S = string.valueof (_pre) ؛ // استخدم IP والمنفذ الخادم لإنشاء كائن مقبس وإرسال طلب إلى الخادم مرة أخرى للحصول على مقبس محتوى الملف = مقبس جديد (Serveraddr ، Port) ؛ // أرسل طلب الحرف إلى الخادم للحصول على ملف printWriter Out1 = جديد printWriter (جديد bufferedWriter (New OutputStreamWriter (socket.getOutputStream ()) ، True) ؛ Out1.println ("OK"+s) ؛ out1.flush () ؛ out.close () ؛ // تحديد دفق الإدخال bufferedInputStream bis = جديد bufferedInputStream (socket.getInputStream ()) ؛ string file1 = filename ؛ ملف السلسلة ؛ // حدد ما إذا كان يتم إدخال بطاقة SDCARD في الهاتف ، ثم أدخل الملف في بطاقة الذاكرة إذا (البيئة. // ملف تعريف تعريف بطاقة SD = sdcard.getCanonicalFile () + "/" + file1 ؛ // تحديد ملف Filetpure FileOtputStream FOS = جديد fileOutputStream (ملف ، صواب) ؛ حاول {int t = -1 ؛ تم تنزيل int = pre ؛ // تحديد عدد البايت لكل بايت نقل [] Buff = New Byte [8192] ؛ log.i ("sum" ، sum + "") ؛ // ابدأ في كتابة ملف الخادم إلى بطاقة SD للهاتف المحمول بينما ((t = bis.read (buff))! = -1) {if (isStop == true) {break ؛ } fos.write (Buff ، 0 ، t) ؛ تم تنزيله += t ؛ // تخزين محرر التقدم الناقل ("Downservice" ، تم تنزيله) ؛ editor.Commit () ؛ // عند اكتمال الإرسال ، أعد تعيين المعلومات المخزنة إذا (تم تنزيل == sum) {editor.putint ("Downservice" ، 0) ؛ editor.Commit () ؛ } // احصل على تقدم نقل الملف Float wb = ((تم تنزيله * 100) / (Float) sum) ؛ int wi = (int) wb ؛ System.out.println (تم تنزيله) ؛ String str = string.valueof (wi) + "٪" ؛ // أرسل تقدم نقل الملف إلى BaseActivity لعرضه على رسالة المستخدم msg = new Message () ؛ // إنشاء رسالة // إنشاء رسالة msg.what = 0x0001 ؛ // تعيين نوع الرسالة // إنشاء حزمة حزمة حمل البيانات = حزمة جديدة () ؛ data.putString ("value" ، str) ؛ msg.setData (البيانات) ؛ // استخدم المعالج لإرسال الرسائل الرئيسية. myhandler.sendmessage (msg) ؛ } // أغلق دفق الإدخال والإخراج bis.close () ؛ fos.flush () ؛ fos.close () ؛ } catch (استثناء e) {bis.close () ؛ fos.flush () ؛ fos.close () ؛ }} log.d (علامة ، "من الخادم:" تم استلامه " +" "") ؛ } catch (unknownhostexception e) {log.e (tag ، "192.168.155.1 is Uncle Server!") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {socket.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}}} ؛ workthread = موضوع جديد (خلفية) ؛ يتم استخدام طريقة // isalive لتحديد ما إذا كان مؤشر ترابط العمل يتم تشغيله إذا (! workthread.isalive ()) {// إنشاء مؤشر ترابط جديد workthread.start () ؛ log.v ("ServiceLife" ، "Thread يبدأ العمل") ؛ } آخر {log.v ("workthread" ، "تم استدعاء موضوع") ؛ } return start_sticky ؛ } Override public void onDestroy () {super.ondestroy () ؛ // مقاطعة الخيط باستخدام المقاطعة isStop = true ؛ log.v ("ServiceLife" ، "طريقة ondestroy تسمى") ؛ }} 5. أخيرًا ، لا تنس تسجيل AndroidManifest.xml
<use-permission android: name = "android.permission.internet"/> <use-permission android: name = "android.permission.mount_unmount_filesystems"> </teed-permission> <use-perfision android: ".
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.