Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 14.07 KB | None | 0 0
  1. package xiphias3.client;
  2.  
  3. import javax.swing.*;
  4. import javax.swing.table.TableModel;
  5. import javax.swing.table.DefaultTableModel;
  6. import javax.swing.table.DefaultTableCellRenderer;
  7. import javax.swing.border.EmptyBorder;
  8. import javax.sound.sampled.*;
  9. import javax.media.*;
  10. import java.net.*;
  11. import java.awt.*;
  12. import java.awt.event.ActionListener;
  13. import java.awt.event.ActionEvent;
  14. import java.awt.event.KeyEvent;
  15. import java.util.Vector;
  16. import java.util.StringTokenizer;
  17. import java.io.*;
  18.  
  19. /*
  20.  * Author: Xiphias3
  21.  * Date:   Oct 15, 2010
  22.  * Time:   9:09:09 AM
  23.  */
  24.  
  25. public class Client extends JFrame implements ActionListener, KeyEventDispatcher
  26. {
  27.     private Socket             m_socket;
  28.     private JTextPane          m_chatPane;
  29.     private JTextField         m_chatField;
  30.     private JTable             m_userTable;
  31.     private Vector<User>       m_users;
  32.     private JTextField         m_usernameField;
  33.     private JTextField         m_serverField;
  34.     private JButton            m_btnConnect;
  35.     private ObjectOutputStream m_objOutputStream;
  36.     private ObjectInputStream  m_objInputStream;
  37.     private TCPStreamWatcher   m_tcpStreamWatcher;
  38.     private Microphone         m_microphone;
  39.     private boolean            m_bTransmitting;
  40.     private ULAWUDPDataSink    m_audioSink;
  41.     private ULAWUDPDataSource  m_audioSrc;
  42.     private ULAWTranscoder     m_transcoder;
  43.     private Player             m_player;
  44.  
  45.     private static final String TITLE_NOT_SPEAKING = "X3 Speex VoIP Client - Press Control To Transmit";
  46.     private static final String TITLE_SPEAKING = "X3 Speex VoIP Client - Transmitting...";
  47.  
  48.     public Client() {
  49.         super(TITLE_NOT_SPEAKING);
  50.  
  51.         m_users = new Vector<User>();
  52.         initComponents();
  53.  
  54.         KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
  55.         kfm.addKeyEventDispatcher(this);
  56.  
  57.         setSize(640, 480);
  58.         setLocationRelativeTo(null);
  59.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  60.         setVisible(true);
  61.     }
  62.  
  63.     protected void initComponents() {
  64.         JPanel basePanel = (JPanel) getContentPane();
  65.         basePanel.setLayout(new BorderLayout());
  66.  
  67.         basePanel.add(initEastPanel(), BorderLayout.EAST);
  68.         basePanel.add(initChatPanel(), BorderLayout.CENTER);
  69.         basePanel.setBorder(new EmptyBorder(4, 4, 4, 4));
  70.     }
  71.  
  72.     protected JPanel initEastPanel() {
  73.         TableModel model = new DefaultTableModel() {
  74.             public boolean isCellEditable(int row, int column) {
  75.                 return false;
  76.             }
  77.  
  78.             public Object getValueAt(int row, int column) {
  79.                 return m_users.get(row).m_szUsername;
  80.             }
  81.  
  82.             public int getRowCount() {
  83.                 return m_users.size();
  84.             }
  85.  
  86.             public int getColumnCount() {
  87.                 return 1;
  88.             }
  89.  
  90.             public String getColumnName(int column) {
  91.                 return "Users In Chat";
  92.             }
  93.         };
  94.  
  95.         m_userTable = new JTable();
  96.         m_userTable.setModel(model);
  97.         //m_userTable.getTableHeader().setVisible(false);
  98.         m_userTable.setRowHeight(20);
  99.         m_userTable.setDefaultRenderer(Object.class, new CellRenderer());
  100.         m_userTable.setShowHorizontalLines(true);
  101.         m_userTable.setShowVerticalLines(false);
  102.         m_userTable.setBorder(BorderFactory.createTitledBorder("Users Online"));
  103.  
  104.         JPanel settingsPanel = new JPanel(new BorderLayout(4, 2));
  105.         JPanel settingsPanelWest = new JPanel(new GridLayout(2, 1, 2, 2));
  106.         JPanel settingsPanelCenter = new JPanel(new GridLayout(2, 1, 2, 2));
  107.  
  108.         settingsPanelWest.add(new JLabel("Username", JLabel.CENTER));
  109.         settingsPanelWest.add(new JLabel("Server:Port", JLabel.CENTER));
  110.         settingsPanelCenter.add(m_usernameField = new JTextField(System.getProperty("user.name"), 12));
  111.         settingsPanelCenter.add(m_serverField = new JTextField("127.0.0.1:23000", 12));
  112.         settingsPanel.add(settingsPanelWest, BorderLayout.WEST);
  113.         settingsPanel.add(settingsPanelCenter, BorderLayout.CENTER);
  114.         settingsPanel.add(m_btnConnect = new JButton("Connect"), BorderLayout.SOUTH);
  115.         m_btnConnect.addActionListener(this);
  116.         settingsPanel.setBorder(BorderFactory.createTitledBorder("Settings"));
  117.  
  118.         JPanel panel = new JPanel(new BorderLayout(3, 3));
  119.         panel.add(settingsPanel,  BorderLayout.NORTH);
  120.         panel.add(m_userTable, BorderLayout.CENTER);
  121.         m_userTable.setOpaque(false);
  122.  
  123.         return panel;
  124.     }
  125.  
  126.     protected JPanel initChatPanel() {
  127.         m_chatPane = new JTextPane();
  128.         m_chatPane.setEditable(false);
  129.  
  130.         m_chatField = new JTextField(30);
  131.  
  132.         JPanel centerPanel = new JPanel(new BorderLayout(3, 3));
  133.         centerPanel.add(new JScrollPane(m_chatPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
  134.         centerPanel.add(m_chatField, BorderLayout.SOUTH);
  135.  
  136.         return centerPanel;
  137.     }
  138.  
  139.     public boolean dispatchKeyEvent(KeyEvent e) {
  140.         if (connected()) {
  141.             if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
  142.                 if ((!m_bTransmitting) && (e.getID() == KeyEvent.KEY_PRESSED)) {
  143.                     sendObject("/SPEAKING");
  144.                     setTitle(TITLE_SPEAKING);
  145.                     m_bTransmitting = true;
  146.  
  147.                     try {
  148.                         m_transcoder.startDataTransfer();
  149.                     }
  150.                     catch (Exception x) {
  151.                         x.printStackTrace();
  152.                     }
  153.                 }
  154.                 else if ((m_bTransmitting) && (e.getID() == KeyEvent.KEY_RELEASED)) {
  155.                     sendObject("/NOTSPEAKING");
  156.                     setTitle(TITLE_NOT_SPEAKING);
  157.                     m_bTransmitting = false;
  158.  
  159.                     try {
  160.                         m_transcoder.stopDataTransfer();
  161.                     }
  162.                     catch (Exception x) {
  163.                         x.printStackTrace();
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.         return false;
  169.     }
  170.  
  171.     public void actionPerformed(ActionEvent e) {
  172.         if (e.getSource().equals(m_btnConnect)) {
  173.             if (!connected())
  174.                 connect();
  175.             else
  176.                 disconnect();
  177.         }
  178.     }
  179.  
  180.     public boolean connected() {
  181.         return ((m_socket != null) && (m_socket.isConnected()) && (!m_socket.isClosed()) &&
  182.                 (m_audioSink != null) && (m_audioSink.isConnected()));
  183.     }
  184.  
  185.     public synchronized void connect() {
  186.         if (connected())
  187.             return;
  188.  
  189.         String szMsg = null;
  190.         int nMsgType = JOptionPane.WARNING_MESSAGE;
  191.         try {
  192.             m_bTransmitting = false;
  193.             m_microphone = new Microphone();
  194.             m_microphone.connect();
  195.             AudioFormat[] aFormats = m_microphone.getAvailableFormats();
  196.             JList lstFormats = new JList(aFormats);
  197.             lstFormats.setSelectedIndex(0);
  198.             JOptionPane.showMessageDialog(this, lstFormats, "Select Microphone Input Format", JOptionPane.INFORMATION_MESSAGE);
  199.             m_microphone.setAudioFormat(aFormats[lstFormats.getSelectedIndex()]);
  200.            
  201.             String szAddress = m_serverField.getText();
  202.             String szHost = szAddress.substring(0, szAddress.indexOf(':'));
  203.             int nPort = Integer.parseInt(szAddress.substring(szAddress.lastIndexOf(':') + 1));
  204.  
  205.             m_socket = new Socket(szHost, nPort);
  206.             m_tcpStreamWatcher = new TCPStreamWatcher();
  207.             m_tcpStreamWatcher.start();
  208.  
  209.             m_audioSink = new ULAWUDPDataSink(0);
  210.             m_audioSink.setOutputLocator(new MediaLocator(szHost + ":" + (nPort + 1)));
  211.             m_audioSink.open();
  212.  
  213.             m_transcoder = new ULAWTranscoder(m_microphone, m_audioSink);
  214.             m_transcoder.init();
  215.             m_transcoder.startProcessor();
  216.  
  217.             m_audioSrc = new ULAWUDPDataSource(nPort);
  218.             m_audioSrc.connect();
  219.             m_audioSrc.start();
  220.             m_player = Manager.createPlayer(m_audioSrc);
  221.             m_player.start();
  222.  
  223.             sendObject("/USERNAME\0" + m_usernameField.getText());
  224.             sendObject("/PORT\0" + nPort);
  225.             szMsg = "Connected To " + szAddress + "!";
  226.             nMsgType = JOptionPane.INFORMATION_MESSAGE;
  227.  
  228.             m_btnConnect.setText("Disconnect");
  229.         }
  230.         catch (UnknownHostException uhx) {
  231.             szMsg = "Unknown Host";
  232.         }
  233.         catch (StringIndexOutOfBoundsException sioobx) {
  234.             szMsg = "Invalid server address";
  235.         }
  236.         catch (IOException iox) {
  237.             szMsg = iox.getMessage();
  238.         }
  239.         catch (Exception x) {
  240.             szMsg = "Error: " + x.getMessage();
  241.             x.printStackTrace();
  242.         }
  243.         finally {
  244.             if (nMsgType == JOptionPane.WARNING_MESSAGE) {
  245.                 disconnect();
  246.             }
  247.         }
  248.         JOptionPane.showMessageDialog(this, szMsg, "Connect", nMsgType);
  249.     }
  250.  
  251.     public synchronized void sendObject(Object obj) {
  252.         if (connected()) {
  253.             try {
  254.                 if (m_objOutputStream == null)
  255.                     m_objOutputStream = new ObjectOutputStream(m_socket.getOutputStream());
  256.                 m_objOutputStream.writeObject(obj);
  257.                 m_objOutputStream.flush();
  258.             }
  259.             catch (Exception x) {
  260.                 x.printStackTrace();
  261.             }
  262.         }
  263.     }
  264.  
  265.     public void disconnect() {
  266.         if (!connected())
  267.             return;
  268.  
  269.         m_tcpStreamWatcher = null;
  270.  
  271.         try {
  272.             m_objOutputStream.flush();
  273.             m_objOutputStream.close();
  274.         }
  275.         catch (Exception x) {
  276.         }
  277.  
  278.         try {
  279.             m_objInputStream.close();
  280.         }
  281.         catch (Exception x) {
  282.         }
  283.  
  284.         try {
  285.             m_socket.close();
  286.         }
  287.         catch (Exception x) {
  288.         }
  289.  
  290.         try {
  291.             if (m_audioSink != null) {
  292.                 m_audioSink.stop();
  293.                 m_audioSink.close();
  294.             }
  295.         }
  296.         catch (IOException iox) {
  297.             iox.printStackTrace();
  298.         }
  299.         m_audioSink = null;
  300.  
  301.         if (m_transcoder != null) {
  302.             try {
  303.                 m_transcoder.stopDataTransfer();
  304.             }
  305.             catch (Exception x) {
  306.             }
  307.             m_transcoder.dispose();
  308.             m_transcoder = null;
  309.         }
  310.  
  311.         if (m_player != null) {
  312.             m_player.stop();
  313.         }
  314.  
  315.         if (m_audioSrc != null) {
  316.             m_audioSrc.disconnect();
  317.         }
  318.         m_audioSrc = null;
  319.  
  320.         if (m_player != null) {
  321.             m_player.close();
  322.             m_player = null;
  323.         }
  324.  
  325.         m_socket = null;
  326.         m_objOutputStream = null;
  327.         m_objInputStream = null;
  328.  
  329.         try {
  330.             if (m_microphone != null) {
  331.                 m_microphone.stop();
  332.                 m_microphone.disconnect();
  333.             }
  334.         }
  335.         catch (IOException iox) {
  336.             iox.printStackTrace();
  337.         }
  338.         m_microphone = null;
  339.  
  340.         Runnable r = new Runnable() {
  341.             public void run() {
  342.                 m_btnConnect.setText("Connect");
  343.             }
  344.         };
  345.         if (SwingUtilities.isEventDispatchThread())
  346.             r.run();
  347.         else
  348.             SwingUtilities.invokeLater(r);
  349.     }
  350.  
  351.     public static void main(String[] aszArgs) throws Exception {
  352.         for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
  353.             if (info.getName().equalsIgnoreCase("nimbus")) {
  354.                 try {
  355.                     UIManager.setLookAndFeel(info.getClassName());
  356.                     break;
  357.                 }
  358.                 catch (Exception x) {
  359.                     x.printStackTrace();
  360.                 }
  361.             }
  362.         }
  363.         new Client();
  364.     }
  365.  
  366.     private class User {
  367.         public String  m_szUsername;
  368.         public boolean m_bSpeaking;
  369.  
  370.         public User(String szUsername) {
  371.             m_szUsername = szUsername;
  372.             m_bSpeaking = false;
  373.         }
  374.     }
  375.  
  376.     private class CellRenderer extends DefaultTableCellRenderer {
  377.         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  378.             JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  379.             User user = m_users.get(row);
  380.             l.setHorizontalAlignment(JLabel.CENTER);
  381.             l.setForeground((user.m_bSpeaking) ? Color.BLUE: Color.BLACK);
  382.             l.setBackground(Color.WHITE);
  383.             return l;
  384.         }
  385.     }
  386.  
  387.     private class TCPStreamWatcher extends Thread {
  388.         public void run() {
  389.             while (connected()) {
  390.                 try {
  391.                     if (m_objInputStream == null)
  392.                         m_objInputStream = new ObjectInputStream(m_socket.getInputStream());
  393.                     Object obj = m_objInputStream.readObject();
  394.  
  395.                     if (obj instanceof String) {
  396.                         String szMsg = (String) obj;
  397.                         StringTokenizer st = new StringTokenizer(szMsg, "\0");
  398.                         if (szMsg.startsWith("/USERS")) {
  399.                             Vector v = new Vector();
  400.                             Vector cols = new Vector();
  401.                             cols.add("Username");
  402.                             while (st.hasMoreTokens())
  403.                                 v.add(st.nextToken());
  404.                             m_userTable.setModel(new DefaultTableModel(v, cols));
  405.                         }
  406.                     }
  407.                 }
  408.                 catch (IOException iox) {
  409.                     if (m_tcpStreamWatcher != null)
  410.                         iox.printStackTrace();
  411.                     disconnect();
  412.                 }
  413.                 catch (ClassNotFoundException cnfx) {
  414.                     cnfx.printStackTrace();
  415.                 }
  416.             }
  417.         }
  418.     }
  419. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement