Red de conocimiento informático - Descarga de software - Folleto loco sobre Java: Uso de MulticastSocket para implementar la multidifusión (4)

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

{

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++)

 {

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

 */

 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