老师说,UDP也要。于是有了这个程序。
这个程序比起之前的基于TCP协议的聊天室程序可是简单的多了。没有任何用户管理,仅限两人使用。因为验收的时候是本机演示,所以很简单地用了UDP监听localhost的两个不同端口,就可以实现伪聊天了。
上次TCP程序的用户管理是基于TCP协议必须确认连接的特性而做的,而UDP没有这个特性,只是盲目地发包。所以我也不太好做用户管理。
下面是代码。这次代码没有严格的分开底层和GUI。因为很简单的。GUI依旧是netbeans生成,所以比较混乱。
另外,这个其实根本不分c/s的,A端和B端只不过发送端口和监听端口互换而已。
A端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.net.*; import java.util.logging.Level; import java.util.logging.Logger; public class ServerGUI extends javax.swing.JFrame { /** Creates new form ServerGUI */ public ServerGUI() { initComponents(); } private int port; private InetAddress address; private DatagramSocket Sender; private DatagramPacket SendPacket; private Listener listener; public void ServerStart() { try { Sender = new DatagramSocket(); listener = new Listener(); listener.start(); } catch (SocketException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } } public void ServerStop() { Sender.close(); listener.ListenerClose(); } public void SendMsg(String msg, String host) { byte[] b = msg.getBytes(); String test = new String(b); System.out.println(test); try { address = InetAddress.getByName(host); SendPacket = new DatagramPacket(b, b.length); SendPacket.setAddress(address); SendPacket.setPort(1990); Sender.send(SendPacket); } catch (UnknownHostException ex) { Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ioe) { ioe.printStackTrace(); } } class Listener extends Thread { private DatagramSocket Reciever; private DatagramPacket RecievePacket; private boolean active = false; public void ListenerClose() { active = false; } public Listener() { try { Reciever = new DatagramSocket(1989); active = true; } catch (SocketException ex) { Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex); } } public void run() { try { while (active) { RecievePacket = new DatagramPacket(new byte[256], 256); Reciever.receive(RecievePacket); String s = new String(RecievePacket.getData()); msgArea.append(s + '\n'); } Reciever.close(); } catch (SocketException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); msgArea = new javax.swing.JTextArea(); msgField = new javax.swing.JTextField(); SendButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("A"); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); msgArea.setColumns(20); msgArea.setRows(5); jScrollPane1.setViewportView(msgArea); SendButton.setText("发送"); SendButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { SendButtonMouseClicked(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(msgField, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) .addGap(18, 18, 18) .addComponent(SendButton)) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 313, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(msgField, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(SendButton)) .addContainerGap(49, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void SendButtonMouseClicked(java.awt.event.MouseEvent evt) { String msg = msgField.getText(); msg = "A: " + msg; SendMsg(msg, "localhost"); msgArea.append(msg + '\n'); msgField.setText(""); } private void formWindowClosing(java.awt.event.WindowEvent evt) { ServerStop(); System.out.println("Server closed normally"); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ServerGUI server = new ServerGUI(); server.setVisible(true); server.ServerStart(); } }); } // Variables declaration - do not modify private javax.swing.JButton SendButton; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea msgArea; private javax.swing.JTextField msgField; // End of variables declaration } |
B端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import java.io.*; import java.net.*; import java.util.logging.Level; import java.util.logging.Logger; public class ClientGUI extends javax.swing.JFrame { /** Creates new form ServerGUI */ public ClientGUI() { initComponents(); } private int port; private InetAddress address; private DatagramSocket Sender; private DatagramPacket SendPacket; private Listener listener; public void ServerStart() { try { Sender = new DatagramSocket(); listener = new Listener(); listener.start(); } catch (SocketException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } } public void ServerStop() { Sender.close(); listener.ListenerClose(); } public void SendMsg(String msg, String host) { byte[] b = msg.getBytes(); try { address = InetAddress.getByName(host); SendPacket = new DatagramPacket(b, b.length); SendPacket.setAddress(address); SendPacket.setPort(1989); Sender.send(SendPacket); } catch (UnknownHostException ex) { Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ioe) { ioe.printStackTrace(); } } class Listener extends Thread { private DatagramSocket Reciever; private DatagramPacket RecievePacket; private boolean active = false; public void ListenerClose() { active = false; } public Listener() { try { Reciever = new DatagramSocket(1990); active = true; } catch (SocketException ex) { Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex); } } public void run() { try { while (active) { RecievePacket = new DatagramPacket(new byte[256], 256); Reciever.receive(RecievePacket); String s = new String(RecievePacket.getData()); msgArea.append(s + '\n'); } Reciever.close(); } catch (SocketException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex); } } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); msgArea = new javax.swing.JTextArea(); msgField = new javax.swing.JTextField(); SendButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("B"); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); msgArea.setColumns(20); msgArea.setRows(5); jScrollPane1.setViewportView(msgArea); SendButton.setText("发送"); SendButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { SendButtonMouseClicked(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addComponent(msgField, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE).addGap(18, 18, 18).addComponent(SendButton)).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 313, Short.MAX_VALUE)).addContainerGap())); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(18, 18, 18).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(msgField, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(SendButton)).addContainerGap(49, Short.MAX_VALUE))); pack(); }// </editor-fold> private void SendButtonMouseClicked(java.awt.event.MouseEvent evt) { String msg = msgField.getText(); msg = "B: " + msg; SendMsg(msg, "localhost"); msgArea.append(msg + '\n'); msgField.setText(""); } private void formWindowClosing(java.awt.event.WindowEvent evt) { ServerStop(); System.out.println("Server closed normally"); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ClientGUI Client = new ClientGUI(); Client.setVisible(true); Client.ServerStart(); } }); } // Variables declaration - do not modify private javax.swing.JButton SendButton; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea msgArea; private javax.swing.JTextField msgField; // End of variables declaration } |
No Comments