클라이언트 - 서버 자바 프로그램을 사용하여 2 대 이상의 컴퓨터를 연결하는 방법에 대해 도움을 받으시겠습니까? 프로그램이 제대로 작동하지 않아서 어려움을 겪고 있습니다. 나는 올바른 IP를 얻었는지 아닌지, 그리고 한 가지 더, 사용되는 컴퓨터가 허브를 통해 연결되어 있는지를 알기 위해 자바에서 일하는 새로운 학생입니다.클라이언트 - 서버 자바 프로그램을 사용하여 2 대의 컴퓨터를 연결하는 방법
누군가 나를 도울 수 있으면 감사하겠습니다.
클라이언트 - 서버 자바 프로그램을 사용하여 2 대 이상의 컴퓨터를 연결하는 방법에 대해 도움을 받으시겠습니까? 프로그램이 제대로 작동하지 않아서 어려움을 겪고 있습니다. 나는 올바른 IP를 얻었는지 아닌지, 그리고 한 가지 더, 사용되는 컴퓨터가 허브를 통해 연결되어 있는지를 알기 위해 자바에서 일하는 새로운 학생입니다.클라이언트 - 서버 자바 프로그램을 사용하여 2 대의 컴퓨터를 연결하는 방법
누군가 나를 도울 수 있으면 감사하겠습니다.
먼저 program does not work as it should be
이라고 말하면서 수행 한 작업에 대한 미리보기를 제공해야합니다.
어쨌든, 당신이하려는 것은 소켓 연결입니다. 또는 적어도 당신이 우리에게 너무 많은 정보를주지 않았다고 생각합니다. 여기
는 socke 클라이언트 - 서버 연결을 달성하기 위해 간단한 예입니다이것은 도움이됩니다. 고마워요 :) – MissJ
@MissJ : 당신은 환영합니다;) 이제 내가 가장 좋은 대답으로 표시해야합니다 그래서 나는 몇 가지 포인트를 적립하실 수 있습니다 : 피 – JGutierrezC
클라이언트 :
// Cliente que lee y muestra la información que le envía un Servidor.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Cliente extends JFrame {
private JTextField campoIntroducir;
private JTextArea areaPantalla;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private String mensaje = "";
private String servidorChat;
private Socket cliente;
// inicializar servidorChat y configurar GUI
public Cliente(String host)
{
super("Cliente");
servidorChat = host; // establecer el servidor al que se va a conectar este cliente
Container contenedor = getContentPane();
// crear campoIntroducir y registrar componente de escucha
campoIntroducir = new JTextField();
campoIntroducir.setEditable(false);
campoIntroducir.addActionListener(
new ActionListener() {
// enviar mensaje al servidor
public void actionPerformed(ActionEvent evento)
{
enviarDatos(evento.getActionCommand());
campoIntroducir.setText("");
}
}
);
contenedor.add(campoIntroducir, BorderLayout.NORTH);
// crear areaPantalla
areaPantalla = new JTextArea();
contenedor.add(new JScrollPane(areaPantalla),
BorderLayout.CENTER);
setSize(300, 150);
setVisible(true);
} // fin del constructor de Cliente
// conectarse al servidor y procesar mensajes del servidor
private void ejecutarCliente()
{
// conectarse al servidor, obtener flujos, procesar la conexión
try {
conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
obtenerFlujos(); // Paso 2: obtener los flujos de entrada y salida
procesarConexion(); // Paso 3: procesar la conexión
}
// el servidor cerró la conexión
catch (EOFException excepcionEOF) {
System.err.println("El cliente termino la conexión");
}
// procesar los problemas que pueden ocurrir al comunicarse con el servidor
catch (IOException excepcionES) {
excepcionES.printStackTrace();
}
finally {
cerrarConexion(); // Paso 4: cerrar la conexión
}
} // fin del método ejecutarCliente
// conectarse al servidor
private void conectarAServidor() throws IOException
{
mostrarMensaje("Intentando realizar conexión\n");
// crear Socket para realizar la conexión con el servidor
cliente = new Socket(InetAddress.getByName(servidorChat), 12345);
// mostrar la información de la conexión
mostrarMensaje("Conectado a: " +
cliente.getInetAddress().getHostName());
}
// obtener flujos para enviar y recibir datos
private void obtenerFlujos() throws IOException
{
// establecer flujo de salida para los objetos
salida = new ObjectOutputStream(cliente.getOutputStream());
salida.flush(); // vacíar búfer de salida para enviar información de encabezado
// establecer flujo de entrada para los objetos
entrada = new ObjectInputStream(cliente.getInputStream());
mostrarMensaje("\nSe recibieron los flujos de E/S\n");
}
// procesar la conexión con el servidor
private void procesarConexion() throws IOException
{
// habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes
establecerCampoTextoEditable(true);
do { // procesar mensajes enviados del servidor
// leer mensaje y mostrarlo en pantalla
try {
mensaje = (String) entrada.readObject();
mostrarMensaje("\n" + mensaje);
}
// atrapar los problemas que pueden ocurrir al leer del servidor
catch (ClassNotFoundException excepcionClaseNoEncontrada) {
mostrarMensaje("\nSe recibió un objeto de tipo desconocido");
}
} while (!mensaje.equals("SERVIDOR>>> TERMINAR"));
} // fin del método procesarConexion
// cerrar flujos y socket
private void cerrarConexion()
{
mostrarMensaje("\nCerrando conexión");
establecerCampoTextoEditable(false); // deshabilitar campoIntroducir
try {
salida.close();
entrada.close();
cliente.close();
}
catch(IOException excepcionES) {
excepcionES.printStackTrace();
}
}
// enviar mensaje al servidor
private void enviarDatos(String mensaje)
{
// enviar objeto al servidor
try {
salida.writeObject("CLIENTE>>> " + mensaje);
salida.flush();
mostrarMensaje("\nCLIENTE>>> " + mensaje);
}
// procesar los problemas que pueden ocurrir al enviar el objeto
catch (IOException excepcionES) {
areaPantalla.append("\nError al escribir el objeto");
}
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje(final String mensajeAMostrar)
{
// mostrar mensaje del subproceso de ejecución de la GUI
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // actualiza areaPantalla
{
areaPantalla.append(mensajeAMostrar);
areaPantalla.setCaretPosition(
areaPantalla.getText().length());
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable(final boolean editable)
{
// mostrar mensaje del subproceso de ejecución de la GUI
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // establece la capacidad de modificar campoIntroducir
{
campoIntroducir.setEditable(editable);
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
public static void main(String args[])
{
Cliente aplicacion;
if (args.length == 0)
aplicacion = new Cliente("127.0.0.1");
else
aplicacion = new Cliente(args[ 0 ]);
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplicacion.ejecutarCliente();
}
} // fin de la clase Cliente
서버 당신의 양 근처에 어디에서 제공하지 않은
// Configurar un servidor que reciba una conexión de un cliente, envíe
// una cadena al cliente y cierre la conexión.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Servidor extends JFrame {
private JTextField campoIntroducir;
private JTextArea areaPantalla;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private ServerSocket servidor;
private Socket conexion;
private int contador = 1;
// configurar GUI
public Servidor()
{
super("Servidor");
Container contenedor = getContentPane();
// crear campoIntroducir y registrar componente de escucha
campoIntroducir = new JTextField();
campoIntroducir.setEditable(false);
campoIntroducir.addActionListener(
new ActionListener() {
// enviar mensaje al cliente
public void actionPerformed(ActionEvent evento)
{
enviarDatos(evento.getActionCommand());
campoIntroducir.setText("");
}
}
);
contenedor.add(campoIntroducir, BorderLayout.NORTH);
// crear areaPantalla
areaPantalla = new JTextArea();
contenedor.add(new JScrollPane(areaPantalla),
BorderLayout.CENTER);
setSize(300, 150);
setVisible(true);
} // fin del constructor de Servidor
// configurar y ejecutar el servidor
public void ejecutarServidor()
{
// configurar servidor para que reciba conexiones; procesar las conexiones
try {
// Paso 1: crear un objeto ServerSocket.
servidor = new ServerSocket(12345, 100);
while (true) {
try {
esperarConexion(); // Paso 2: esperar una conexión.
obtenerFlujos(); // Paso 3: obtener flujos de entrada y salida.
procesarConexion(); // Paso 4: procesar la conexión.
}
// procesar excepción EOFException cuando el cliente cierre la conexión
catch (EOFException excepcionEOF) {
System.err.println("El servidor terminó la conexión");
}
finally {
cerrarConexion(); // Paso 5: cerrar la conexión.
++contador;
}
} // fin de instrucción while
} // fin del bloque try
// procesar problemas con E/S
catch (IOException excepcionES) {
excepcionES.printStackTrace();
}
} // fin del método ejecutarServidor
// esperar que la conexión llegue, después mostrar información de la conexión
private void esperarConexion() throws IOException
{
mostrarMensaje("Esperando una conexión\n");
conexion = servidor.accept(); // permitir al servidor aceptar la conexión
mostrarMensaje("Conexión " + contador + " recibida de: " +
conexion.getInetAddress().getHostName());
}
// obtener flujos para enviar y recibir datos
private void obtenerFlujos() throws IOException
{
// establecer flujo de salida para los objetos
salida = new ObjectOutputStream(conexion.getOutputStream());
salida.flush(); // vaciar búfer de salida para enviar información de encabezado
// establecer flujo de entrada para los objetos
entrada = new ObjectInputStream(conexion.getInputStream());
mostrarMensaje("\nSe recibieron los flujos de E/S\n");
}
// procesar la conexión con el cliente
private void procesarConexion() throws IOException
{
// enviar mensaje de conexión exitosa al cliente
String mensaje = "Conexión exitosa";
enviarDatos(mensaje);
// habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes
establecerCampoTextoEditable(true);
do { // procesar los mensajes enviados por el cliente
// leer el mensaje y mostrarlo en pantalla
try {
mensaje = (String) entrada.readObject();
mostrarMensaje("\n" + mensaje);
}
// atrapar problemas que pueden ocurrir al tratar de leer del cliente
catch (ClassNotFoundException excepcionClaseNoEncontrada) {
mostrarMensaje("\nSe recibió un tipo de objeto desconocido");
}
} while (!mensaje.equals("CLIENTE>>> TERMINAR"));
} // fin del método procesarConexion
// cerrar flujos y socket
private void cerrarConexion()
{
mostrarMensaje("\nFinalizando la conexión\n");
establecerCampoTextoEditable(false); // deshabilitar campoIntroducir
try {
salida.close();
entrada.close();
conexion.close();
}
catch(IOException excepcionES) {
excepcionES.printStackTrace();
}
}
// enviar mensaje al cliente
private void enviarDatos(String mensaje)
{
// enviar objeto al cliente
try {
salida.writeObject("SERVIDOR>>> " + mensaje);
salida.flush();
mostrarMensaje("\nSERVIDOR>>> " + mensaje);
}
// procesar problemas que pueden ocurrir al enviar el objeto
catch (IOException excepcionES) {
areaPantalla.append("\nError al escribir objeto");
}
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje(final String mensajeAMostrar)
{
// mostrar mensaje del subproceso de ejecución despachador de eventos
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // actualiza areaPantalla
{
areaPantalla.append(mensajeAMostrar);
areaPantalla.setCaretPosition(
areaPantalla.getText().length());
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable(final boolean editable)
{
// mostrar mensaje del subproceso de ejecución despachador de eventos
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // establece la capacidad de modificar a campoIntroducir
{
campoIntroducir.setEditable(editable);
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
public static void main(String args[])
{
Servidor aplicacion = new Servidor();
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplicacion.ejecutarServidor();
}
} // fin de la clase Servidor
세부 사항이 필요합니다. 우리가 시도한 것과 실패한 것을 보여주십시오. –
'프로그램이 정상적으로 작동하지 않습니다.'정상적으로 동작하지 않는 코드를 보여줄 수 있습니까? 또한 그것이 어떻게 작동해야하며 실제로 어떻게 작동하는지 설명하십시오. – Pshemo
더 많은 세부 정보가 필요합니다. 적어도 프로그램이 원하는 것을 설명하십시오. – Quillion