บางจุดที่ต้องชัดเจนเกี่ยวกับการสื่อสาร TCP:
การสื่อสาร TCP นั้นมุ่งเน้นการเชื่อมต่อและคุณต้องเริ่มต้นเซิร์ฟเวอร์ก่อนจากนั้นเริ่มไคลเอนต์
ทั้งไคลเอนต์และเซิร์ฟเวอร์ต้องสร้างวัตถุซ็อกเก็ต ไคลเอนต์จำเป็นต้องระบุซ็อกเก็ตเซิร์ฟเวอร์ (IP+พอร์ต) และเซิร์ฟเวอร์จะต้องระบุพอร์ตบริการ
ซ็อกเก็ต client_socket = ซ็อกเก็ตใหม่ ("192.168.100.17", 8888); // ซ็อกเก็ตไคลเอ็นต์ (ซ็อกเก็ตของคลาสซ็อกเก็ตเป็นซ็อกเก็ตที่เชื่อมต่อ) Serversocket Listen_Socket = Serversocket ใหม่ (8888); // ซ็อกเก็ตเซิร์ฟเวอร์ในเวลานี้เป็นซ็อกเก็ตการฟัง (ที่อยู่และพอร์ตถูกผูกไว้ ())เซิร์ฟเวอร์จำเป็นต้องใช้วิธีการยอมรับ () เพื่อแปลงซ็อกเก็ตการฟังเป็นซ็อกเก็ตที่เชื่อมต่อ ซ็อกเก็ตการฟังนี้สามารถสร้างซ็อกเก็ตที่เชื่อมต่อได้หลายตัวเพื่อให้คุณสามารถรับฟังคำขอจากลูกค้ารายอื่นหลังจากการเชื่อมต่อ ดังนั้นการเข้าถึงที่เกิดขึ้นพร้อมกันควรดำเนินการโดยใช้มัลติเธรดที่นี่ หลังจากได้รับซ็อกเก็ตที่เชื่อมต่อคุณสามารถรับข้อมูลไคลเอนต์จำนวนมากเช่นที่อยู่ IP ของลูกค้าพอร์ตที่ส่งคำขอ ฯลฯ
Socket Server_Scoket = Socket.accept (); Socket Server_Scoket2 = Socket.accept (); Socket Server_Scoket3 = Socket.accept ();
ในการใช้การเชื่อมต่อที่เกิดขึ้นพร้อมกันบนเซิร์ฟเวอร์ให้ใช้รหัสต่อไปนี้โดยประมาณ: ที่ ThreadTask เป็นวัตถุงานเธรด
โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {Serversocket Listen_Sock = Serversocket ใหม่ (8888); // มีเพียงหนึ่งเดียวที่จำเป็นต้องฟังซ็อกเก็ตดังนั้นในขณะที่ (จริง) นอกงาน {// ทุกครั้งที่มีการสร้างการเชื่อมต่อจะเปิดเธรด ซ็อกเก็ต conn_sock = listen_sock.accept (); // เมื่อไม่มีการเชื่อมต่อใหม่เข้ามาบล็อกหลักหลักบล็อกเธรดใหม่นี้ (ThreadTask ใหม่ (conn_sock)) เริ่มต้น (); -ไคลเอนต์จำเป็นต้องได้รับกระแสเอาต์พุตตามซ็อกเก็ตที่เชื่อมต่อและเซิร์ฟเวอร์จำเป็นต้องได้รับกระแสอินพุตตามซ็อกเก็ต แน่นอนเนื่องจากมีซ็อกเก็ตที่เชื่อมต่อคุณสามารถรับสตรีมอินพุตและสตรีมเอาท์พุทได้ทุกที่
outputStream send_stream = client_socket.getOutputStream (); // ไคลเอนต์ได้รับเอาท์พุทสตรีมอินพุต recv_stream = server_socket.getInputStream ();
เซิร์ฟเวอร์ควรปิดซ็อกเก็ตที่เชื่อมต่ออย่างแข็งขันและซ็อกเก็ตการฟังควรปิดในสถานที่ที่เหมาะสม
เซิร์ฟเวอร์ควรรับผิดชอบในการรับอย่างต่อเนื่อง
ลูกค้าง่าย:
นำเข้า java.io.ioException; นำเข้า java.io.OutputStream; นำเข้า java.net.socket; คลาสสาธารณะ tcpClient {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// 1 สร้างซ็อกเก็ตซ็อกเก็ตไคลเอ็นต์ c_sock = null; OutputStream client_outstream = null; ลอง {c_sock = ซ็อกเก็ตใหม่ ("192.168.0.124", 8888); // 2. รับ utput stream client_outstream = c_sock.getOutputStream (); // 3. เอาต์พุตข้อมูล client_outstream.write ("สวัสดีฉันกำลังจะมา" .getBytes ()); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ถ้า (c_sock! = null) {ลอง {c_sock.close (); } catch (ioexception e) {e.printstacktrace (); -Simple Server Side:
นำเข้า java.io.bufferedreader; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.inputStreamReader; นำเข้า java.net.serversocket; นำเข้า java.net.socket; โมฆะ; ลอง {listen_sock = ใหม่ Serversocket (8888); } catch (ioexception i) {i.printstacktrace (); } Socket Server_sock = null; inputStream in_sock = null; ในขณะที่ (จริง) {ลอง {// 2. สร้างการเชื่อมต่อกับไคลเอนต์สร้างซ็อกเก็ตที่เชื่อมต่อและรับที่อยู่ IP ของไคลเอ็นต์ Server_sock = Listen_sock.accept (); String client_ip = server_sock.getInetAddress (). gethostaddress (); System.out.println ("ไคลเอนต์:" + client_ip + "เชื่อมต่อ"); // 3. รับกระแสอินพุตตามซ็อกเก็ตที่เชื่อมต่อและอ่านข้อมูลที่ส่งโดยไคลเอนต์ in_sock = server_sock.getInputStream (); bufferedReader bufr = new bufferedReader (ใหม่ inputStreamReader (in_sock)); สตริงบรรทัด = null; ในขณะที่ ((line = bufr.readline ())! = null) {system.out.println (บรรทัด); } // 4. ปิดซ็อกเก็ตที่เชื่อมต่อ Server_sock.close (); } catch (ioexception e) {e.printstacktrace (); -ต่อไปนี้คือฟังก์ชั่นการอัปโหลดไฟล์ TCP:
นอกเหนือจากสตรีมเอาท์พุทซ็อกเก็ตแล้วไคลเอนต์ยังมีสตรีมอินพุตที่อ่านไฟล์ท้องถิ่นและสตรีมอินพุตซ็อกเก็ตเพื่ออ่านข้อมูลข้อเสนอแนะจากเซิร์ฟเวอร์
เซิร์ฟเวอร์ยังมีสามสตรีม: อินพุตซ็อกเก็ตอินพุตและเอาต์พุตและเขียนเพื่ออัปโหลดไฟล์เป้าหมาย
หลังจากที่ไคลเอนต์อ่านข้อมูลทั้งหมดจากไฟล์ในเครื่องมันต้องใช้ Socket ของ shutdownoutput () เพื่อแจ้งเซิร์ฟเวอร์ว่ากระแสเอาต์พุตของซ็อกเก็ตถึงจุดสิ้นสุดแล้ว
เพื่อให้มีฟังก์ชั่นการอัปโหลดสำหรับหลาย ๆ คนเซิร์ฟเวอร์จำเป็นต้องใช้หลายเธรดเพื่อใช้การเชื่อมต่อที่เกิดขึ้นพร้อมกัน
ลูกค้า:
นำเข้า java.io.bufferedreader; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.inputStreamreader; นำเข้า java.io.OutputStream; นำเข้า Java.net.socket เมธอดอัตโนมัติที่สร้างขึ้น stub string server_addr = "192.168.0.124"; int server_port = 8888; ซ็อกเก็ต send_sock = null; fileInputStream local_read = null; ลอง {// 1. ซ็อกเก็ตไคลเอนต์ send_sock = ซ็อกเก็ตใหม่ (server_addr, server_port); // 2. รับกระแสเอาต์พุตของการเชื่อมต่อไปป์ไลน์เอาท์พุทสตรีม send_stream = send_sock.getOutputStream (); // 3. สตรีมอินพุตไบต์อ่านข้อมูลไฟล์ในพื้นที่และใช้สตรีมเอาต์พุตของซ็อกเก็ตเพื่อส่ง local_read = ใหม่ fileInputStream ("D: /myjava/net/sql.docx"); ไบต์ [] buf = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = local_read.read (buf))! = -1) {send_stream.write (buf, 0, len); } // 4. ทำเครื่องหมายกระแสเอาต์พุตไปยังปลาย send_sock.shutdownoutput (); // 5. รับข้อมูลข้อเสนอแนะจากเซิร์ฟเวอร์เช่นการอัปโหลดสำเร็จการอัปโหลดความล้มเหลว ฯลฯ InputStream Recv_stream = send_sock.getInputStream (); BufferedReader ACK_RECV = ใหม่ bufferedReader (ใหม่ inputStreamReader (recv_stream)); สตริงบรรทัด = null; ในขณะที่ ((line = ack_recv.readline ())! = null) {system.out.println (บรรทัด); }} catch (iOexception i) {i.printStackTrace (); } ในที่สุด {ถ้า (send_sock! = null) {ลอง {send_sock.close (); local_read.close (); } catch (ioexception i1) {i1.printstacktrace (); }} if (local_read! = null) {ลอง {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.serversocket; นำเข้า Java.net.socket Serversocket Listen_Sock = ใหม่ Serversocket (8888); // มีเพียงหนึ่งเดียวที่จำเป็นในการฟังซ็อกเก็ตดังนั้นในขณะที่ (จริง) {// ทุกครั้งที่มีการสร้างการเชื่อมต่อจะเริ่มเธรด ซ็อกเก็ต conn_sock = listen_sock.accept (); // เมื่อไม่มีการเชื่อมต่อใหม่เข้ามาบล็อกหลักหลักที่นี่เธรดใหม่ (uploader ใหม่ (conn_sock)) เริ่มต้น (); }}} คลาสอัพโหลดใช้การใช้งาน runnable {ไฟล์ส่วนตัว dest_dir = ไฟล์ใหม่ ("d:/temp"); // อัปโหลดไดเรกทอรีซ็อกเก็ตส่วนตัว conn_sock = null; // เชื่อมต่อซ็อกเก็ตอินพุต recv_stream = null; fileOutputStream dest_stream = null; Uploader (ซ็อกเก็ต conn_sock) พ่น ioexception {this.conn_sock = conn_sock; } โมฆะสาธารณะเรียกใช้ () {ลอง {ถ้า (! dest_dir.exists ()) {dest_dir.mkdirs (); } // 1. รับกระแสอินพุตที่เชื่อมต่อ Pipeline Recv_stream = conn_sock.getInputStream (); // ลูกค้า IP String client_ip = conn_sock.getInetAddress (). gethostaddress (); System.out.println (client_ip + "..... เชื่อมต่อ"); // 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"); นับ ++; } // 3. อ่านข้อมูลและเขียนไปยังไฟล์เป้าหมาย dest_stream = ใหม่ fileOutputStream (dest_file); ไบต์ [] buf = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = recv_stream.read (buf))! = -1) {dest_stream.write (buf, 0, len); } // 4. ข้อมูลข้อเสนอแนะไปยังไคลเอนต์ outputStream ack_send = conn_sock.getOutputStream (); ไบต์ [] text = "อัปโหลดสำเร็จ!". getBytes (); ACK_SEND.WRITE (ข้อความ); } catch (ioexception e1) {e1.printstacktrace (); } ในที่สุด {ถ้า (dest_stream! = null) {ลอง {dest_stream.close (); } catch (ioexception i) {i.printstacktrace (); }} if (conn_sock! = null) {ลอง {conn_sock.close (); } catch (ioexception i) {i.printstacktrace (); -ตัวอย่างข้างต้นของการสื่อสาร TCP และฟังก์ชั่นการอัปโหลดไฟล์อย่างง่ายของการเขียนโปรแกรมเครือข่าย Java เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น