ตัวอย่างในบทความนี้แบ่งปันรหัสห้องแชท Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ส่วนใหญ่ เกี่ยวข้องกับความรู้
・ การเขียนโปรแกรม GUI ใน Java รวมถึงกลไกการฟังเหตุการณ์
・ การเขียนโปรแกรมการสื่อสารเครือข่าย Java, Serversocket และคลาสซ็อกเก็ตใช้
・ การเขียนโปรแกรมแบบมัลติเธรดคลาสเธรดและอินเตอร์เฟสที่ใช้งานได้ใน Java
รหัสต้นฉบับ
ลูกค้า
Package Project1; นำเข้า Java.awt.*; นำเข้า java.awt.event.*; นำเข้า Java.io.*; นำเข้า Java.net.*; นำเข้า Javax.swing.*; ไคลเอนต์คลาสสาธารณะ {ส่วนตัว JFrame ClientFrame; Jlabel Iplabel ส่วนตัว; Jlabel Portlabel ส่วนตัว; Jlabel ส่วนตัว Sayslabel; ส่วนตัว Jlabel Nicknamelabel; ส่วนตัว jtextfield iptext; Private Jtextfield Porttext; Private Jtextfield Nicknametext; ส่วนตัว jtextfield saystext; JButton Private JButton ConnectButton; Private Jbutton NicknameButton; JButton ส่วนตัวพูดว่า BUTTON; JPANEL JPANELNORTH ส่วนตัว; JPanel JPANELSOUTH0 ส่วนตัว; JPanel JPANELSOUTH1 ส่วนตัว; JPanel JPANELSOUTH2 ส่วนตัว; jtextarea ส่วนตัว clienttextarea; ตัวเลื่อน jscrollpane ส่วนตัว; ตัวอ่านบัฟเฟอร์รีดส่วนตัว; นักเขียน Private Printwriter; ชื่อเล่นสตริงส่วนตัว; โมฆะคงที่สาธารณะหลัก (สตริง args []) {ไคลเอนต์ aclient = ไคลเอนต์ใหม่ (); aclient.startup (); } // เริ่มต้นไคลเอนต์สาธารณะส่วนประกอบ () {nickname = "ไคลเอนต์"; clientFrame = new JFrame (); jpanelnorth = new JPanel (); iPlabel = new JLabel ("เซิร์ฟเวอร์ IP", jlabel.left); iptext = ใหม่ jtextfield (10); portlabel = new jlabel ("พอร์ตเซิร์ฟเวอร์", jlabel.left); porttext = new jtextfield (10); ConnectButton = new JButton ("การเชื่อมต่อ"); clientTextArea = new JtextArea (); Scroller = new JScrollpane (clientTextArea); JPanelsouth0 = new JPanel (); JPanelsouth1 = new JPanel (); JPANELSOUTH2 = new JPanel (); nicknamelabel = new Jlabel ("ชื่อเล่น", jlabel.left); nicknametext = new jtextfield (ชื่อเล่น, 30); NickNameButton = new JButton ("ยืนยัน"); saylabel = new jlabel ("ข้อความ", jlabel.left); SayText = new Jtextfield (30); saybutton = new JButton ("ยืนยัน"); } // สร้างช่องว่างส่วนตัว GUI buildGui () {// การตั้งค่าของ window clientframe.settitle ("ไคลเอนต์"); clientFrame.SetDefaultCloseOperation (jframe.exit_on_close); clientframe.setsize (550, 550); // ส่วนประกอบ jpanelnorth.add (iplabel); jpanelnorth.add (iptext); jpanelnorth.add (Portlabel); jpanelnorth.add (porttext); jpanelnorth.add (ConnectButton); clientframe.getContentPane (). เพิ่ม (BorderLayout.north, JPanelnorth); // ส่วนประกอบกลาง clientTextArea.SetFocusable (เท็จ); Scroller.setverticalscrollbarpolicy (scrollpaneconstants.vertical_scrollbar_always); Scroller.sethorizontalscrollbarpolicy (ScrollPaneconstants.horizontal_scrollbar_never); clientframe.getContentPane (). เพิ่ม (BorderLayout.Center, Scroller); // ส่วนประกอบของพื้นที่ภาคใต้ JPanelsouth1.add (Nicknamelabel); JPanelsouth1.add (Nicknametext); JPanelsouth1.add (NicknameButton); JPanelsouth2.add (Saylabel); jpanelsouth2.add (saytext); JPanelsouth2.add (Saybutton); JPANELSOURT0.SETLAYOUT (ใหม่ BOXLAYOUT (JPANELSOUTH0, BOXLAYOUT.Y_AXIS)); JPANELSOURT0.ADD (JPANELSOURT1); JPANELSOURT0.ADD (JPANELSOUTH2); clientframe.getContentPane (). เพิ่ม (BorderLayout.South, JPanelsouth0); // ตั้งค่าหน้าต่างเพื่อดู clientframe.setVisible (จริง); } // ไคลเอนต์เรียกใช้โมฆะสาธารณะเริ่มต้น () {buildgui (); // เธรดที่ได้รับข้อความเซิร์ฟเวอร์ Runnable IncomingReader = ใหม่ runnable () {@Override โมฆะสาธารณะเรียกใช้ () {ข้อความสตริง; ลอง {ในขณะที่ ((message = reader.readline ())! = null) {clienttextarea.append (ข้อความ + "/n"); }} catch (Exception ex) {ex.printstacktrace (); - // ฟังปุ่มเชื่อมต่อเพื่อรับรู้การเชื่อมต่อของเซิร์ฟเวอร์ ConnectButton.AddActionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String aserverip = iptext.getText () aserverport. ) aserverport. joptionpane.ShowMessageHialog (clientframe, "โปรดป้อน IP และพอร์ตที่สมบูรณ์!")} lele {ลอง {@suppresswarnings ("ทรัพยากร") socketictocket = socket new (aserverip, integer.parseint); BufferedReader (StreamReader); และอินพุตพอร์ตถูกต้อง ");}}}}}); // ฟังชื่อเล่นและตั้งค่าชื่อเล่น actionListener nicknamelistener = new ActionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String atext = nicknametext.getText (); if (! atext.equals ("")) {ชื่อเล่น = atext; - NicknameButton.addactionListener (Nicknamelistener); Nicknametext.addactionListener (Nicknamelistener); nicknametext.addfocuslistener (New FocusListener () {@Override โมฆะสาธารณะโฟกัสที่โฟกัส (โฟกัส e) {} @Override โมฆะสาธารณะโฟกัสสาธารณะ (โฟกัส e) {string atext = nicknametext.getText (); ถ้า (! // ส่งข้อความไปยังเซิร์ฟเวอร์ actionListener saylistener = new ActionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String atext = sayText.getText (); if (atext.equals ("")) {joptionpane.showMessagedialog (clientFrame, "เนื้อหาไม่สามารถว่างเปล่า!"); } else {ลอง {writer.println (ชื่อเล่น + ":" + atext); Writer.flush (); } catch (exception ex) {ex.printstacktrace (); } saytext.settext (""); - saybutton.addactionListener (saylistener); saytext.addactionListener (saylistener); - เซิร์ฟเวอร์
Package Project1; นำเข้า Java.awt.*; นำเข้า java.awt.event.*; นำเข้า Java.io.*; นำเข้า Java.net.*; นำเข้า java.util.arraylist; นำเข้า java.util.iterator; นำเข้า Javax.swing.*; เซิร์ฟเวอร์คลาสสาธารณะ {ส่วนตัว JFrame ServerFrame; Jlabel Portlabel ส่วนตัว; Jlabel ส่วนตัว Sayslabel; ส่วนตัว Jlabel Nicknamelabel; Private Jtextfield Porttext; ส่วนตัว jtextfield saystext; Private Jtextfield Nicknametext; JBUTTON Private JButton StartButton; JButton ส่วนตัวพูดว่า BUTTON; Private Jbutton NicknameButton; JPANEL JPANELNORTH ส่วนตัว; JPanel JPANELSOUTH0 ส่วนตัว; JPanel JPANELSOUTH1 ส่วนตัว; JPanel JPANELSOUTH2 ส่วนตัว; ตัวเลื่อน jscrollpane ส่วนตัว; jtextarea ส่วนตัว servertextarea; ArrayList ส่วนตัว <PrintWriter> ClientOutputStreams; ชื่อเล่นสตริงส่วนตัว; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {เซิร์ฟเวอร์ aserver = เซิร์ฟเวอร์ใหม่ (); aserver.startup (); } // เริ่มต้นเซิร์ฟเวอร์ส่วนประกอบสาธารณะ () {nickname = "เซิร์ฟเวอร์"; ServerFrame = new JFrame (); jpanelnorth = new JPanel (); portlabel = new jlabel ("พอร์ต", jlabel.left); porttext = new jtextfield (30); startButton = new JButton ("start"); ServerTextArea = new JTextArea (); Scroller = new JScrollpane (ServerTextArea); nicknamelabel = new Jlabel ("ชื่อเล่น", jlabel.left); nicknametext = new jtextfield (ชื่อเล่น, 30); NickNameButton = new JButton ("ยืนยัน"); JPanelsouth0 = new JPanel (); JPanelsouth1 = new JPanel (); JPANELSOUTH2 = new JPanel (); saylabel = new jlabel ("ข้อความ", jlabel.left); SayText = new Jtextfield (30); saybutton = new JButton ("ยืนยัน"); } // สร้างช่องว่างส่วนตัว GUI buildGui () {// การตั้งค่าของ window serverframe.settitle ("เซิร์ฟเวอร์"); ServerFrame.SetDefaultCloseOperation (jframe.exit_on_close); serverframe.setsize (550, 550); // ส่วนประกอบของพื้นที่เหนือ jpanelnorth.add (Portlabel); jpanelnorth.add (porttext); jpanelnorth.add (startbutton); ServerFrame.getContentPane () เพิ่ม (BorderLayout.north, JPanelnorth); // ส่วนประกอบกลาง serverTextArea.SetFocusable (เท็จ); Scroller.setverticalscrollbarpolicy (scrollpaneconstants.vertical_scrollbar_always); Scroller.sethorizontalscrollbarpolicy (ScrollPaneconstants.horizontal_scrollbar_never); ServerFrame.getContentPane () เพิ่ม (BorderLayout.Center, Scroller); // ส่วนประกอบของ South District Jpanelsouth1.add (Nicknamelabel); JPanelsouth1.add (Nicknametext); JPanelsouth1.add (NicknameButton); JPanelsouth2.add (Saylabel); jpanelsouth2.add (saytext); JPanelsouth2.add (Saybutton); JPANELSOURT0.SETLAYOUT (New BoxLayout (JPANELSOUTH0, BOXLAYOUT.Y_AXIS); JPANELSOURT0.ADD (JPANELSOURT1); JPANELSOURT0.ADD (JPANELSOURD2); ServerFrame.GetContentpane () ServerFrame.SetVisible (จริง);} // เซิร์ฟเวอร์เรียกใช้โมฆะสาธารณะเริ่มต้น () {buildgui (); if (aport.equals ("")) {joptionpane.showmessagedialog (ServerFrame, "โปรดป้อนหมายเลขพอร์ตที่ถูกต้อง!") Serversocket (Integer.ParseInt (Aport)); ServerTextArea.Append ("ไคลเอ็นต์เชื่อมต่อ .../n"); PrintWriter Writer = New PrintWriter (clientSocket.getOutputStream ()); clientOutputStreams.add (นักเขียน); เธรด t = เธรดใหม่ (ใหม่ ClientHandler (ClientSocket)); T.Start (); }} catch (numberFormatexception | iOexception e) {e.printstacktrace (); - เธรด ServerTHread = เธรดใหม่ (ServerRunnable); Serverthread.start (); } catch (exception ex) {ex.printstacktrace (); - startButton.AddactionListener (startListener); porttext.addactionListener (startListener); // ฟังชื่อเล่นและตั้งค่าชื่อเล่น actionListener nicknamelistener = new ActionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String atext = nicknametext.getText (); if (! atext.equals ("")) {ชื่อเล่น = atext; - NicknameButton.addactionListener (Nicknamelistener); Nicknametext.addactionListener (Nicknamelistener); nicknametext.addfocuslistener (New FocusListener () {@Override โมฆะสาธารณะโฟกัสที่โฟกัส (โฟกัส e) {} @Override โมฆะสาธารณะโฟกัสสาธารณะ (โฟกัส e) {string atext = nicknametext.getText (); ถ้า (! // ฟังปุ่มพูดและส่งข้อความ ActionListener SayListener = ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String atext = SayText.getText (); if (! atext.equals ("")) {atext = ชื่อเล่น + ":" + atext; SendToeveryClient (atext); ServerTextArea.Append (atext + "/n"); saytext.settext (""); } else {joptionpane.showMessageHialog (ServerFrame, "เนื้อหาไม่สามารถว่างเปล่า!"); - saybutton.addactionListener (saylistener); saytext.addactionListener (saylistener); } // ไคลเอ็นต์หลายไคลเอนต์คลาสสาธารณะ clienthandler ใช้งาน runnable {bufferedreader breader; ซ็อกเก็ต Asocket; Public ClientHandler (Socket ClientSocket) {ลอง {ASOCKET = ClientSocket; inputStreamReader iSreader = new InputStreamReader (asocket.getInputStream ()); Breader = ใหม่ bufferedReader (isReader); } catch (exception ex) {ex.printstacktrace (); }} @Override โมฆะสาธารณะเรียกใช้ () {ข้อความสตริง; ลอง {ในขณะที่ ((message = breader.readline ())! = null) {sendToEveryClient (ข้อความ); ServerTextArea.Append (ข้อความ + "/n"); }} catch (Exception ex) {ex.printstacktrace (); }}} // วิธีการส่งข้อความไปยังไคลเอนต์ทั้งหมดโมฆะส่วนตัว SendToEveryClient (ข้อความสตริง) {Iterator <PrintWriter> it = clientOutputStreams.iterator (); ในขณะที่ (it.hasnext ()) {ลอง {printwriter writer = (printwriter) it.next (); Writer.println (ข้อความ); Writer.flush (); } catch (exception ex) {ex.printstacktrace (); -GUI Running Screenshot:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น