Como preciso criar design de curso de rede de rede de rede e não quero fazer a fiação de rede ou a configuração do roteador LAN, etc., finalmente decidi usar o soquete para escrever uma sala de bate -papo com LAN baseada em Java:
Para obter mais informações sobre o soquete e a programação de rede, consulte meu outro artigo: Programação baseada em soquete Java
O programa é baseado na estrutura C/S, ou seja, no modo do servidor do cliente.
servidor:
O IP padrão é IP nativo
Ambas as partes precisam determinar um número de porta para definir o número máximo de pessoas conectadas. A interface pode ser iniciada e fechada para exibir o usuário e o nome on -line (esta unidade não é exibida aqui)
Cliente:
Precisa definir manualmente o endereço IP do servidor (LAN)
Defina manualmente o número da porta e insira o nome para conectar e desconectar a interface executando o seguinte:
servidor:
Cliente:
Vou fazer o upload do código específico no final.
Existem muitas deficiências no software, como:
Não há otimização de interseção com o banco de dados: todos os usuários podem ser armazenados no banco de dados e os registros de bate -papo também podem ser colocados no banco de dados. A otimização de bate-papo individual não é implementada: ainda existem muitas deficiências no método de redefinir bate-papo individual. Se você estiver interessado nisso, volte e estude lentamente.
A seguir, são seguintes três códigos para o programa:
User.java
Public class Usuário { / *** classe de informações do usuário* usado para gravar informações pessoais do usuário: nome e ip* / nome da string privada; private string ip; usuário público (nome da string, string ip) {this.name = name; this.ip = ip; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public string getip () {return ip; } public void setip (string ip) {this.ip = ip; }}Server_more.java
importar java.awt.borderlayout; importar java.awt.color; importar java.awt.gridlayout; importar java.awt.toolkit; importar java.awt.event.actionEvent; import java.awt.event.eactionListener; importar java.awt.event.event.event.event.wind.wind.wind.wind.wind.EnDowind; java.awt.event.windowEvent; importar java.io.bufferedreader; importar java.io.ioException; importar java.io.inputStreamReader; import java.io.printwriter; importar java.net.bindexception; importação.NET.Al; java.util.stringTokenizer; importar javax.swing.defaultListModel; importar javax.swing.jbutton; importar javax.swing.jframe; importar javax.swing.jlabel; importação; javax.swing.jscrollPane; importar javax.swing.jsplitpane; importar javax.swing.jtextarea; importar javax.swing.jtextfield; importar javax.swing.border.titledborder; classe pública server_more {private jframe frame; Private JTexTarea Contentarea; // campo de texto private jtextfield txt_message; // usado para exibir informações de texto privado jtextfield txt_max; // Defina o número máximo de pessoas conectadas private jtextfield txt_port; // Definir número da porta Private jbutton btn_start; // Botão Iniciar Private JButton btn_stop; // Desconecte o botão privado jbutton btn_send; // Enviar botão Private JPanel Northpanel; // Painel North Painel Private Jpanel Southpanel; // Painel sul Private JScrollPane RightPanel; // Barra de rolagem esquerda Private JScrollPane LeftPanel; // barra de rolagem direita JSplitPane Centersplit; // Linha dividida private JLIST Userlist; // componente único private DefaultListModel listModel; Serversocket ServerSocket privado; Servidor Private ServerThreadThread; Private ArrayList <ClientThread> clientes; private boolean isStart = false; // Método principal, entrada de execução do programa public static void main (string [] args) {new server_more (); } // Execute a mensagem Enviar public void send () {if (! ISSTART) {JoptionPane.ShowMessAgedialog (quadro, "o servidor ainda não começou e a mensagem não pode ser enviada!", "Erro", JoptionPane.error_Message); retornar; } if (clients.size () == 0) {JoptionPane.showMessagedialog (quadro, "nenhum usuário está online, as mensagens não podem ser enviadas!", "Erro", joptionpane.error_message); retornar; } String message = txt_message.getText (). TRIM (); if (message == null || message.equals ("" ")) {joptionpane.showMessagedialog (quadro," mensagem não pode estar vazia! "," Erro ", JoptionPane.error_Message); retornar; } sendServerMessage (mensagem); // Mensagem do servidor de massa contentAea.append ("Server:" + txt_message.getText () + "/r/n"); txt_message.settext (null); } // Construa o método Drop public server_more () {frame = new jframe ("servidor"); // altere o ícone do jframe: //frame.seticonimage(toolkit.getDefaultToolkit().CreateImage(client.class.getResource("qq.png ")); //frame.seticonimage(toolkit.getDefaultToolkit().CreateImage(Server.Class.GetResource("qq.png "))); contentarea = new jtextarea (); contentarea.setEditable (false); contentarea.setforeground (color.blue); txt_message = new jtextfield (); txt_max = new jtextfield ("30"); txt_port = new jtextfield ("6666"); btn_start = new jbutton ("start"); btn_stop = new jbutton ("Stop"); btn_send = new jbutton ("send"); btn_stop.setEnabled (false); listModel = new DefaultListModel (); userlist = new jlist (listmodel); SouthPanel = New JPanel (New BorderLayout ()); SouthPanel.setborder (novo TitledBorder ("Write Message")); SouthPanel.add (txt_message, "centro"); SouthPanel.add (BTN_send, "East"); leftPanel = novo jscrollPane (userlist); leftPanel.setborder (novo título ("usuário online")); RightPanel = New JScrollPane (contentarea); RightPanel.setBorder (novo TitledBorder ("Mensagem Exibir Área")); CentersPlit = novo JSplitPane (jsplitpane.horizontal_split, leftPanel, direita); Centersplit.SetDividerLocation (100); NorthPanel = novo JPanel (); NorthPanel.setLayout (New GridLayout (1, 6)); NorthPanel.add (New Jlabel ("Limite superior")); northpanel.add (txt_max); NorthPanel.add (New Jlabel ("Port")); northpanel.add (txt_port); northpanel.add (btn_start); northpanel.add (btn_stop); NorthPanel.setborder (novo TitledBorder ("Informações de Configuração")); frame.setLayout (new BorderLayout ()); frame.add (Northpanel, "Norte"); frame.add (Centersplit, "Center"); frame.add (SouthPanel, "Sul"); frame.SetSize (600, 400); //frame.setsize(toolkit.getDefaultToolkit (). getScreensize ()); // Definir tela completa int screen_width = Toolkit.getDefaultToolkit (). GetScreensize (). Width; int screen_height = Toolkit.getDefaultToolkit (). getScreensize (). Hight; frame.setLocation ((screen_width - frame.getwidth ()) / 2, (screen_height - frame.getHeight ()) / 2); frame.setVisible (true); // evento ao fechar o quadro da janela.addwindowlistener (new windowAdapter () {public void windowclosing (WindowEvent e) {if (iSStart) {fechoserver (); // fechar o servidor} System.exit (0); // exit programa}}); // Event txt_message.addactionListener (new ActionListener () {public void ActionPormed (ActionEvent e) {send ();}}); // Event btn_send.addactionListener (new ActionListener () {public void ActionPormed (ActionEvent arg0) {send ();}}); // evento BTN_START.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {if (isStart) {JoptionPane.showMessAgedialog (Frame, o servidor já está no estado de inicialização, não começa repetidamente! {max = Integer.parseint (txt_max.getText ()); Inteiro.parseint (txt_port.getText ()); porta + "/r/n"); txt_max.setEnabled (false); txt_port.setEnabled (false); btn_stop.setEnabled (true); } catch (exceção exc) {joptionpane.showMessagedialog (estrutura, exc.getMessage (), "erro", joptionpane.error_message); }}}); // Event btn_stop.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {if (! ISSTART) {JoptionPane.showMessAgedialog (quadro, "o servidor ainda não começou, não precisa parar!", "Error", JOptionPane.error_mess, ainda; btn_start.setEnabled (true); JoptionPane.ShowMessagedialog (Frame, "Exceção ocorreu quando o servidor é interrompido!", "Erro", JoptionPane.error_message); } // Inicie o servidor public void ServerStart (int max, porta int) lança java.net.bindexception {try {clients = new ArrayList <SwenerThread> (); ServerSocket = new ServerSocket (porta); ServerThread = new ServerThread (ServerSocket, Max); serverthread.start (); isStart = true; } catch (bindException e) {isStart = false; lançar nova bindException ("O número da porta foi ocupado, mude -o!"); } catch (Exceção E1) {e1.printStackTrace (); isStart = false; lançar a nova bindException ("Start Server Exception!"); }} // Fechar o servidor @suppresswarnings ("deprecação") public void fecheServer () {try {if (serverThread! = Null) serverThread.stop (); // Pare o thread do servidor para (int iense. clientes.get (i) .getWriter (). println ("Close"); clientes.get (i) .getWriter (). Flush (); // Libere o recurso clientes.get (i) .stop (); // Pare este thread que serve o cliente clientes.get (i) .reader.close (); clientes.get (i) .Writer.Close (); clientes.get (i) .socket.close (); clientes.Remove (i); } if (serversocket! = null) {serverSocket.close (); // fechar a conexão do lado do servidor} listModel.removeallements (); // limpe a lista de usuários isStart = false; } catch (ioexception e) {e.printStackTrace (); isStart = true; }} // mensagem de servidor em massa public void sendServerMessage (string message) {for (int i = clients.size ()-1; i> = 0; i-) {clients.get (i) .getWriter (). Println ("servidor:" + message + "(múltipla envio)"); clientes.get (i) .getWriter (). Flush (); }} // servidor de thread class ServerThread estende Thread {private ServerSocket ServerSocket; private int max; // Número superior de pessoas // Método de construção do servidor Thread Public ServerThread (ServerSocket ServerSocket, int max) {this.serversocket = ServerSocket; this.max = max; } public void run () {while (true) {// continua esperando o link do cliente tente {soket socket = serversocket.accept (); if (clients.size () == max) {// se o número máximo de pessoas tiver sido alcançado buffersader r = new buffarredread (novo inputStreamReader (Socket.getInputStream ())); PrintWriter w = new PrintWriter (soquete .getOutputStream ()); // Receba informações básicas do usuário da string do cliente inf = r.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); Usuário do usuário = novo usuário (St.NextToken (), St.NextToken ()); // Informações de sucesso da conexão com feedback w.println ("max@server: desculpe" + user.getName () + user.getip () + ", o número de pessoas on -line no servidor atingiu o limite superior, tente se conectar mais tarde!"); w.flush (); // libere o recurso r.close (); w.Close (); Socket.Close (); continuar; } ClientThread client = new clientThread (soquete); client.start (); // Inicie os threads para este cliente de atendimento ao cliente.add (cliente); listmodel.addElement (client.getUser (). getName ()); // Atualize a lista on -line Contentarea.append (client.getUser (). getName () + client.getUser (). getip () + "online!/r/n"); } catch (ioexception e) {e.printStackTrace (); }}}}} // Thread Serving uma classe Client ClientThread estende thread {Setorgrafia privada; Reader privado de bufferreader; escritor privado de impressão; usuário privado usuário; public buffarredreader getReader () {return Reader; } public printWriter getWriter () {return writer; } usuário público getUser () {return user; } // Construtor do cliente Thread public clientThread (soquete) {try {this.socket = Socket; leitor = new buffarredread (new inputStreamReader (soquete .getInputStream ())); writer = new PrintWriter (Socket.getOutputStream ()); // Receba informações básicas do usuário da string do cliente inf = leitor.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); usuário = novo usuário (St.NextToken (), St.NextToken ()); // Feedback Connection Success Information Information Writer.println (user.getName () + user.getip () + "conecte -se ao servidor com sucesso!"); writer.flush (); // feedback às informações atuais do usuário on -line se (clients.size ()> 0) {string temp = ""; para (int i = clients.size ()-1; i> = 0; i-) {temp + = (clients.get (i) .getUser (). getName () + "/" + clientes .get (i) .getUser (). getip ()) + "@"; } writer.println ("userlist@" + clients.size () + "@" + temp); writer.flush (); } // Envie o comando online do usuário para todos os usuários on-line para (int i = clients.size ()-1; i> = 0; i-) {clients.get (i) .getWriter (). Println ("add@" + user.getName () + user.getip ()); clientes.get (i) .getWriter (). Flush (); }} catch (ioexception e) {e.printStackTrace (); }} @Suppresswarnings ("deprecação") public void run () {// recebe continuamente mensagens do cliente para processamento. String message = null; while (true) {tente {message = reader.readline (); // recebe mensagens do cliente se (message.equals ("close")) // comando offline {contentarea.append (this.getUser (). getName () + this.getUser (). getip () + "offline!/r/n"); // desconecte e libere recursos leitor.close (); writer.close (); Socket.Close (); // Envie o comando offline do usuário para todos os usuários on-line para (int i = clients.size ()-1; i> = 0; i-) {clients.get (i) .getWriter (). Println ("DELETE@" + user.getName ()); clientes.get (i) .getWriter (). Flush (); } listModel.RemoveElement (user.getName ()); // Atualize a lista on-line // exclua este thread de atendimento ao cliente para (int i = clients.size ()-1; i> = 0; i-) {if (clients.get.get (i) .getUser () == User) {clientThread TEMP = clients.get (i); clientes.remove (i); // excluir o tópico de serviço deste usuário temp.stop (); // interrompe este encadeamento de serviço retornar; }}} else {DispatcheMessage (message); // message forward}} catch (ioexception e) {e.printStackTrace (); }}} // encaminhar mensagem public void DispatcheMessage (string message) {StringTokenizer stringTokenizer = new StringTokenizer (mensagem, "@"); String fonte = stringTokenizer.NextToken (); String proprietário = stringTokenizer.NextToken (); String Content = StringTokenizer.NextToken (); mensagem = fonte + ":" + content; contentarea.append (mensagem + "/r/n"); if (proprietário.equals ("all")) {// em massa para (int i = clients.size ()-1; i> = 0; i-) {clients.get (i) .getWriter (). println (mensagem + "(send múltiplo)"); clientes.get (i) .getWriter (). Flush (); }}}}}}}Client_more.java
importar java.awt.borderlayout; importar java.awt.color; importar java.awt.gridlayout; importar java.awt.toolkit; importar java.awt.event.actionEvent; import java.awt.event.eactionListener; importar java.awt.event.event.event.event.wind.wind.wind.wind.wind.EnDowind; java.awt.event.windowEvent; importar java.io.bufferedReader; importar java.io.ioException; importar java.io.inputStreamReader; importar java.io.printwriter; importar java.net.socket; import java.util.hashap; importar; javax.swing.defaultListModel; importar javax.swing.jbutton; importar javax.swing.jframe; importar javax.swing.jlabel; importar javax.swing.jlist; importação javax.swing.JOPTENPANE; importação.swing.jpanel; importação javax.swing.JOPTENPANE; javax.swing.jsplitpane; importar javax.swing.jtextarea; importar javax.swing.jtextfield; importar javax.swing.border.titledborder; classe pública client_more {private jframe frame; Lista de usuário privada jlist; private JTEXTAREA Textarea; Private JTextfield Textfield; privado jtextfield txt_port; Private JTextField txt_hostip; Private jtextfield txt_name; private JButton btn_start; private JButton btn_stop; private JButton btn_send; private JPanel Northpanel; JPanel privado Southpanel; Private JScrollPane RightsCroll; Private JScrollPane LeftScroll; Centersplit privado jsplitpane; private defaultListModel listModel; Privado booleano isConnected = false; soquete privado soquete; escritor privado de impressão; Reader privado de bufferreader; MessagethRead privado Messagethread; // O tópico responsável por receber mensagens mapa privado <string, usuário> onlineUsers = new hashmap <string, user> (); // todos os usuários on -line // Método principal, entrada do programa public static void main (string [] args) {new client_more (); } // Execute o envio de public void send () {if (! IsConnected) {JoptionPane.ShowMessAgedialog (quadro, "o servidor ainda não foi conectado a ele e a mensagem não pode ser enviada!", "Erro", JoptionPane.error_Message); retornar; } String message = textfield.getText (). TRIM (); if (message == null || message.equals ("" ")) {joptionpane.showMessagedialog (quadro," mensagem não pode estar vazia! "," Erro ", JoptionPane.error_Message); retornar; } sendMessage (frame.getTitle () + "@" + "all" + "@" + mensagem); textfield.settext (nulo); } // construtor public client_more () {textarea = new jtextarea (); textarea.setEditable (false); textarea.setforeground (color.blue); textfield = new jtextfield (); txt_port = new jtextfield ("6666"); txt_hostip = new jtextfield ("127.0.0.1"); txt_name = new jtextfield ("wu chengqian"); btn_start = new jbutton ("conexão"); btn_stop = new jbutton ("Desconect"); btn_send = new jbutton ("send"); listModel = new DefaultListModel (); userlist = new jlist (listmodel); NorthPanel = novo JPanel (); NorthPanel.setLayout (New GridLayout (1, 7)); NorthPanel.add (New Jlabel ("Port")); northpanel.add (txt_port); NorthPanel.add (New Jlabel ("Servidor IP")); northpanel.add (txt_hostip); NorthPanel.add (New Jlabel ("Nome")); northpanel.add (txt_name); northpanel.add (btn_start); northpanel.add (btn_stop); NorthPanel.setborder (novo TitledBorder ("Informações de conexão")); direitoscroll = novo jscrollPane (textarea); direitoscroll.setborder (novo TitledBorder ("Area de exibição de mensagens")); leftScroll = new JScrollPane (UserList); leftScroll.setborder (novo titledborder ("Usuário online")); SouthPanel = New JPanel (New BorderLayout ()); SouthPanel.add (Textfield, "Center"); SouthPanel.add (BTN_send, "East"); SouthPanel.setborder (novo TitledBorder ("Write Message")); Centersplit = novo JSplitPane (jsplitpane.horizontal_split, leftScroll, direitoscroll); Centersplit.SetDividerLocation (100); quadro = novo jframe ("cliente"); // altere o ícone do jframe: // frame.seticeNimage (Toolkit.getDefaultToolkit (). CreateImage (client.class.getResource ("qq.png"))); frame.setLayout (new BorderLayout ()); frame.add (Northpanel, "Norte"); frame.add (Centersplit, "Center"); frame.add (SouthPanel, "Sul"); frame.SetSize (600, 400); int screen_width = Toolkit.getDefaultToolkit (). getScreenSize (). Width; int screen_height = Toolkit.getDefaultToolkit (). getScreensize (). Hight; frame.setLocation ((screen_width - frame.getwidth ()) / 2, (screen_height - frame.getHeight ()) / 2); frame.setVisible (true); // Evento ao pressionar Enter na caixa de texto para escrever a mensagem textfield.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent arg0) {send ();}}); // Event btn_send.addactionListener (new ActionListener () {public void ActionPormed (ActionEvent e) {send ();}}); // Event btn_start.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {int porta; if (isConnected) {JoptionPane.showMessagedialog (quadro, "já está na conexão, não repetem a conexão! Inteiro.parseint (txt_port.getText (). Trim ()); hostip.equals (" JoptionPane.ShowMessagedialog (Frame, Exc.GetMessage (), "Erro", JoptionPane.error_message); }}}); // Event btn_stop.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {if (! IsConnected) {JoptionPane.showMessagedialOg (Frame ", já está em um estado desconectado, não é necessário desligar -se repetidamente!", "Error" "; = ClosConnection (); // Desconecte if (sinalizador == false) {LONGO NOVA EXCEÇÃO ("Exceção ocorreu ao desconectar!"); JoptionPane.error_message); // evento ao fechar o quadro da janela.addwindowlistener (new windowAdapter () {public void windowclosing (windowEvent e) {if (isConnected) {closeConnection (); // fechar a conexão} System.exit (0); // exit o programa}}); }/ ** * conecte -se ao servidor * * @param porta * @param hostip * @param nome */ public boolean ConnectServer (porta int, string hostip, nome da string) {// conecte -se ao servidor Try {Socket = new Socket (hostip, porta); leitor = new buffarredread (new inputStreamReader (soquete .getInputStream ())); // Envie informações básicas do usuário do cliente (nome do usuário e endereço IP) sendMessage (nome + "@" + soket.getLocaladdress (). Tostring ()); // Abra o thread para receber mensagens messagethRead = new Messagethread (leitor, textarea); messagethread.start (); isConnected = true; // foi conectado ao retorno true; } catch (Exceção e) {textAea.append ("O servidor com número da porta:" + porta + "endereço IP:" + hostip + "falhou!" + "/r/n"); isConnected = false; // retorna false em não conectado; }} / ** * Enviar mensagem * * @param mensagem * / public void sendMessage (string message) {writer.println (mensagem); writer.flush (); }/ *** O cliente fecha ativamente a conexão*/ @suppresswarnings ("depreciação") public sincronizado booleano ClosConnection () {try {sendMessage ("Close"); // Enviar o comando de desconect (release para o servidor Messagethread.stop (); // Stop. } if (writer! = null) {writer.close (); } if (soquete! = null) {socket.close (); } isConnected = false; retornar true; } catch (ioexception e1) {e1.printStackTrace (); isConnected = true; retornar falso; }} // Thread que recebe constantemente mensagens classe Messagethread estende o thread {Private BufferErader Reader; private JTEXTAREA Textarea; // Método de construção para receber o thread da mensagem public MessagethRead (leitor de bufferreader, jtextarea textarea) {this.reader = leitor; this.TexTarea = textarea; } // Fechar passivamente a conexão public sincronizada void closecon () lança a exceção {// limpe o usuário listmodel.removeallelements (); // Feche passivamente a conexão e libere o recurso se (leitor! = Null) {reader.close (); } if (writer! = null) {writer.close (); } if (soquete! = null) {socket.close (); } isConnected = false; // modifique o status para desconectar} public void run () {string message = ""; while (true) {try {message = reader.readline (); StringTokenizer stringTokenizer = new StringTokenizer (mensagem, "/@"); String command = stringTokenizer.NextToken (); // command if (command.equals ("close")) // comando fechado do servidor {textarea.append ("servidor fechado!/R/n"); ClosCon (); // Fechar passivamente a conexão retornar; // encadeamento final} else if (command.equals ("add")) {// Alguns usuários estão atualizando a lista online string userName = ""; String userip = ""; if ((nome de usuário = stringTokenizer.NextToken ())! = null && (userip = stringTokenizer.NextToken ())! = null) {user user = new User (nome de usuário, usuário); onlineUsers.put (nome de usuário, usuário); listmodel.addElement (nome de usuário); }} else if (command.equals ("delete")) {// Alguns usuários estão ditando a lista on -line string userName = stringTokenizer.NextToken (); Usuário do usuário = (usuário) onlineUsers.get (nome de usuário); onlineUsers.Remove (usuário); listModel.RemoveElement (nome de usuário); } else if (command.equals ("userlist")) {// carrega a lista de usuários online int size = integer .parseint (stringTokenizer.NextToken ()); String nome de usuário = null; String userip = null; for (int i = 0; i <tamanho; i ++) {nome de usuário = stringTokenizer.NextToken (); userip = stringTokenizer.NextToken (); Usuário do usuário = novo usuário (nome de usuário, usuário); onlineUsers.put (nome de usuário, usuário); listmodel.addElement (nome de usuário); }} else if (command.equals ("max")) {// o número de pessoas atingiu o limite superior textarea.append (stringTokenizer.NextToken () + stringTokenizer.nextToken () + "/r/n"); ClosCon (); // Feche passivamente a conexão JoptionPane.showMessagedialog (quadro, "O buffer do servidor está cheio!", "Erro", joptionpane.error_message); return; // encadeamento final} else {// mensagem normal textarea.append (mensagem + "/r/n"); }} catch (ioexception e) {e.printStackTrace (); } catch (Exceção e) {e.printStackTrace (); }}}}}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.