Folleto loco sobre Java: Uso de MulticastSocket para implementar la multidifusión (4)
Esta clase implementa principalmente la función de comunicación de red subyacente. Esta clase proporciona un método broadcastCast. Este método utiliza MulticastSocket para transmitir la cadena especificada a todos los clientes. También proporciona un método sendSingle. el carácter especificado La cadena se envía a la SocketAddress especificada, como se muestra en las dos primeras líneas de código en negrita del programa. Además, esta clase también proporciona clases de subprocesos internos ReadSingle y ReadBroad. datos en DatagramSocket y MulticastSocket Si la información leída se transmite en línea, el usuario se mantendrá en línea. Si la información leída es la información de chat del usuario, la información se mostrará directamente.
En esta clase, Se utiliza una función principal de este programa. Clase LanChat. Esta clase utiliza DefaultListModel para mantener la lista de usuarios. Cada elemento de la lista en esta clase es un UserInfo. Esta clase también proporciona un ImageCellRenderer. de los elementos de la lista
Códigos de lista de programas/ / /LanChat/LanChat java
clase pública LanChat extiende JFrame
{
p>
private DefaultListModel listModel = new DefaultListModel( )
//Definir un objeto JList
private JList friendsList = new JList (listModel)
/ /Definir un formateador para formatear fechas
formateador DateFormat privado = DateFormat getDateTimeInstance()
lanChat público()
{
super( LAN Chat)
//Configura esta JList para usar ImageCellRenderer como pintor de celdas
friendsList setCellRenderer(new ImageCellRenderer())
listModel addElement(new UserInfo( todos todos nulos))
p>friendsList addMouseListener(new ChangeMusicListener())
add(new JScrollPane(friendsList))
setDefaultCloseOperation(JFrame EXIT_ON_CLOSE)
setBounds()
}
//Agregar usuario a la lista de usuarios
public void addUser(usuario UserInfo)
{
listModel addElement (usuario)
}
//Eliminar usuario de la lista de usuarios
public void removeUser (int pos )
{
listModel removeElementAt(pos)
}
//Según
Dirección para consultar al usuario
public UserInfo getUserBySocketAddress (dirección SocketAddress)
{
for (int i = ; i < getUserNum() ; i++) p >
{
UserInfo usuario = getUser(i)
if (usuario getAddress() != null &&
usuario getAddress() es igual( dirección ))
{
devolver usuario
}
}
devolver nulo; >
}
// Los dos métodos siguientes son contenedores para ListModel
// Obtener el número de usuarios en la ventana de chat
public int getUserNum ()
{
lista de retornoTamaño del modelo()
}
// Lleva al usuario a la ubicación especificada
public UserInfo getUser (int pos)
{
return (UserInfo) listModel elementAt (pos)
}
/ / Implementar el oyente de doble clic de JList Mouse
clase ChangeMusicListener extiende MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
//Si el número de pulsaciones del mouse es mayor que
if (e getClickCount() >= )
{
// Retire el mouse y selecciónelo al hacer doble clic en el elemento de la lista
UserInfo user = (UserInfo)friendsList getSelectedValue()
//Si la ventana de chat del usuario correspondiente al elemento de la lista es nula
if (user getChatFrame() == null)
{
//Crea una ventana de chat para el usuario y permite que el usuario consulte la ventana
user setChatFrame(new ChatFrame (usuario nulo))
}
//Si la ventana del usuario no se muestra, deja que se muestre la ventana del usuario
si (! usuario getChatFrame() isShowing())
{
Usuario getChatFrame() setVisible(true)
}
}
}
}
/**
* Este método de procesamiento de datagramas de red obtendrá la charla en función de la información del chat
* Y mostrar la información en el cuadro de diálogo de chat
* @param paquete El datagrama a procesar
* @param single Si la información es un mensaje de chat privado p>
*/
mensaje de proceso público vacío(paquete DatagramPacket
t boolean single)
{
//Obtener la SocketAddress que envía el datagrama
InetSocketAddress srcAddress = (InetSocketAddress)packet getSocket
Address()
//Si es un mensaje de chat privado, el paquete obtiene la dirección del DatagramSocket y reduce el puerto para obtenerlo
//La dirección correspondiente del MulticastSocket
if (único)
{
srcAddress = new InetSocketAddress (srcAddress getHostName()
srcAddress getPort() )
}
UserInfo srcUser = getUserBySocketAddress (srcAddress)
if (srcUser != null)
{
// Confirme que se mostrará el mensaje Ir a la ventana correspondiente de qué usuario
UserInfo alertUser = single? srcUser: getUser()
//Si la ventana correspondiente al usuario está vacía, mostrar la ventana
if (alertUser getChatFrame() == null)
{
alertUser setChatFrame(new ChatFrame(null alertUser))
}
//Definir la información del mensaje agregado
String tipMsg = single ? Decirle: Decirle a todos
//Mostrar la información del mensaje
alertUser getChatFrame() addString(srcUser getName() + tipMsg
+ …( + formateador formato(new Date()) + )\n
+ new String(paquete getData() paquete getLength( )) + \n )
if (! alertUser getChatFrame() isShowing())
{
alertUser getChatFrame() setVisible(true)
}
}
}
//Entrada del programa del método principal
public static void main(String[] args)
{
LanChat lc = new LanChat()
new LoginFrame(lc Ingrese el nombre de usuario y el avatar para iniciar sesión)
}
}
//Definir una clase para cambiar la apariencia de los elementos de la lista JList
clase ImageCellRenderer extiende JPanel implementa ListCellRenderer
{
icono de ImageIcon privado <; /p>
nombre de cadena privada
p>
//Definir el color de fondo al dibujar celdas
private Color background
//Definir el color de primer plano al dibujar celdas
private Color; primer plano;
componente público getListCellRendererComponent(lista JList Valor del objeto int
índice booleano isSelected booleano cellHasFocus)
{
UserInfo userInfo = (UserInfo) valor
icono = nuevo ImageIcon ( ico/ + userInfo getIcon () + gif )
nombre = userInfo getName ()
fondo = isSelected ? lista getSelectionBackground () : lista getBack
suelo ()
primer plano = isSelected ? lista getSelectionForeground () : lista
getForeground ()
//Devuelve el objeto JPanel como pintor de celda
Devuelve esto
}
//Anula el método paintComponent para cambiar la apariencia del JPanel.
Componente de pintura público void (Gráficos g)
{
int imageWidth = icon getImage() getWidth(null)
int imageHeight = icon getImage() getHeight(null)
g setColor(fondo)
g fillRect( getWidth() getHeight())
g setColor(primer plano)
//Dibujar icono de amigo
g drawImage(icon getImage() getWidth()/imageWidth/null)
g setFont(new Font( SansSerif Font BOLD) )
//Dibujar nombre de usuario de amigo
g drawString(name getWidth() / name length() * imageHeight + )
}
//Utilice este método para establecer el tamaño óptimo de ImageCellRenderer
public Dimension getPreferredSize()
{
return new Dimension( )
}
}
Los métodos addUser y removeUser proporcionados en la clase anterior se utilizan para exponerlos a la clase de comunicación ComUtil y para agregar y eliminar usuarios a la lista de usuarios. Además, esta clase también proporciona un método ProcessMsg, que se utiliza para procesar datagramas leídos de la red, extraer el contenido de los datagramas y mostrarlos en un formato específico.
Lo que se explica arriba son solo las clases clave de este programa. Este programa también incluye YeekuProtocol ChatFrame LoginFrame y otras clases. Debido a limitaciones de espacio, los códigos fuente de estas clases no se proporcionan aquí. a códigos/ / /LanTalk Código fuente en la ruta
? Volver al directorio Crazy Java Handouts
¿La optimización del rendimiento del programa Java
? ¿Programa Java más rápido y estable?
¿Los novatos aprenden programación Java lishixinzhi/Article/program/Java/hx/201311/27255