【问题标题】:Chat Application in javajava中的聊天应用程序
【发布时间】:2014-02-13 17:14:54
【问题描述】:

我正在尝试用 java 制作一个聊天应用程序,但我遇到了一个问题,我无法发送到另一台机器。 这是我的部分代码:

这是我的班级客户:

public class EnvioSocket {
    public static boolean enviarSocket(String nome, String ip, int porta,
        String mensagem) {
        String dados = nome + " : " + mensagem;
        try {
            Socket socket = new Socket(ip, porta);
            OutputStream outToServer = socket.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);
            out.writeUTF(dados);
            out.close();
            socket.close();

        } catch (UnknownHostException e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            return false;
        } catch (IOException e) {
           JOptionPane.showMessageDialog(null, e.getMessage());
           return false;
        }
        return true;
   }

}

这是我的班级服务器:

public class ServidorThread implements Runnable {
    private JTextArea menssage;

    public ServidorThread(JTextArea menssage) {
        this.menssage = menssage;
    }
    @Override
    public void run() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(Porta.PORTA);
            while (true) {
                Socket acceptedSocket = serverSocket.accept();
                DataInputStream in = new DataInputStream(
                    acceptedSocket.getInputStream());
                String menssage = in.readUTF();
                this.menssage.append(DateUtils.dateToString(new Date(), "dd/MM/yyyy HH:mm") + " " + menssage + "\n");
                in.close();
                acceptedSocket.close();
            }
        } catch (IOException e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }
}



define a port to socket
public final class Porta {
    private Porta() {
    }

    public static final int PORTA = 6066;
} 

我只能向自己的计算机发送消息。我怎样才能解决这个问题? 我正在我的班级内开始我的线程,制作一个 GUI。

【问题讨论】:

  • 您应该首先删除所有与 Swing 相关的代码。您的问题与 Swing 无关,应该在隔离分散注意力的非相关代码的情况下进行测试和调试。此外,在一个真正的聊天应用程序中,用户界面代码将与套接字通信完全分开,所以不妨现在就开始吧。
  • 服务器似乎没有向任何人发送任何内容。它只是接受一个连接,接收到第一条消息并再次关闭套接字。
  • 现在,您的代码比大多数人想要阅读的要多得多。考虑将其减少为SSCCE,以方便我们使用
  • 我做了两个类,一个只接受连接并将消息写入文本区域,另一个只发送消息

标签: java multithreading chat instant-messaging


【解决方案1】:

您的服务器似乎设置正确,但您的客户端似乎从未连接到它。您需要创建一个连接到服务器套接字的套接字。然后,此套接字可以为您提供 I/O 流来发送数据。

Java's tutorial, complete with code examples

【讨论】:

    【解决方案2】:

    这个问题对我来说并不是那么简单...我可以向您展示 Java 中客户端服务器回显应用程序的基础知识...您可以在此基础上进行扩展,以便在我想的客户端之间进行聊天会话...在这里去...

    public class MultiThreadServer implements Runnable {
    
    Socket csocket;
    private static boolean quitFlag = false;
    
    MultiThreadServer(Socket csocket) {
        this.csocket = csocket;
    }
    
    public static void main(String args[]) throws Exception {
        ServerSocket ssock = new ServerSocket(1234);
        System.out.println("Listening");
    
        while (!quitFlag) {
            Socket sock = ssock.accept();
            System.out.println("Connected");
            new Thread(new MultiThreadServer(sock)).start();
         }
    }
    
    public void run() {
        try {
    
            BufferedReader in = new BufferedReader(new InputStreamReader(csocket.getInputStream()));
    
            String action = in.readLine();
    
            PrintStream pstream = new PrintStream(csocket.getOutputStream());
            System.out.printf("Server received... " + action + " ...action\n");
            switch (action) {
                case "bottle":
                    for (int i = 3; i >= 0; i--) {
                        pstream.println("<p>" + i + " bottles of beer on the wall" + "</p>");
                    }
                    pstream.println("<p>" + action + "</p>");
    
                    break;
                case "echo":
                    pstream.println("<p>" + action + "</p>");
                    break;
                case "quit":
                    quitFlag = true;
                    break;
            }
            pstream.close();
            csocket.close();
        } catch (IOException e) {
            System.out.println(e);
        }
      }
    }
    

    运行服务器来响应您的响应很容易...使客户端或客户端更具挑战性...简单的 jsp 客户端..

    <BODY>
        <H1>Creating Client/Server Applications</H1>
    
    
        <% 
        String serverInput = request.getParameter("serverInput");
        //String serverInput = "bottle";   
    
    
        try{
            int character;
            Socket socket = new Socket("127.0.0.1", 1234);
    
            InputStream inSocket = socket.getInputStream();
            OutputStream outSocket = socket.getOutputStream();
    
            String str = serverInput+"\n";
            byte buffer[] = str.getBytes();
            outSocket.write(buffer);
    
            while ((character = inSocket.read()) != -1) {
                out.print((char) character);
            }
    
            socket.close();
    
        }
        catch(java.net.ConnectException e){
        %>
            You must first start the server application 
            at the command prompt.
        <%
        }
        %>
    </BODY>
    

    或者更好……

         <body>
            <%String name = request.getParameter("inputString");%>
            <h1>Creating Client Applications</h1>
    
            <p>Client Sent... <%=name%> ...to Server</p>
    
        <% 
        //String serverInput = "bottle";   
    
    
        try{
            int character;
            Socket socket = new Socket("127.0.0.1", 1234);
    
    
            OutputStream outSocket = socket.getOutputStream();
    
            String str = name;
            byte buffer[] = str.getBytes();
            outSocket.write(buffer);
    
    
            socket.close();
    
        }
        catch(java.net.ConnectException e){
        %>
            You must first start the server application 
            at the command prompt.
        <%
        }
        %>
    
    
    
    
        </body>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多