بعض النقاط التي يجب أن تكون واضحة حول اتصال TCP:
اتصال TCP موجه نحو الاتصال ، وتحتاج إلى بدء تشغيل الخادم أولاً ثم بدء تشغيل العميل.
يجب على كل من العميل والخادم إنشاء كائنات المقبس. يحتاج العميل إلى تحديد مقبس الخادم (منفذ IP+) ، ويجب على الخادم تحديد منفذ الخدمة.
Socket client_socket = مقبس جديد ("192.168.100.17" ، 8888) ؛ // مقبس العميل (مقبس فئة المقبس عبارة عن مقبس متصل) Serversocket stive_socket = serversocket (8888) ؛ // Server Socket ، في هذا الوقت ، هو مقبس الاستماع (تم ربط العنوان والمنفذ ())يحتاج الخادم إلى استخدام طريقة قبول () لتحويل مقبس الاستماع إلى مقبس متصل. يمكن لمقبس الاستماع هذا إنشاء مآخذ متعددة متصلة ، بحيث يمكنك أيضًا الاستماع إلى طلبات من العملاء الآخرين بعد الاتصال. لذلك ، يجب تنفيذ الوصول المتزامن باستخدام MultiThreading هنا. بعد الحصول على المقبس المتصل ، يمكنك الحصول على الكثير من معلومات العميل ، مثل عنوان IP الخاص بالعميل ، والمنفذ الذي يتم إرسال الطلب فيه ، إلخ.
Socket server_scoket = socket.accept () ؛ socket server_scoket2 = socket.accept () ؛ socket server_scoket3 = socket.accept () ؛
لتنفيذ الاتصالات المتزامنة على الخادم ، استخدم الكود التالي تقريبًا: حيث يكون ThreadTask كائن مهمة مؤشر ترابط.
Public Static Void Main (String [] args) يلقي iOexception {serversocket stiNed_sock = new serversocket (8888) ؛ // مطلوب واحد فقط للاستماع إلى المقبس ، لذلك في حين (صحيح) خارج المهمة {// في كل مرة يتم فيها إنشاء اتصال ، يتم فتح مؤشر ترابط. Socket conn_sock = stiNed_sock.accept () ؛ // عندما لا يأتي أي اتصال جديد ، يحجب مؤشر الترابط الرئيسي هذا الموضوع الجديد (ThreadTask جديد (conn_sock)). start () ؛ }}يحتاج العميل إلى الحصول على دفق الإخراج بناءً على المقبس المتصل ، ويحتاج الخادم إلى الحصول على دفق الإدخال بناءً على المقبس. بالطبع ، نظرًا لوجود مقبس متصل ، يمكنك الحصول على دفق الإدخال ودفق الإخراج في أي نهاية.
outputStream send_stream = client_socket.getOutputStream () ؛ // يحصل العميل على دفق الإخراج recv_stream = server_socket.getInputStream () ؛
يجب أن يغلق الخادم المقبس المتصاعد بنشاط ، ويجب إغلاق مقبس الاستماع في المكان المناسب.
يجب أن يكون الخادم مسؤولاً عن استلامه بشكل مستمر.
عميل بسيط:
استيراد java.io.ioException ؛ استيراد java.io.outputstream ؛ استيراد java.net.socket ؛ الفئة العامة tcpclient {public static void main (string [] args) {// 1. إنشاء مقبس العميل c_sock = null ؛ outputStream client_outstream = null ؛ Try {C_sock = New Socket ("192.168.0.124" ، 8888) ؛ // 2. الحصول على دفق الإخراج client_outstream = c_sock.getOutputStream () ؛ // 3. بيانات الإخراج client_outstream.write ("مرحبًا ، أنا قادم" .getBytes ()) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {if (c_sock! = null) {try {c_sock.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}}}جانب الخادم البسيط:
استيراد java.io.bufferedReader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamread ؛ استيراد java.net.servers ؛ repray java.net.socket ؛ public class tcpserver {public static void main (] باطل؛ حاول {stiNed_sock = new ServersOcket (8888) ؛ } catch (ioException i) {i.printStackTrace () ؛ } socket server_sock = null ؛ inputStream in_sock = null ؛ بينما (صواب) {try {// 2. قم بإنشاء اتصال مع العميل ، وإنشاء مقبس متصل ، والحصول على عنوان IP العميل server_sock = stive_sock.accept () ؛ string client_ip = server_sock.getinetaddress (). gethostaddress () ؛ System.out.println ("العميل:" + client_ip + "connected") ؛ ] BufferedReader BUFR = جديد BufferedReader (New InputStreamReader (IN_SOCK)) ؛ خط السلسلة = فارغ ؛ بينما ((line = bufr.readline ())! = null) {system.out.println (line) ؛ } // 4. أغلق المقبس المتصل server_sock.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}فيما يلي وظيفة تحميل ملف TCP:
بالإضافة إلى دفق إخراج المقبس ، يحتوي العميل أيضًا على دفق الإدخال الذي يقرأ الملفات المحلية ، ودفق إدخال المقبس لقراءة معلومات التعليقات من الخادم.
يحتوي الخادم أيضًا على ثلاثة تدفقات: تدفقات إدخال المقبس ودفقات الإخراج ، واكتب لتحميل الملفات المستهدفة.
بعد أن يقرأ العميل جميع البيانات من الملف المحلي ، يحتاج إلى استخدام Socket's stowddownoutput () لإخطار الخادم بأن دفق الإخراج للمقبس قد وصل إلى النهاية.
من أجل توفير وظائف التحميل لعدة أشخاص ، يحتاج الخادم إلى استخدام مؤشرات ترابط متعددة لتنفيذ اتصالات متزامنة.
عميل:
استيراد java.io.bufferedReader ؛ استيراد java.io.fileinputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamer ؛ import java.io.outputstream ؛ java.net.socket ؛ الطريقة التي يتم إنشاؤها تلقائيًا String String Server_addr = "192.168.0.124" ؛ int server_port = 8888 ؛ Socket Send_sock = null ؛ fileInputStream local_read = null ؛ حاول {// 1. مقبس العميل send_sock = socket (server_addr ، server_port) ؛ // 2. // 3. دفق إدخال البايت يقرأ بيانات الملفات المحلية ويستخدم دفق إخراج المقبس لإرسال local_read = جديد fileInputStream ("d: /myjava/net/sql.docx") ؛ Byte [] buf = new byte [1024] ؛ int len = 0 ؛ بينما ((len = local_read.read (buf))! = -1) {send_stream.write (buf ، 0 ، len) ؛ } // 4. حدد دفق الإخراج إلى النهاية send_sock.shutdownoutput () ؛ // 5. استقبل بيانات التعليقات من الخادم ، مثل تحميل ناجح ، فشل التحميل ، إلخ. BufferedReader ACK_RECV = جديد BufferEdReader (New InputStreamReader (RECV_STream)) ؛ خط السلسلة = فارغ ؛ بينما ((line = ack_recv.readline ())! = null) {system.out.println (line) ؛ }} catch (ioException i) {i.printStackTrace () ؛ } أخيرًا {if (send_sock! = null) {try {send_sock.close () ؛ local_read.close () ؛ } catch (ioException i1) {i1.printStackTrace () ؛ }} if (local_read! = null) {try {local_read.close () ؛ } catch (ioException i2) {i2.printStackTrace () ؛ }}}}}}جانب الخادم:
استيراد java.io.file ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.net.servers الاستماع_Sock = ServersOcket (8888) ؛ // مطلوب واحد فقط للاستماع إلى المقبس ، لذلك في حين (صحيح) {// في كل مرة يتم فيها إنشاء اتصال ، يتم تشغيل مؤشر ترابط. Socket conn_sock = stiNed_sock.accept () ؛ // عندما لا يأتي أي اتصال جديد ، فإن كتل مؤشر الترابط الرئيسية الرئيسية هنا مؤشر ترابط جديد (تحميل جديد (conn_sock)). start () ؛ }}} class uploader تنفذ RunNable {private file dest_dir = new file ("d:/temp") ؛ // تحميل دليل المقبس الخاص conn_sock = null ؛ // Connect Socket inputStream recv_stream = null ؛ fileOutputStream dest_stream = null ؛ قم بتحميل (مقبس conn_sock) يلقي ioException {this.conn_sock = conn_sock ؛ } public void run () {try {if (! dest_dir.exists ()) {dest_dir.mkdirs () ؛ } // 1. // Client IP String client_ip = conn_sock.getInetAddress (). gethostaddress () ؛ System.out.println (client_ip + "..... connected") ؛ // 2. تم تسمية موقع التحميل للملف ، أي هدف الإخراج ، على اسم IP. إذا كان الملف موجودًا بالفعل ، فقم بإنشاء ملف جديد مع قوسين وأرقام ، مثل "192.168.100.23 (1) .txt" ملف dest_file = ملف جديد (dest_dir ، client_ip + ".docx") ؛ عدد int = 1 ؛ بينما (dest_file.exists ()) {dest_file = ملف جديد (dest_dir ، client_ip + "(" + count + ")" + ".docx") ؛ count ++ ؛ } // 3. اقرأ البيانات واكتب إلى ملف الهدف dest_stream = جديد fileOutputStream (dest_file) ؛ Byte [] buf = new byte [1024] ؛ int len = 0 ؛ بينما ((len = recv_stream.read (buf))! = -1) {dest_stream.write (buf ، 0 ، len) ؛ } // 4. معلومات التغذية المرتدة إلى العميل OutputStream ACK_SEND = conn_sock.getOutputStream () ؛ byte [] text = "تحميل ناجح!". getBytes () ؛ ACK_SEND.WRITE (نص) ؛ } catch (ioException e1) {e1.printStackTrace () ؛ } أخيرًا {if (dest_stream! = null) {try {dest_stream.close () ؛ } catch (ioException i) {i.printStackTrace () ؛ }} if (conn_sock! = null) {try {conn_sock.close () ؛ } catch (ioException i) {i.printStackTrace () ؛ }}}}}}الأمثلة أعلاه لاتصالات TCP ووظيفة تحميل الملفات البسيطة لبرمجة شبكة Java هي المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.