Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package xiphias3.client;
- import javax.swing.*;
- import javax.swing.table.TableModel;
- import javax.swing.table.DefaultTableModel;
- import javax.swing.table.DefaultTableCellRenderer;
- import javax.swing.border.EmptyBorder;
- import javax.sound.sampled.*;
- import javax.media.*;
- import java.net.*;
- import java.awt.*;
- import java.awt.event.ActionListener;
- import java.awt.event.ActionEvent;
- import java.awt.event.KeyEvent;
- import java.util.Vector;
- import java.util.StringTokenizer;
- import java.io.*;
- /*
- * Author: Xiphias3
- * Date: Oct 15, 2010
- * Time: 9:09:09 AM
- */
- public class Client extends JFrame implements ActionListener, KeyEventDispatcher
- {
- private Socket m_socket;
- private JTextPane m_chatPane;
- private JTextField m_chatField;
- private JTable m_userTable;
- private Vector<User> m_users;
- private JTextField m_usernameField;
- private JTextField m_serverField;
- private JButton m_btnConnect;
- private ObjectOutputStream m_objOutputStream;
- private ObjectInputStream m_objInputStream;
- private TCPStreamWatcher m_tcpStreamWatcher;
- private Microphone m_microphone;
- private boolean m_bTransmitting;
- private ULAWUDPDataSink m_audioSink;
- private ULAWUDPDataSource m_audioSrc;
- private ULAWTranscoder m_transcoder;
- private Player m_player;
- private static final String TITLE_NOT_SPEAKING = "X3 Speex VoIP Client - Press Control To Transmit";
- private static final String TITLE_SPEAKING = "X3 Speex VoIP Client - Transmitting...";
- public Client() {
- super(TITLE_NOT_SPEAKING);
- m_users = new Vector<User>();
- initComponents();
- KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
- kfm.addKeyEventDispatcher(this);
- setSize(640, 480);
- setLocationRelativeTo(null);
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setVisible(true);
- }
- protected void initComponents() {
- JPanel basePanel = (JPanel) getContentPane();
- basePanel.setLayout(new BorderLayout());
- basePanel.add(initEastPanel(), BorderLayout.EAST);
- basePanel.add(initChatPanel(), BorderLayout.CENTER);
- basePanel.setBorder(new EmptyBorder(4, 4, 4, 4));
- }
- protected JPanel initEastPanel() {
- TableModel model = new DefaultTableModel() {
- public boolean isCellEditable(int row, int column) {
- return false;
- }
- public Object getValueAt(int row, int column) {
- return m_users.get(row).m_szUsername;
- }
- public int getRowCount() {
- return m_users.size();
- }
- public int getColumnCount() {
- return 1;
- }
- public String getColumnName(int column) {
- return "Users In Chat";
- }
- };
- m_userTable = new JTable();
- m_userTable.setModel(model);
- //m_userTable.getTableHeader().setVisible(false);
- m_userTable.setRowHeight(20);
- m_userTable.setDefaultRenderer(Object.class, new CellRenderer());
- m_userTable.setShowHorizontalLines(true);
- m_userTable.setShowVerticalLines(false);
- m_userTable.setBorder(BorderFactory.createTitledBorder("Users Online"));
- JPanel settingsPanel = new JPanel(new BorderLayout(4, 2));
- JPanel settingsPanelWest = new JPanel(new GridLayout(2, 1, 2, 2));
- JPanel settingsPanelCenter = new JPanel(new GridLayout(2, 1, 2, 2));
- settingsPanelWest.add(new JLabel("Username", JLabel.CENTER));
- settingsPanelWest.add(new JLabel("Server:Port", JLabel.CENTER));
- settingsPanelCenter.add(m_usernameField = new JTextField(System.getProperty("user.name"), 12));
- settingsPanelCenter.add(m_serverField = new JTextField("127.0.0.1:23000", 12));
- settingsPanel.add(settingsPanelWest, BorderLayout.WEST);
- settingsPanel.add(settingsPanelCenter, BorderLayout.CENTER);
- settingsPanel.add(m_btnConnect = new JButton("Connect"), BorderLayout.SOUTH);
- m_btnConnect.addActionListener(this);
- settingsPanel.setBorder(BorderFactory.createTitledBorder("Settings"));
- JPanel panel = new JPanel(new BorderLayout(3, 3));
- panel.add(settingsPanel, BorderLayout.NORTH);
- panel.add(m_userTable, BorderLayout.CENTER);
- m_userTable.setOpaque(false);
- return panel;
- }
- protected JPanel initChatPanel() {
- m_chatPane = new JTextPane();
- m_chatPane.setEditable(false);
- m_chatField = new JTextField(30);
- JPanel centerPanel = new JPanel(new BorderLayout(3, 3));
- centerPanel.add(new JScrollPane(m_chatPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
- centerPanel.add(m_chatField, BorderLayout.SOUTH);
- return centerPanel;
- }
- public boolean dispatchKeyEvent(KeyEvent e) {
- if (connected()) {
- if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
- if ((!m_bTransmitting) && (e.getID() == KeyEvent.KEY_PRESSED)) {
- sendObject("/SPEAKING");
- setTitle(TITLE_SPEAKING);
- m_bTransmitting = true;
- try {
- m_transcoder.startDataTransfer();
- }
- catch (Exception x) {
- x.printStackTrace();
- }
- }
- else if ((m_bTransmitting) && (e.getID() == KeyEvent.KEY_RELEASED)) {
- sendObject("/NOTSPEAKING");
- setTitle(TITLE_NOT_SPEAKING);
- m_bTransmitting = false;
- try {
- m_transcoder.stopDataTransfer();
- }
- catch (Exception x) {
- x.printStackTrace();
- }
- }
- }
- }
- return false;
- }
- public void actionPerformed(ActionEvent e) {
- if (e.getSource().equals(m_btnConnect)) {
- if (!connected())
- connect();
- else
- disconnect();
- }
- }
- public boolean connected() {
- return ((m_socket != null) && (m_socket.isConnected()) && (!m_socket.isClosed()) &&
- (m_audioSink != null) && (m_audioSink.isConnected()));
- }
- public synchronized void connect() {
- if (connected())
- return;
- String szMsg = null;
- int nMsgType = JOptionPane.WARNING_MESSAGE;
- try {
- m_bTransmitting = false;
- m_microphone = new Microphone();
- m_microphone.connect();
- AudioFormat[] aFormats = m_microphone.getAvailableFormats();
- JList lstFormats = new JList(aFormats);
- lstFormats.setSelectedIndex(0);
- JOptionPane.showMessageDialog(this, lstFormats, "Select Microphone Input Format", JOptionPane.INFORMATION_MESSAGE);
- m_microphone.setAudioFormat(aFormats[lstFormats.getSelectedIndex()]);
- String szAddress = m_serverField.getText();
- String szHost = szAddress.substring(0, szAddress.indexOf(':'));
- int nPort = Integer.parseInt(szAddress.substring(szAddress.lastIndexOf(':') + 1));
- m_socket = new Socket(szHost, nPort);
- m_tcpStreamWatcher = new TCPStreamWatcher();
- m_tcpStreamWatcher.start();
- m_audioSink = new ULAWUDPDataSink(0);
- m_audioSink.setOutputLocator(new MediaLocator(szHost + ":" + (nPort + 1)));
- m_audioSink.open();
- m_transcoder = new ULAWTranscoder(m_microphone, m_audioSink);
- m_transcoder.init();
- m_transcoder.startProcessor();
- m_audioSrc = new ULAWUDPDataSource(nPort);
- m_audioSrc.connect();
- m_audioSrc.start();
- m_player = Manager.createPlayer(m_audioSrc);
- m_player.start();
- sendObject("/USERNAME\0" + m_usernameField.getText());
- sendObject("/PORT\0" + nPort);
- szMsg = "Connected To " + szAddress + "!";
- nMsgType = JOptionPane.INFORMATION_MESSAGE;
- m_btnConnect.setText("Disconnect");
- }
- catch (UnknownHostException uhx) {
- szMsg = "Unknown Host";
- }
- catch (StringIndexOutOfBoundsException sioobx) {
- szMsg = "Invalid server address";
- }
- catch (IOException iox) {
- szMsg = iox.getMessage();
- }
- catch (Exception x) {
- szMsg = "Error: " + x.getMessage();
- x.printStackTrace();
- }
- finally {
- if (nMsgType == JOptionPane.WARNING_MESSAGE) {
- disconnect();
- }
- }
- JOptionPane.showMessageDialog(this, szMsg, "Connect", nMsgType);
- }
- public synchronized void sendObject(Object obj) {
- if (connected()) {
- try {
- if (m_objOutputStream == null)
- m_objOutputStream = new ObjectOutputStream(m_socket.getOutputStream());
- m_objOutputStream.writeObject(obj);
- m_objOutputStream.flush();
- }
- catch (Exception x) {
- x.printStackTrace();
- }
- }
- }
- public void disconnect() {
- if (!connected())
- return;
- m_tcpStreamWatcher = null;
- try {
- m_objOutputStream.flush();
- m_objOutputStream.close();
- }
- catch (Exception x) {
- }
- try {
- m_objInputStream.close();
- }
- catch (Exception x) {
- }
- try {
- m_socket.close();
- }
- catch (Exception x) {
- }
- try {
- if (m_audioSink != null) {
- m_audioSink.stop();
- m_audioSink.close();
- }
- }
- catch (IOException iox) {
- iox.printStackTrace();
- }
- m_audioSink = null;
- if (m_transcoder != null) {
- try {
- m_transcoder.stopDataTransfer();
- }
- catch (Exception x) {
- }
- m_transcoder.dispose();
- m_transcoder = null;
- }
- if (m_player != null) {
- m_player.stop();
- }
- if (m_audioSrc != null) {
- m_audioSrc.disconnect();
- }
- m_audioSrc = null;
- if (m_player != null) {
- m_player.close();
- m_player = null;
- }
- m_socket = null;
- m_objOutputStream = null;
- m_objInputStream = null;
- try {
- if (m_microphone != null) {
- m_microphone.stop();
- m_microphone.disconnect();
- }
- }
- catch (IOException iox) {
- iox.printStackTrace();
- }
- m_microphone = null;
- Runnable r = new Runnable() {
- public void run() {
- m_btnConnect.setText("Connect");
- }
- };
- if (SwingUtilities.isEventDispatchThread())
- r.run();
- else
- SwingUtilities.invokeLater(r);
- }
- public static void main(String[] aszArgs) throws Exception {
- for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
- if (info.getName().equalsIgnoreCase("nimbus")) {
- try {
- UIManager.setLookAndFeel(info.getClassName());
- break;
- }
- catch (Exception x) {
- x.printStackTrace();
- }
- }
- }
- new Client();
- }
- private class User {
- public String m_szUsername;
- public boolean m_bSpeaking;
- public User(String szUsername) {
- m_szUsername = szUsername;
- m_bSpeaking = false;
- }
- }
- private class CellRenderer extends DefaultTableCellRenderer {
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- User user = m_users.get(row);
- l.setHorizontalAlignment(JLabel.CENTER);
- l.setForeground((user.m_bSpeaking) ? Color.BLUE: Color.BLACK);
- l.setBackground(Color.WHITE);
- return l;
- }
- }
- private class TCPStreamWatcher extends Thread {
- public void run() {
- while (connected()) {
- try {
- if (m_objInputStream == null)
- m_objInputStream = new ObjectInputStream(m_socket.getInputStream());
- Object obj = m_objInputStream.readObject();
- if (obj instanceof String) {
- String szMsg = (String) obj;
- StringTokenizer st = new StringTokenizer(szMsg, "\0");
- if (szMsg.startsWith("/USERS")) {
- Vector v = new Vector();
- Vector cols = new Vector();
- cols.add("Username");
- while (st.hasMoreTokens())
- v.add(st.nextToken());
- m_userTable.setModel(new DefaultTableModel(v, cols));
- }
- }
- }
- catch (IOException iox) {
- if (m_tcpStreamWatcher != null)
- iox.printStackTrace();
- disconnect();
- }
- catch (ClassNotFoundException cnfx) {
- cnfx.printStackTrace();
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement