บทความนี้อธิบายฟังก์ชั่นการสื่อสารไคลเอนต์และเซิร์ฟเวอร์ที่ใช้โดย Java ตามซ็อกเก็ต แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
รหัสต่อไปนี้หมายถึงโครงการแชทของ Ma Soldier ก่อนอื่นเรียกใช้ chatserver.java เพื่อใช้การฟังพอร์ตจากนั้นเรียกใช้ chatclient.java
อินสแตนซ์ไคลเอนต์
chatclient.java
แพ็คเกจ SocketDemo; นำเข้า Java.awt.*; นำเข้า java.awt.event.*; นำเข้า Java.io.*; นำเข้า Java.net.*; แชทคลาสสาธารณะขยายเฟรม {ซ็อกเก็ต s = null; dataOrtputStream dos = null; datainputStream dis = null; บูลีนส่วนตัว bconnected = false; textfield tftxt = new textfield (); textarea tacontent = new Textarea (); เธรด trecv = เธรดใหม่ (ใหม่ recvthread ()); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {new chatclient (). launchframe (); } โมฆะสาธารณะ LaunchFrame () {SetLocation (400, 300); this.setsize (300, 300); เพิ่ม (tftxt, borderlayout.south); เพิ่ม (tacontent, borderlayout.north); หีบห่อ(); this.addwindowListener (ใหม่ WindowAdapter () {@Override โมฆะสาธารณะ Windowclosing (WindowEvent Arg0) {disconnect (); system.exit (0);}}); tftxt.addactionListener (ใหม่ tflistener ()); setVisible (จริง); เชื่อมต่อ(); trecv.start (); } โมฆะสาธารณะเชื่อมต่อ () {ลอง {s = ซ็อกเก็ตใหม่ ("localhost", 8888); dos = ใหม่ dataOutputStream (s.getOutputStream ()); dis = new datainputStream (s.getInputStream ()); System.out.println ("เชื่อมต่อ!"); bconnected = true; } catch (unknownhostexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} โมฆะสาธารณะ disconnect () {ลอง {dos.close (); เปิดเผย(); s.close (); } catch (ioexception e) {e.printstacktrace (); } / * * ลอง {bconnected = false; trecv.join (); } catch (interruptedException * e) {e.printStackTrace (); } ในที่สุด {ลอง {dos.close (); เปิดเผย(); * s.close (); } catch (ioexception e) {e.printstacktrace (); }} */} คลาสส่วนตัว TFLISTENER ใช้ ActionListener {โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String str = tftxt.getText (). trim (); // tacontent.settext (str); tftxt.settext (""); ลอง {// system.out.println (s); dos.writeutf (str); dos.flush (); // dos.close (); } catch (ioexception e1) {e1.printstacktrace (); }}} คลาสส่วนตัว recvthread ดำเนินการ runnable {public void run () {ลอง {ในขณะที่ (bconnected) {string str = dis.readutf (); // system.out.println (str); tacontent.settext (tacontent.getText () + str + '/n'); }} catch (socketexception e) {system.out.println ("ออก, ลาก่อน!"); } catch (eofexception e) {system.out.println ("Exception, bye - bye!"); } catch (ioexception e) {e.printstacktrace (); -รหัสเซิร์ฟเวอร์ซ็อกเก็ต
chatserver.java
แพ็คเกจ SocketDemo; นำเข้า java.io.*; นำเข้า Java.net.*; นำเข้า Java.util.*; แชทคลาสสาธารณะ {บูลีนเริ่มต้น = เท็จ; Serversocket SS = NULL; รายการ <client> clients = new ArrayList <Client> (); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {chatserver ใหม่ (). start (); } public void start () {ลอง {ss = serversocket ใหม่ (8888); เริ่มต้น = จริง; } catch (bindexception e) {system.out.println ("พอร์ตที่ใช้งาน ...... "); System.out.println ("โปรดปิดโปรแกรมที่เกี่ยวข้องและเรียกใช้เซิร์ฟเวอร์อีกครั้ง!"); System.Exit (0); } catch (ioexception e) {e.printstacktrace (); } ลอง {ในขณะที่ (เริ่มต้น) {ซ็อกเก็ต s = ss.accept (); ไคลเอนต์ c = ไคลเอนต์ใหม่; System.out.println ("ไคลเอนต์เชื่อมต่อ!"); เธรดใหม่ (c). start (); clients.add (c); // dis.close (); }} catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ss.close (); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); }}} ไคลเอนต์คลาสใช้งาน runnable {ซ็อกเก็ตส่วนตัว s; private datainputStream dis = null; ส่วนตัว dataOutputStream dos = null; บูลีนส่วนตัว bconnected = false; ไคลเอนต์สาธารณะ (ซ็อกเก็ต s) {this.s = s; ลอง {dis = new datainputStream (s.getInputStream ()); dos = ใหม่ dataOutputStream (s.getOutputStream ()); bconnected = true; } catch (ioexception e) {e.printstacktrace (); }} โมฆะสาธารณะส่ง (สตริง str) {ลอง {dos.writeutf (str); } catch (ioexception e) {client.remove (นี่); System.out.println ("อีกฝ่ายออกไป! ฉันลบออกจากรายการ!"); // e.printstacktrace (); }} โมฆะสาธารณะเรียกใช้ () {ลอง {ในขณะที่ (bconnected) {string str = dis.readutf (); System.out.println (str); สำหรับ (int i = 0; i <clients.size (); i ++) {ไคลเอนต์ c = clients.get (i); C.Send (STR); // system.out.println ("สตริงส่ง!"); } / * * สำหรับ (iterator <lient> it = client.iterator (); * it.hasnext ();) {ไคลเอนต์ c = it.next (); C.Send (STR); } * / / / * * iterator <lient> it = client.iterator (); * ในขณะที่ (it.hasnext ()) {ไคลเอนต์ c = it.next (); C.Send (STR); *} */}} catch (eofexception e) {system.out.println ("ลูกค้าปิด!"); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (dis! = null) dis.close (); ถ้า (dos! = null) dos.close (); if (s! = null) {s.close (); // s = null; }} catch (ioexception e1) {e1.printstacktrace (); -ผลลัพธ์ของการทดสอบในพื้นที่:
หลังจากปิดหน้าต่างไคลเอ็นต์ข้อความแจ้งมีดังนี้:
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Java โปรดตรวจสอบหัวข้อของเว็บไซต์นี้: "สรุปทักษะการเขียนโปรแกรม Java Socket", "บทสรุปของไฟล์ Java และทักษะการดำเนินงานไดเรกทอรี", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม", "สรุปทักษะการดำเนินงาน Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน