如何将此客户端作为多线程客户端?

时间:2010-01-18 05:47:32

标签: java networking

我已经阅读了很多关于多线程客户端的内容但是对于这个,我不能让它多线程! 你能帮帮我吗?

public class MainClient implements Runnable{

private static InformationClass info = new InformationClass();
private static Socket c;
private static String text;

public static String getText() {
    return text;
}

public static void setText(String text) {
    MainClient.text = text;
}
private static PrintWriter os;
private static BufferedReader is;
static boolean closed = false;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {



    MainFrame farme = new MainFrame();
    farme.setVisible(true);
    try {
        c = new Socket("localhost", 5050);


        os = new PrintWriter(c.getOutputStream(), true);


        is = new BufferedReader(new InputStreamReader(c.getInputStream()));
    } catch (UnknownHostException ex) {
        Logger.getLogger(MainClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(MainClient.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static void active() {

    String teXt = MainClient.getText();
    System.out.println(teXt);
    os.println(teXt);

    try {
        String line = is.readLine();
        System.out.println("Text received: " + line);
        os.flush();
        is.close();
        is.close();
        c.close();
    } catch (IOException ex) {
        Logger.getLogger(MainClient.class.getName()).log(Level.SEVERE, null, ex);
    }

      }
}

当客户端在文本区域写入内容然后单击发送按钮时,也会调用active方法。

2)我也有一个问题:

在另一个类中我为我的发送按钮执行了此操作,这是否意味着客户端是多线程的?

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    new Thread(new Runnable() {

        @Override
        public void run() {
            // This gets run in a background thread
            String text = jTextArea1.getText();


            jTextArea2.append(client.getCurrentName() + " : " + text + "\n");
            MainClient.setText(client.getCurrentName() + " : " + text + "\n");
            clear();
            MainClient.active();

        }
    }).start();




}

最后编辑:

这是我的主动方法:

  public static void active() {

    String teXt = MainClient.getText();

    os.println(teXt);


        String line = is.readLine();
        System.out.println("Text received: " + line);
        os.flush();
        is.close();
        is.close();
        c.close();
    }

2 个答案:

答案 0 :(得分:0)

简答:是的。每次调用方法jButton1ActionPerformed时,第二个代码段中的代码都会创建一个新线程。

我不确定这是否是预期的行为。

答案 1 :(得分:0)

  

这是否意味着客户端是多线程的?

多线程是使用多个线程。从技术上讲,你是多线程的。

  

那么,我可以同时运行2个客户端吗?

简短回答,是的。
答案很长,你需要确保你的方法是线程安全的,MainCient没有阻塞或被任何其他线程阻止。

当多线程时,我通常倾向于创建一个集中式类来控制线程的“池”。我称之为Dispatcher。它管理线程映射。