一个简单的客户机/服务器聊天程序



我正在尝试使用java创建一个简单的聊天程序,其中包含两个表单,一个客户端表单和一个服务器表单,客户端表单包含一个TextField和一个Button(发送按钮),服务器表单包含一个TextArea。

当我点击发送按钮时,它应该将TextField中写入的文本发送到服务器表单中的TextArea。

第一次它工作,但当我点击按钮在第二次它将不工作。

这是我在服务器表单中使用的代码:

public class Server extends javax.swing.JFrame implements Runnable {
    private Thread th;
    public Server() {
        initComponents();
        th = new Thread(this);
        th.start();
    }
    // The main method was here
    @Override
    public void run() {
        // Etablir la connexion
        try {
            ServerSocket ecoute;
            ecoute = new ServerSocket(1111);
            Socket service = null;
            System.out.println("Serveur en attente d'un client !");
            while (true) {
                service = ecoute.accept();
                System.out.println("Client connécté !");
                DataInputStream is = new DataInputStream(service.getInputStream());
                jTextArea1.setText("Client dit : "+ is.readUTF().toUpperCase());
                service.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
这是客户端表单的代码:
    public class Client extends javax.swing.JFrame {
    DataOutputStream os;
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            os.writeUTF(jTextField1.getText());
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE,null, ex);
        }
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Client c = new Client();
                c.setVisible(true);
                try {
                    Socket s = new Socket("localhost", 1111);
                    c.os = new DataOutputStream(s.getOutputStream());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

你的问题是在服务器的代码:为了在服务器端接收来自不同客户端的各种消息,对于每个accept(即每个客户端),您必须创建一个线程来处理其请求,因为您正在使用TCP连接。(-每次接受只处理一个请求,然后关闭连接)。

我清理了代码中与套接字无关的部分,(即与客户端GUI相关的一些不完整的部分),因此我呈现了一个不同的版本,可以很好地用于许多同时的客户端连接,并且您可以看到所有到达服务器的消息,而不仅仅是第一条消息。

服务器的代码:

import java.io.*;
import java.net.*;

public class Server {
    public static void run() {
        try
        {
            ServerSocket ecoute;
            ecoute = new ServerSocket(1111);
            Socket service = null;
            System.out.println("serveur en attente d'un client!");
            while(true)
            {
                service = ecoute.accept();
                System.out.println("client connécté!");
//              ##call a new thread
                WorkerThread wt = new WorkerThread(service);
                wt.start();
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String args[]) {
        run();
    }
}

class WorkerThread extends Thread {
    Socket service;
    WorkerThread(Socket service) {
        this.service = service;
    }
    public void run() {
    boolean flag=true;    //you can change this flag's condition, to test if the client disconects
    try
    {
        while (flag){
            DataInputStream is = new DataInputStream(service.getInputStream());
            System.out.println("client dit: " + is.readUTF().toUpperCase());
        }
        service.close();
    }
    catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}
客户代码:

import java.io.*;
import java.io.*;
import java.net.*;
import java.util.logging.*;

public class Client {
DataOutputStream os;
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
               Client c = new Client();
        try {
            Socket s = new Socket("localhost", 1111);
            c.os = new DataOutputStream(s.getOutputStream());
            while (true){
                String str = Input.read_string();
                c.os.writeUTF(str);
            }
        } catch ( IOException e) {
            // TODO auto-generated catch block
            e.printStackTrace();
        }
            }
        });
    }
}
public class Input{
    public static String read_string(){
        String read="";
        try{
            read = new BufferedReader(new InputStreamReader(System.in), 1).readLine();
        }catch (IOException ex){
            System.out.println("error reading from the input stream!");
        }
        return read;
    }
}

之后,您可能知道,您需要将到达服务器的所有消息发送到聊天室中的所有客户端。

在您的Server代码的while(true)部分-您在阅读一次后关闭套接字,而在客户端您不重新打开Socket(和新的InputStream)。我的建议是,你有另一个循环在你的while(true)部分,将继续读取和显示新的数据,直到达到EOF。

相关内容

  • 没有找到相关文章

最新更新