네트워크 컴퓨터 네트워크 코스 디자인을 만들어야하고 네트워크 배선 또는 LAN 라우터 구성 등을 만들고 싶지 않기 때문에 마침내 소켓을 사용하여 Java를 기반으로 LAN 대화방을 작성하기로 결정했습니다.
소켓 및 네트워크 프로그래밍에 대한 자세한 내용은 다른 기사를 참조하십시오 : Java 소켓 기반 프로그래밍
이 프로그램은 C/S 구조, 즉 클라이언트 서버 모드를 기반으로합니다.
섬기는 사람:
기본 IP는 기본 IP입니다
양 당사자는 연결된 최대 인원 수를 설정하려면 포트 번호를 결정해야합니다. 온라인 사용자와 이름을 표시하기 위해 인터페이스를 시작하고 닫을 수 있습니다 (이 장치는 여기에 표시되지 않음)
고객:
서버 IP 주소 (LAN)를 수동으로 설정해야합니다.
포트 번호를 수동으로 설정하고 이름을 입력하여 다음과 같이 프로그램 실행 인터페이스를 연결하고 분리하십시오.
섬기는 사람:
고객:
마지막에 특정 코드를 업로드하겠습니다.
소프트웨어에는 다음과 같은 많은 단점이 있습니다.
데이터베이스와의 교차 최적화는 없습니다. 모든 사용자는 데이터베이스에 저장 될 수 있으며 채팅 레코드는 데이터베이스에 배치 할 수도 있습니다. 일대일 채팅 최적화는 구현되지 않습니다. 일대일 채팅을 재정의하는 방법에는 여전히 많은 단점이 있습니다. 관심이 있으시면 돌아와서 천천히 공부하십시오.
다음은 프로그램의 세 가지 코드입니다.
user.java
공개 클래스 사용자 { / *** 사용자 정보 클래스* 사용자 개인 정보를 기록하는 데 사용됩니다 : 이름 및 ip* / 개인 문자열 이름; 개인 문자열 IP; 공개 사용자 (문자열 이름, 문자열 IP) {this.name = 이름; this.ip = ip; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getIP () {return IP; } public void setip (String IP) {this.ip = ip; }}server_more.java
import java.awt.borderlayout; import java.awt.color; import java.awt.gridlayout; import java.awt.toolkit; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowadapter; java.awt.event.windowevent; import java.io.bufferedReader; import java.io.ioException; import java.io.inputStreamReader; import java.io.printwriter; import java.net.bindexcept; import java.net.serversocket; import java.net.socket; java.util.stringtokenizer; import javax.swing.defaultlistmodel; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jlist; import javax.swing.joptionpane; import javax.swing.jpanel javax.swing.jscrollpane; import javax.swing.jsplitpane; import javax.swing.jtextArea; import javax.swing.jtextfield; import javax.swing.border.titredborder; public server_more {private jframe frame; 개인 jtextArea contentArea; // 텍스트 필드 개인 jtextfield txt_message; // 텍스트 정보를 표시하는 데 사용되는 개인 jtextfield txt_max; // 연결된 최대 사람 수를 설정합니다. // 포트 번호 설정 개인 JBUTTON BTN_START; // 시작 버튼 개인 JBUTTON BTN_STOP; // 개인 JBUTTON BTN_SEND 개인 버튼을 분리합니다. // 전송 버튼 개인 jpanel Northpanel; // North Panel Private Jpanel Southpanel; // 사우스 패널 개인 JSCrollPane RightPanel; // 왼쪽 스크롤 바 개인 jscrollpane leftpanel; // 오른쪽 스크롤 바 개인 jsplitpane centersplit; // 분할 라인 개인 JLIST 사용자리스트; // 단일 구성 요소 private defaultListModel ListModel; 개인 서버 소켓 서사 소켓; private serverthread serverthread; Private ArrayList <ClientThread> 클라이언트; 개인 부울 isstart = false; // 기본 메소드, 프로그램 실행 항목 공개 정적 무효 메인 (String [] args) {new Server_more (); } // 메시지 execute 메시지 보내기 공개 void send () {if (! isstart) {joptionpane.showmessagedialog (프레임, "서버가 아직 시작되지 않았으며 메시지를 보낼 수 없습니다!", "error", joptionpane.error_message); 반품; } if (clients.size () == 0) {joptionpane.showMessageDialog ( "프레임,"사용자가없고 온라인 상태가없고 메시지를 보낼 수 없습니다! ","오류 ", joptionpane.error_message); 반품; } 문자열 메시지 = txt_message.getText (). trim (); if (message == null || message.equals ( "")) {joptionpane.showMessageDialog (프레임, "message!", "error", joptionpane.error_message); 반품; } sendServerMessage (messag txt_message.settext (null); } // 드롭 메소드 구성 방법 public server_more () {frame = new Jframe ( "Server"); // jframe의 아이콘을 변경합니다 : //frame.seticonimage(toolkit.getDefaultToolkit().createimage(class.getResource("qq.png ")))); //frame.seticonimage(toolkit.getDefaultToolkit().createimage(server.class.getresource("qq.png "))); contentArea = new jtextArea (); contentArea.setEdable (false); contentArea.setforeground (color.blue); txt_message = new Jtextfield (); txt_max = 새로운 jtextfield ( "30"); txt_port = 새로운 jtextfield ( "6666"); btn_start = new Jbutton ( "시작"); btn_stop = new Jbutton ( "stop"); btn_send = new Jbutton ( "Send"); btn_stop.setenabled (false); ListModel = 새 defaultListModel (); userList = new JList (ListModel); Southpanel = New JPanel (New BorderLayout ()); Southpanel.Setborder (새로운 제목의 보더 ( "Write Message")); Southpanel.add (txt_message, "center"); Southpanel.add (btn_send, "East"); LeftPanel = 새로운 jscrollpane (userlist); LEFTPANEL.SETBORDER (새로운 제목의 보더 ( "온라인 사용자")); RightPanel = 새로운 jscrollpane (contentArea); RightPanel.SetBorder (새로운 제목의 보더 ( "메시지 디스플레이 영역"); CENTERSPLIT = NEW JSPLITPANE (JSPLITPANE.HORIZONTAL_SPLIT, LEFTPANEL, RIGHTPANEL); CenterSplit.SetDividerLocation (100); NorthPanel = 새로운 jpanel (); NorthPanel.SetLayout (New GridLayout (1, 6)); NorthPanel.add (New Jlabel ( "상한")); NorthPanel.add (txt_max); NorthPanel.add (New Jlabel ( "Port")); NorthPanel.add (txt_port); NorthPanel.add (btn_start); NorthPanel.add (btn_stop); NorthPanel.Setborder (New 제목의 보더 ( "구성 정보")); frame.setLayout (New BorderLayout ()); frame.add (Northpanel, "North"); frame.add (Centersplit, "Center"); frame.add (Southpanel, "South"); frame.setsize (600, 400); //frame.setsize(ToolKit.getDefaultToolKit (). getScreensize ()); // 전체 화면 설정 int screen_width = toolkit.getDefaultToolKit (). getScreensize (). 너비; int screen_height = toolkit.getDefaultToolKit (). getScreensize (). 높이; frame.setLocation ((screen_width -frame.getWidth ()) / 2, (screen_Height -Getheight ()) / 2); frame.setVisible (true); // 창 프레임을 닫을 때의 이벤트 .addwindowListener (new WindowAdapter () {public void WindowClosing (windowevent e) {if (isstart) {closeServer (); // 서버} system.exit (0); // exit program}); // event txt_message.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {send ();}}); // event btn_send.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent Arg0) {send ();}}); // event btn_Start.AdDactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {if (isstart) {joptionpane.showMessagedIalog (프레임, "서버는 이미 시작 상태에 있습니다. max = integer.parseint (txt_max.gettext ())}} 새로운 예외는 (긍정적 인 정수입니다!}) (Max <= 0); } catch (예외는 새로운 예외입니다!}}} {포트 번호는 긍정적 인 정수입니다!} serverStart (max, port); joptionpane.showmessagedialog (프레임, "서버가 성공적으로 시작되었습니다!"); txt_max.setenabled (false); txt_port.setenabled (false); btn_stop.setenabled (true); } catch (Exception exc) {joptionpane.showMessagedIalog (frame, exc.getMessage (), "error", joptionpane.error_message); }}}); // event btn_stop.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {if (! isstart) {joptionpane.showmessagedialog (프레임, "서버가 아직 시작되지 않았습니다!", "오류", joptionpane.error_message (joptionpane.error_message); BTN_START.SETERNABLE (txt_port.setEnabled) (false); joptionpane.showmessagedialog (프레임, "서버가 중지 될 때 예외가 발생했습니다!", "error", joptionpane.error_message); } // 서버 시작 공개 void ServerStart (int max, int port)는 java.net.bindexception {try {clients = new arraylist <clientthread> (); serversocket = 새로운 서버 소켓 (포트); Serverthread = new ServerThread (serversocket, max); serverthread.start (); isstart = true; } catch (bindexception e) {isstart = false; 새로운 bindexception을 던지십시오 ( "포트 번호가 점유되어 변경 해주세요!"); } catch (예외 e1) {e1.printstacktrace (); isstart = false; 새로운 bindexception을 던지십시오 ( "시작 서버 예외!"); }} // 서버 @suppresswarnings ( "감가 상각") public void closeServer () {try (serverthread! = null) serverthread.stop (); // (int i = clients.size ()-1; i> = 0; i-) {// intrintln (i). clients.get (i) .getWriter (). flush (); // resource clients.get (i) .Stop (); //이 스레드를 정지하여 클라이언트 클라이언트를 제공합니다. (i) .Reader.close (); clients.get (i) .writer.close (); clients.get (i) .socket.close (); 클라이언트 .remove (i); } if (serverSocket! = null) {serversocket.close (); // 서버 측 연결을 닫습니다} listModel.removealLelements (); // 사용자 목록을 지우는 isstart = false; } catch (ioexception e) {e.printstacktrace (); isstart = true; }} // 벌크 서버 메시지 public void sendservermessage (string message) {for (int i = clients.size () -1; i> = 0; i-) {clients.get (i) .println ( "server :" + message + "(multiple send)"); clients.get (i) .getWriter (). flush (); }} // Server 스레드 클래스 ServerThread는 스레드를 확장합니다. private int max; // 인력의 상위 // 서버 스레드 구성 메소드 공개 서버 스레드 (serversocket serversocket, int max) {this.serversocket = serversocket; this.max = max; } public void run () {while (true) {// 클라이언트 링크를 계속 기다리십시오 {socket socket = serversocket.accrect (); if (clients.size () == max) {// 사람의 최대 수에 도달 한 경우 bufferedReader r = new bufferedReader (new inputStreamReader (socket.getInputStream ())); printwriter w = new printwriter (socket .getoutPutStream ()); // 클라이언트로부터 기본 사용자 정보를받습니다. String inf = r.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); 사용자 user = 새 사용자 (st.nextToken (), St.NextToken ()); // 피드백 연결 성공 정보 W.println ( "max@server : 죄송합니다." + user.getName () + user.getIP () + ", 서버의 온라인 사람들의 수는 상한에 도달했습니다. 나중에 연결 해보십시오!"); w.flush (); // 리소스 r.Close ()를 해제합니다. w.close (); socket.close (); 계속하다; } clientTheRdread Client = 새 ClientThread (Socket); client.start (); //이 클라이언트 서비스 클라이언트의 스레드를 시작합니다 .add (client); listModel.AdDelement (client.getUser (). getName ()); // 온라인 목록 contentArea.Append (client.getUser (). getName () + client.getUser (). getIP () + "온라인!/r/n"); } catch (ioexception e) {e.printstacktrace (); }}}}} // 클라이언트 클래스를 서빙하는 스레드 클라이언트는 스레드 {private socket socket; 개인 버퍼링 리더 리더; 개인 프린트 라이터 작가; 개인 사용자 사용자; public bufferedReader getReader () {return Reader; } public printwriter getwriter () {return Writer; } public user getUser () {return user; } // 클라이언트 스레드의 생성자 public clientthread (소켓 소켓) {try {this.socket = socket; reader = new bufferedReader (new inputStreamReader (socket .getInputStream ())); Writer = New PrintWriter (socket.getOutputStream ()); // 클라이언트에서 기본 사용자 정보를받습니다. String inf = reader.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); user = new user (st.nextToken (), St.NextToken ()); // 피드백 연결 성공 정보 writer.println (user.getName () + user.getIP () + "서버에 성공적으로 연결!"); Writer.flush (); // 현재 온라인 사용자 정보에 대한 피드백 if (clients.size ()> 0) {String temp = ""; for (int i = clients.size () -1; i> = 0; i-) {temp + = (clients.get (i) .getUser (). getName () + "/" + clients .get (i) .getUser (). getIP ()) + "@"; } writer.println ( "userList@" + clients.size () + "@" + temp); Writer.flush (); } // (int i = clients.size () -1; i> = 0; i-) {clients.get (i) .getWriter (). println ( "add@" + user.getname () + user.getip ())에 대해 온라인 명령을 모든 온라인 사용자에게 전송합니다. clients.get (i) .getWriter (). flush (); }} catch (ioexception e) {e.printstacktrace (); }} @suppresswarnings ( "감가 상각") public void run () {// 처리를 위해 클라이언트로부터 메시지를 계속받습니다. 문자열 메시지 = null; while (true) {try {message = reader.readline (); // 클라이언트 메시지 수신 if (message.equals ( "close")) // 오프라인 명령 {contentArea.append (this.getUser (). getName () + this.getUser (). getIP () + "오프라인!/r/n"); // 리소스를 분리하고 릴리스 reader.close (); Writer.close (); socket.close (); // (int i = clients.size () -1; i> = 0; i-) {clients.get (i) .getWriter (). println ( "delete@" + user.getName ())에 대해 사용자의 오프라인 명령을 모든 온라인 사용자에게 보냅니다. clients.get (i) .getWriter (). flush (); } listModel.removeElement (user.getName ()); // 온라인 목록 업데이트 //이 클라이언트 서비스 스레드 (int i = clients.size () -1; i> = 0; i-) {if (clients.get (i) .getUser () == 사용자) {clientthread temp = clients (i); clients.remove (i); //이 사용자의 서비스 스레드 temp.stop (); //이 서비스 스레드 리턴을 중지합니다. }}} else {dispatcherMessage (messag }}} // 전달 메시지 public void dispatcherMessage (문자열 메시지) {StringTokenizer StringTokenizer = new StringTokenizer (메시지, "@"); 문자열 소스 = StringTokenizer.nextToken (); 문자열 소유자 = StringTokenizer.nextToken (); 문자열 content = StringTokenizer.nextToken (); Message = source + ":" + 내용; contentArea.Append (메시지 + "/r/n"); if (older.equals ( "all")) {// bulk for (int i = clients.size () -1; i> = 0; i-) {clients.get (i) .getwriter (). println (Message + "(Multiple Send)"); clients.get (i) .getWriter (). flush (); }}}}}}}}client_more.java
import java.awt.borderlayout; import java.awt.color; import java.awt.gridlayout; import java.awt.toolkit; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowadapter; java.awt.event.windowevent; import java.io.bufferedReader; import java.io.ioException; import java.io.inputStreamReader; import java.io.printwriter; import java.net.socket; import java.util.hashmap; import java.utok.utok.utok.map; java.util javax.swing.defaultlistmodel; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jlist; import javax.swing.joptionpane; import javax.swing.jpanel; javax.swing.jscrollpane; javax.swing.jsplitpane; import javax.swing.jtextArea; import javax.swing.jtextfield; import javax.swing.border.titredborder; public client_more {private jframe frame; 개인 JLIST 사용자리스트; 개인 jtextArea textRea; 개인 Jtextfield Textfield; 개인 jtextfield txt_port; 개인 jtextfield txt_hostip; 개인 jtextfield txt_name; 개인 JBUTTON BTN_START; 개인 JBUTTON BTN_STOP; 개인 JBUTTON BTN_SEND; 개인 JPANEL NORTHPANEL; 개인 JPANEL SOUTHPANEL; 개인 jscrollpane 권리 크롤; 개인 jscrollpane leftscroll; 개인 jsplitpane centersplit; private defaultListModel ListModel; 개인 부울 isconnected = false; 개인 소켓 소켓; 개인 프린트 라이터 작가; 개인 버퍼링 리더 리더; Private MessagetHread MessageThread; // 메시지 수신 스레드 프리즈 맵 <string, user> onlineusers = new hashmap <string, user> (); // 모든 온라인 사용자 // 프로그램 입력 공개 정적 void main (string [] args) {new Client_More (); } // public void void () {if (! isconnected) {joptionpane.showmessagedialog ( "프레임,"서버가 아직 연결되지 않았으며 메시지를 보낼 수 없습니다! ","error ", joptionpane.error_message); 반품; } 문자열 메시지 = textfield.getText (). trim (); if (message == null || message.equals ( "")) {joptionpane.showMessageDialog (프레임, "message!", "error", joptionpane.error_message); 반품; } sendMessage (frame.getTitle () + "@" + "all" + "@" + 메시지); textfield.settext (null); } // 생성자 public client_more () {textArea = new jtextArea (); textArea.setEditable (false); TextArea.setforeground (color.blue); Textfield = New Jtextfield (); txt_port = 새로운 jtextfield ( "6666"); txt_hostip = new Jtextfield ( "127.0.0.1"); txt_name = New Jtextfield ( "Wu Chengqian"); btn_start = new Jbutton ( "Connection"); btn_stop = new Jbutton ( "분리"); btn_send = new Jbutton ( "Send"); ListModel = 새 defaultListModel (); userList = new JList (ListModel); NorthPanel = 새로운 jpanel (); NorthPanel.SetLayout (New GridLayout (1, 7)); NorthPanel.add (New Jlabel ( "Port")); NorthPanel.add (txt_port); NorthPanel.add (New Jlabel ( "Server IP")); NorthPanel.add (txt_hostip); NorthPanel.add (New Jlabel ( "name")); NorthPanel.add (txt_name); NorthPanel.add (btn_start); NorthPanel.add (btn_stop); NorthPanel.Setborder (새로운 제목의 보더 ( "연결 정보")); 권리 크롤 = 새로운 jscrollpane (textarea); PrillingCroll.SetBorder (New 제목의 보더 ( "메시지 디스플레이 영역"); leftscroll = 새로운 jscrollpane (userlist); leftscroll.setborder (새로운 제목의 보더 ( "온라인 사용자")); Southpanel = New JPanel (New BorderLayout ()); Southpanel.add (Textfield, "Center"); Southpanel.add (btn_send, "East"); Southpanel.Setborder (새로운 제목의 보더 ( "Write Message")); CENTERSPLIT = NEW JSPLITPANE (JSPLITPANE.HORIZONTAL_SPLIT, LEFTSCROLL, PRISSERCROLL); CenterSplit.SetDividerLocation (100); frame = new Jframe ( "클라이언트"); // jframe의 아이콘을 변경합니다 : // frame.seticonimage (툴킷 .getDefaultToolKit (). createImage (client.class.getResource ( "qq.png"))); frame.setLayout (New BorderLayout ()); frame.add (Northpanel, "North"); frame.add (Centersplit, "Center"); frame.add (Southpanel, "South"); frame.setsize (600, 400); int screen_width = toolkit.getDefaultToolKit (). getScreensize (). 너비; int screen_height = toolkit.getDefaultToolKit (). getScreensize (). 높이; frame.setLocation ((screen_width -frame.getWidth ()) / 2, (screen_Height -Getheight ()) / 2); frame.setVisible (true); // 메시지를 쓸 때 이벤트 textfield.addactionListener (new ActionListener () {public void actionPerformed (ActionEvent arg0) {send ();}}); // event btn_send.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {send ();}}); // event btn_Start.AdDactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {int port; if (isconnected) {joptionpane.showMessagedIalog (프레임, 이미 연결 중이며, 연결을 반복하지 않습니다! ", joptionpane.error_message); integer.parseint (txt_port.getText ())} CATCH (NumberFormateXception e2) { "포트 번호는 정수입니다!") hostip.equals ( "") {이름과 서버 IP가 비어있을 수 있습니다! joptionpane.showmessagedialog (frame, exc.getMessage (), error ", joptionpane.error_message); // event btn_Stop.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {if (! isconnected) {joptionpane.showMessagedialog (프레임, 이미 분리 된 상태에 있지 않으며, 반복적으로 연결하지 않음! ", joptionpane.error_message); CloseConnection (); // if (flage == false) { "예외는 분리 될 때 발생했습니다!" }}}); // 창 프레임을 닫을 때의 이벤트 .addwindowListener (새 WindowAdapter () {public void windowclosing (windowevent e) {if (isconnected) {closeConnection (); // 연결} system.exit (0); // 프로그램 종료}); }/ ** * 서버에 연결 * * @param port * @param hostip * @param name */ public boolean connectserver (int port, string hostip, string name) {// 서버에 연결하려면 {socket = new Socket (hostip, port); // 서버를 기준으로 연결을 설정합니다. reader = new bufferedReader (new inputStreamReader (socket .getInputStream ())); // 클라이언트 사용자의 기본 정보 (사용자 이름 및 IP 주소) sendMessage (이름 + "@" + " + socket.getLocalAddress (). toString ()); // 메시지를 받기 위해 스레드를 열면 messagethread = new Messagethread (Reader, Textarea); MessageThread.start (); isconnected = true; //는 true를 반환하기 위해 연결되었습니다. } catch (예외 e) {textArea.Append ( "포트 번호가있는 서버 :" + port + "IP 주소 :" + hostip + "실패!" + "/r/n"); isconnected = false; // 연결되지 않은 경우 false를 반환합니다. }} / ** * 메시지 보내기 * * @param 메시지 * / public void sendMessage (문자열 메시지) {writer.println (메시지); Writer.flush (); }/ *** 클라이언트는 연결을 적극적으로 닫습니다*/ @suppresswarnings ( "감가 상각") 공개 동기화 된 boolean closeConnection () {try {sendMessage ( "close"); // 서버로 연결 명령 보내기 명령을 서버로 보내는 메시지 스레드를 중지 // resource resource if (reader! = null). } if (writer! = null) {writer.close (); } if ((null) {socket.close (); } isconnected = false; 진실을 반환하십시오. } catch (ioexception e1) {e1.printstacktrace (); isconnected = true; 거짓을 반환합니다. }} // 끊임없이 메시지를 수신하는 스레드 클래스 MessagetHread는 스레드 {private bufferedReader reader; 개인 jtextArea textRea; // 메시지 수신을위한 구성 메소드 스레드 공개 messagethread (bufferedReader reader, jtextArea textRea) {this.Reader = reader; this.textArea = textRea; } // 연결을 수동적으로 닫습니다 public synchronized void closecon ()은 예외를 던집니다. {// 사용자 listModel.removealLeLements (); // 연결을 수동적으로 닫고 리소스를 릴리스하면 (reader! = null) {reader.close (); } if (writer! = null) {writer.close (); } if ((null) {socket.close (); } isconnected = false; // 분리를 위해 상태를 수정} public void run () {String Message = ""; while (true) {try {message = reader.readline (); StringTokenizer StringTokenizer = New StringTokenizer (메시지, "/@"); String Command = StringTokenizer.nextToken (); // command if (command.equals ( "close")) // 서버 closed 명령 {textArea.append ( "Server Close!/r/n"); CloseCon (); // 연결 반환을 수동적으로 닫으십시오; // end Thread} else if (command.equals ( "add")) {// 일부 사용자가 온라인 목록 string username = ""를 업데이트하고 있습니다. 문자열 userip = ""; if ((username = stringtokenizer.nextToken ())! = null && (userip = stringtokenizer.nextToken ())! = null) {user user = 새 사용자 (username, userip); onlineusers.put (사용자 이름, 사용자); ListModel.AdDelement (사용자 이름); }} else if (command.equals ( "delete")) {// 일부 사용자는 온라인 목록 문자열 username = StringTokenizer.nextToken (); 사용자 user = (사용자) onlineusers.get (username); onlineusers.remove (사용자); ListModel.removeElement (사용자 이름); } else if (command.equals ( "userList")) {// 온라인 사용자 목록 int size = integer (stringTokenizer.nextToken ()); 문자열 username = null; 문자열 userip = null; for (int i = 0; i <size; i ++) {username = stringtokenizer.nextToken (); userip = stringtokenizer.nextToken (); 사용자 user = 새 사용자 (username, userip); onlineusers.put (사용자 이름, 사용자); ListModel.AdDelement (사용자 이름); }} else if (command.equals ( "max")) {// 사람의 수가 상한선 textRea.Append (StringTokenizer.nextToken () + StringToken.nextToken () + "/r/n")에 도달했습니다. closecon (); // 연결을 수동적으로 닫습니다. return; // end Thread} else {// 일반 메시지 textArea.Append (메시지 + "/r/n"); }} catch (ioexception e) {e.printstacktrace (); } catch (예외 e) {e.printstacktrace (); }}}}}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.