이 기사의 예제는 참조를위한 Java 채팅실 코드를 공유합니다. 특정 내용은 다음과 같습니다
주로 지식에 관여합니다
・ 이벤트 청취 메커니즘을 포함하여 Java의 GUI 프로그램 작성.
Java Java Network Communication Programming, Serversocket 및 소켓 클래스 사용.
programing 다중 스레드 프로그래밍, 스레드 클래스 및 Java에서 실행 가능한 인터페이스 사용.
소스 코드
고객
패키지 프로젝트 1; java.awt.*; import java.awt.event.*; java.io.*; java.net.*; javax.swing을 가져옵니다.*; 공개 클래스 클라이언트 {private jframe clientframe; 개인 jlabel iplabel; 개인 jlabel portlabel; 개인 Jlabel SaysLabel; 개인 jlabel 니머나 멜라벨; 개인 jtextfield iptext; 개인 Jtextfield 포트 텍스트; 개인 Jtextfield Nicknametext; 개인 jtextfield saystext; 개인 Jbutton ConnectButton; 개인 JBUTTON NICKNAMEBUTTON; 개인 JBUTTON Saysbutton; 개인 JPANEL JPANELNORTH; 개인 JPANEL JPANELSOUTH0; 개인 JPANEL JPANELSOUTH1; 개인 JPANEL JPANELSOUTH2; 개인 jtextArea ClientTextArea; 개인 jscrollpane 스크롤러; 개인 버퍼링 리더 리더; 개인 프린트 라이터 작가; 개인 문자열 별명; public static void main (String args []) {client aclient = new Client (); aclient.startup (); } // 구성 요소를 초기화 공개 클라이언트 () {nickname = "client"; clientFrame = new Jframe (); JPANELNORTH = NEW JPANEL (); iplabel = new Jlabel ( "Server IP", jlabel.left); iptext = New Jtextfield (10); portlabel = new Jlabel ( "서버 포트", jlabel.left); portText = 새로운 jtextfield (10); ConnectButton = New JButton ( "Connection"); ClientTextArea = new JtextArea (); 스크롤러 = 새로운 jscrollpane (clientTextArea); jpanelsouth0 = new jpanel (); jpanelsouth1 = new jpanel (); jpanelsouth2 = 새로운 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 private void buildGui () {// Window ClientFrame.setTitle ( "client")의 설정; 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 (). add (BorderLayout.North, JPANELNORTH); // 중간 구성 요소 ClientTextArea.setFocusable (false); Scroller.setverticalScrollbarpolicy (scrollpaneconstants.vertical_scrollbar_always); Scroller.sethorizontalscrollbarpolicy (scrollpaneconstants.horizontal_scrollbar_never); ClientFrame.getContentPane (). add (BorderLayout.Center, 스크롤러); // 남쪽 지역의 구성 요소 JPANELSOUTH1.ADD (Nicknamelabel); jpanelsouth1.add (nicknametext); jpanelsouth1.add (nicknamebutton); jpanelsouth2.add (saylabel); jpanelsouth2.add (saytext); jpanelsouth2.add (Saybutton); jpanelsouth0.setlayout (New BoxLayout (jpanelsouth0, boxlayout.y_axis)); jpanelsouth0.add (jpanelsouth1); jpanelsouth0.add (jpanelsouth2); ClientFrame.getContentPane (). Add (BorderLayout.South, JPANELSOUTH0); // clientFrame.setVisible (true)을 볼 수 있도록 창을 설정합니다. } // 클라이언트가 공개 void startup () {buildGui (); // 서버 메시지를 수신하는 스레드 runnable incomingReader = new Runnable () {@override public void Run () {문자열 메시지; try {while ((message = reader.readline ())! = null) {clientTextArea.append (message + "/n"); }} catch (예외 예) {ex.printstacktrace (); }}}}; // 서버의 연결을 실현하기 위해 연결 버튼을 듣습니다. connectButton.addactionListener (new ActionListener () {@OverRide public void actionPerformed (actionEvent e) {String aserVerip = iptext.getText (); String aserverport = portText.getText (if (aserVerip.equals) joptionpane.showmessagedialog (ClientFrame, "완전한 IP 및 포트를 입력하십시오!"{@suppresswarnings) 소켓 ClientSocket (aserverip, integer.parseint); BufferedReader (StreamReader). 입력은 정확합니다. ");}}}}}); // 닉네임을 듣고 별명을 설정하고 actionListener Nicknamelistener = new ActionListener () {@override public void ActionPerformed (ActionEvent e) {String atext = nicknametext.getText (); if (! atext.equals ( "")) {nickname = atext; }}}}; nicknamebutton.addactionListener (Nicknamelistener); Nicknametext.addactionListener (Nicknamelistener); nicknametext.addfocusListener (new FocusListener () {@override public void focusteged (focusevent e) {} @override public void focuslost (focusevent e) {string atext = nicknametext.getText (); if (! atext.equals ( ")) {atext;}}); // 서버에 메시지를 보내 actionListener SayListener = New ActionListener () {@override public void ActionPerformed (ActionEvent e) {String atext = saytext.getText (); if (atext.equals ( "")) {joptionpane.showmessagedialog (ClientFrame, "내용이 비어있을 수 없습니다!"); } else {try {writer.println (nickname + ":" + atext); Writer.flush (); } catch (예외) {ex.printstacktrace (); } saytext.settext ( ""); }}}}; saybutton.addactionListener (SayListener); saytext.addactionListener (SayListener); }} 섬기는 사람
패키지 프로젝트 1; java.awt.*; import java.awt.event.*; java.io.*; java.net.*; java.util.arraylist 가져 오기; import java.util.iterator; javax.swing을 가져옵니다.*; 공개 클래스 서버 {private jframe serverframe; 개인 jlabel portlabel; 개인 Jlabel SaysLabel; 개인 jlabel 니머나 멜라벨; 개인 Jtextfield 포트 텍스트; 개인 jtextfield saystext; 개인 Jtextfield Nicknametext; 개인 JBUTTON STARTBUTTON; 개인 JBUTTON Saysbutton; 개인 JBUTTON NICKNAMEBUTTON; 개인 JPANEL JPANELNORTH; 개인 JPANEL JPANELSOUTH0; 개인 JPANEL JPANELSOUTH1; 개인 JPANEL JPANELSOUTH2; 개인 jscrollpane 스크롤러; Private JtextArea ServerTextArea; private arraylist <printwriter> clientOutputStreams; 개인 문자열 별명; public static void main (String [] args) {Server aserver = new Server (); aserver.startup (); } // 구성 요소 공개 서버 () {nickname = "Server"; ServerFrame = new Jframe (); JPANELNORTH = NEW JPANEL (); portlabel = new Jlabel ( "포트", jlabel.left); porttext = new Jtextfield (30); startButton = new JButton ( "시작"); ServerTextArea = New JtextArea (); 스크롤러 = 새로운 jscrollpane (ServerTextArea); Nicknamelabel = New Jlabel ( "닉네임", jlabel.left); Nicknametext = New Jtextfield (닉네임, 30); nicknamebutton = new Jbutton ( "확인"); jpanelsouth0 = new jpanel (); jpanelsouth1 = new jpanel (); jpanelsouth2 = 새로운 jpanel (); saylabel = new Jlabel ( "메시지", jlabel.left); SayText = New Jtextfield (30); SayButton = New JButton ( "확인"); } // 빌드 GUI private void buildGui () {// Window ServerFrame.setTitle ( "Server")의 설정; ServerFrame.SetDefaultCloseOperation (jframe.exit_on_close); ServerFrame.SetSize (550, 550); // 북쪽 지역의 구성 요소 jpanelnorth.add (portlabel); jpanelnorth.add (porttext); jpanelnorth.add (startButton); serverframe.getContentPane (). add (BorderLayout.North, JPANELNORTH); // 중간 구성 요소 ServerTextArea.setFocusable (false); Scroller.setverticalScrollbarpolicy (scrollpaneconstants.vertical_scrollbar_always); Scroller.sethorizontalscrollbarpolicy (scrollpaneconstants.horizontal_scrollbar_never); serverframe.getContentPane (). add (BorderLayout.Center, 스크롤러); // South District의 구성 요소 Jpanelsouth1.add (Nicknamelabel); jpanelsouth1.add (nicknametext); jpanelsouth1.add (nicknamebutton); jpanelsouth2.add (saylabel); jpanelsouth2.add (saytext); jpanelsouth2.add (Saybutton); JPANELSOUTH0.SETLAYOUT (New BoxLayout (jpanelsouth0, boxlayout.y_axis); jpanelsouth0.add (jpanelsouth1); jpanelsouth0.add (jpanelsouth2); serverframe.getContentPane (). add (borderlayout.south, jpanels0); ServerFrame.setVeible (true); (Aport.equals ( "")) {Joptionpane.showMessageGedialog (ServerFrame, "올바른 포트 번호를 입력하십시오!"} else {// runnable serverrunnable = new Runnable) {@override public void run () {serversocket (inteversocket); ServerTextArea.Append ( "클라이언트 연결 대기 .../n") {true) {socket clientsocket = serversocket.accept (); ServerTextArea.Append ( "클라이언트 연결 .../n"); printwriter writer = new printwriter (clientsocket.getoutPutStream ()); ClientOutputStreams.add (Writer); 스레드 t = 새 스레드 (new ClientHandler (clientsocket)); t.start (); }} catch (numberformatexception | ioexception e) {e.printstacktrace (); }}}}; 스레드 serverthread = 새 스레드 (serverrunnable); serverthread.start (); } catch (예외) {ex.printstacktrace (); }}}}}; startButton.AdDactionListener (startListener); porttext.addactionListener (startListener); // 닉네임을 듣고 별명을 설정하고 actionListener Nicknamelistener = new ActionListener () {@override public void ActionPerformed (ActionEvent e) {String atext = nicknametext.getText (); if (! atext.equals ( "")) {nickname = atext; }}}; nicknamebutton.addactionListener (Nicknamelistener); Nicknametext.addactionListener (Nicknamelistener); nicknametext.addfocusListener (new FocusListener () {@override public void focusteged (focusevent e) {} @override public void focuslost (focusevent e) {string atext = nicknametext.getText (); if (! atext.equals ( ")) {atext;}}); // SAY 버튼을 듣고 메시지를 보내십시오 ActionListener SayListener = New ActionListener () {@override public void ActionPerformed (ActionEvent e) {String atext = saytext.getText (); if (! atext.equals ( "")) {atext = nickname + ":" + atext; SendToeveryClient (ATEXT); ServerTextArea.Append (atext + "/n"); saytext.settext ( ""); } else {joptionpane.showmessagedialog (ServerFrame, "내용은 비어있을 수 없습니다!"); }}}}; saybutton.addactionListener (SayListener); saytext.addactionListener (SayListener); } // 멀티 클라이언트 스레드 공개 클래스 클라이언트 핸들러는 런 가능 {bufferedReader breader; 소켓 Asocket; Public ClientHandler (Socket Clientsocket) {try {asocket = clientsocket; inputStreamReader isReader = new inputStreamReader (asocket.getInputStream ()); breader = new bufferedReader (IsReader); } catch (예외) {ex.printstacktrace (); }} @override public void run () {문자열 메시지; try {while ((message = breader.readline ())! = null) {sendtoeveryClient (메시지); ServerTextArea.Append (메시지 + "/n"); }} catch (예외 예) {ex.printstacktrace (); }}} // 모든 클라이언트에 메시지를 보내는 메소드 개인 void sendtoeveryClient (문자열 메시지) {iterator <printwriter> it = clientOutputStreams.iterator (); while (it.hasnext ()) {try {printwriter writer = (printwriter) it.next (); Writer.println (메시지); Writer.flush (); } catch (예외) {ex.printstacktrace (); }}}}GUI 실행 스크린 샷 :
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.