Home | History | Annotate | Download | only in network
      1 /*
      2  * Copyright (c) 2011 jMonkeyEngine
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  * * Redistributions of source code must retain the above copyright
     10  *   notice, this list of conditions and the following disclaimer.
     11  *
     12  * * Redistributions in binary form must reproduce the above copyright
     13  *   notice, this list of conditions and the following disclaimer in the
     14  *   documentation and/or other materials provided with the distribution.
     15  *
     16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
     17  *   may be used to endorse or promote products derived from this software
     18  *   without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 package jme3test.network;
     33 
     34 import com.jme3.network.Client;
     35 import com.jme3.network.Message;
     36 import com.jme3.network.MessageListener;
     37 import com.jme3.network.Network;
     38 import java.awt.Component;
     39 import java.awt.Dimension;
     40 import java.awt.event.ActionEvent;
     41 import java.io.IOException;
     42 import javax.swing.*;
     43 import jme3test.network.TestChatServer.ChatMessage;
     44 
     45 /**
     46  *  A simple test chat server.  When SM implements a set
     47  *  of standard chat classes this can become a lot simpler.
     48  *
     49  *  @version   $Revision: 8843 $
     50  *  @author    Paul Speed
     51  */
     52 public class TestChatClient extends JFrame {
     53 
     54     private Client client;
     55     private JEditorPane chatLog;
     56     private StringBuilder chatMessages = new StringBuilder();
     57     private JTextField nameField;
     58     private JTextField messageField;
     59 
     60     public TestChatClient(String host) throws IOException {
     61         super("jME3 Test Chat Client - to:" + host);
     62 
     63         // Build out the UI
     64         setDefaultCloseOperation(DISPOSE_ON_CLOSE);
     65         setSize(800, 600);
     66 
     67         chatLog = new JEditorPane();
     68         chatLog.setEditable(false);
     69         chatLog.setContentType("text/html");
     70         chatLog.setText("<html><body>");
     71 
     72         getContentPane().add(new JScrollPane(chatLog), "Center");
     73 
     74         // A crude form
     75         JPanel p = new JPanel();
     76         p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
     77         p.add(new JLabel("Name:"));
     78         nameField = new JTextField(System.getProperty("user.name", "yourname"));
     79         Dimension d = nameField.getPreferredSize();
     80         nameField.setMaximumSize(new Dimension(120, d.height + 6));
     81         p.add(nameField);
     82         p.add(new JLabel("  Message:"));
     83         messageField = new JTextField();
     84         p.add(messageField);
     85         p.add(new JButton(new SendAction(true)));
     86         p.add(new JButton(new SendAction(false)));
     87 
     88         getContentPane().add(p, "South");
     89 
     90         client = Network.connectToServer(TestChatServer.NAME, TestChatServer.VERSION,
     91                 host, TestChatServer.PORT, TestChatServer.UDP_PORT);
     92         client.addMessageListener(new ChatHandler(), ChatMessage.class);
     93         client.start();
     94     }
     95 
     96     public static String getString(Component owner, String title, String message, String initialValue) {
     97         return (String) JOptionPane.showInputDialog(owner, message, title, JOptionPane.PLAIN_MESSAGE,
     98                 null, null, initialValue);
     99     }
    100 
    101     public static void main(String... args) throws Exception {
    102         TestChatServer.initializeClasses();
    103 
    104         // Grab a host string from the user
    105         String s = getString(null, "Host Info", "Enter chat host:", "localhost");
    106         if (s == null) {
    107             System.out.println("User cancelled.");
    108             return;
    109         }
    110 
    111         TestChatClient test = new TestChatClient(s);
    112         test.setVisible(true);
    113     }
    114 
    115     private class ChatHandler implements MessageListener<Client> {
    116 
    117         public void messageReceived(Client source, Message m) {
    118             ChatMessage chat = (ChatMessage) m;
    119 
    120             System.out.println("Received:" + chat);
    121 
    122             // One of the least efficient ways to add text to a
    123             // JEditorPane
    124             chatMessages.append("<font color='#00a000'>" + (m.isReliable() ? "TCP" : "UDP") + "</font>");
    125             chatMessages.append(" -- <font color='#000080'><b>" + chat.getName() + "</b></font> : ");
    126             chatMessages.append(chat.getMessage());
    127             chatMessages.append("<br />");
    128             String s = "<html><body>" + chatMessages + "</body></html>";
    129             chatLog.setText(s);
    130 
    131             // Set selection to the end so that the scroll panel will scroll
    132             // down.
    133             chatLog.select(s.length(), s.length());
    134         }
    135     }
    136 
    137     private class SendAction extends AbstractAction {
    138 
    139         private boolean reliable;
    140 
    141         public SendAction(boolean reliable) {
    142             super(reliable ? "TCP" : "UDP");
    143             this.reliable = reliable;
    144         }
    145 
    146         public void actionPerformed(ActionEvent evt) {
    147             String name = nameField.getText();
    148             String message = messageField.getText();
    149 
    150             ChatMessage chat = new ChatMessage(name, message);
    151             chat.setReliable(reliable);
    152             System.out.println("Sending:" + chat);
    153             client.send(chat);
    154         }
    155     }
    156 }
    157