首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

又是线程有关问题

2012-08-17 
又是线程问题这是昨天的帖子http://topic.csdn.net/u/20120628/19/76fc0ff8-9ced-49cc-8f7d-363a1c7eb792.

又是线程问题
这是昨天的帖子http://topic.csdn.net/u/20120628/19/76fc0ff8-9ced-49cc-8f7d-363a1c7eb792.html
昨天我改过后运行下,还是好使的,可是今天又不好使了Server部分的信息发送不出去

这里是改后的代码

Java code
package ex30;import javax.swing.*;import java.awt.*;import java.io.*;import java.net.*;import java.util.Date;import java.awt.event.*;public class Ex30_12Server extends JFrame{    private JTextArea jtaDisplay = new JTextArea();    private JTextArea jtaServer = new JTextArea();    private PrintWriter output;    private BufferedReader in;    private String sendMessage = "";        public static void main(String[] args) {        // TODO 自动生成方法存根        new Ex30_12Server();    }        public Ex30_12Server(){        setLayout(new GridLayout(2, 1, 5, 5));        jtaDisplay.setEditable(false);        jtaDisplay.setBorder(BorderFactory.createTitledBorder(                "Server to Client"));        jtaServer.setBorder(BorderFactory.createTitledBorder(                "Server"));        add(new JScrollPane(jtaDisplay));        add(new JScrollPane(jtaServer));        setTitle("Ex30_12Server");        setSize(500, 300);        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        setVisible(true);                try{            ServerSocket serverSocket = new ServerSocket(8000);                                    while(true){                MutiUser mu = new MutiUser(serverSocket.accept());                mu.start();            }        }        catch(Exception ex){            System.err.print(ex);        }            jtaServer.addKeyListener(new KeyAdapter() {            public void keyPressed(KeyEvent e) {                System.out.println("空白");                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    System.out.println("空白");                    sendMessage = jtaServer.getText();                    System.out.println(sendMessage);                    jtaServer.setText("");                    if(!sendMessage.isEmpty()){                        System.out.println(sendMessage);                        output.println(sendMessage);                        output.flush();                    }                    else{                        System.out.println("空白");                    }                }             }        });    }    //     Define the thread class for send message    class SendTask implements Runnable{        private Socket socket;        public SendTask(Socket socket){            this.socket = socket;        }                public void run(){            while(true){                InetAddress inetAddress = socket.getInetAddress();                if(!sendMessage.isEmpty()){                    jtaDisplay.append(inetAddress.getHostName() + "\t" + new Date() + "\n");                     jtaDisplay.append(sendMessage + "\n");                    sendMessage = "";                }            }        }                }            // Define the thread class for receive message    class ReceiveTask implements Runnable{        private Socket socket;                public ReceiveTask(Socket socket){            this.socket = socket;        }                    public void run(){            try{                while(true){                    String receiveMessage = in.readLine();                    if(!receiveMessage.isEmpty()){                        InetAddress inetAddress = socket.getInetAddress();                        jtaDisplay.append(inetAddress.getHostName() + "\t" + new Date() + "\n");                         jtaDisplay.append(receiveMessage + "\n");                                            }                                    }            }            catch(IOException ex){                System.err.println(ex);            }        }    }        // 为实现多人聊天,设计的线程类    class MutiUser extends Thread{        private Socket client;                public MutiUser(Socket client){            this.client = client;        }                public void run(){            try{                output = new PrintWriter(client.getOutputStream());                in = new BufferedReader(new InputStreamReader(client.getInputStream()));                new Thread(new SendTask(client)).start();                new Thread(new ReceiveTask(client)).start();            }            catch(Exception ex){                System.err.println(ex);            }        }    }} 


Java code
package ex30;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;import java.net.*;public class Ex30_12Client extends JFrame{    private JTextArea jtaDisplay = new JTextArea();    private JTextArea jtaClient = new JTextArea();    private PrintWriter output;    private BufferedReader in;    private String sendMessage = "";    boolean flag = false;        public Ex30_12Client(){        setLayout(new GridLayout(2, 1, 5, 5));        jtaDisplay.setEditable(false);        jtaDisplay.setBorder(BorderFactory.createTitledBorder(                "Client to Server"));        jtaClient.setBorder(BorderFactory.createTitledBorder(                "Client"));        add(new JScrollPane(jtaDisplay));        add(new JScrollPane(jtaClient));        setTitle("Ex30_12Client");        setSize(500, 300);        setLocationRelativeTo(null);        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        setVisible(true);                try{            Socket socket = new Socket(InetAddress.getLocalHost(), 8000);            output = new PrintWriter(socket.getOutputStream());            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));            new Thread(new SendTask(socket)).start();            new Thread(new ReceiveTask(socket)).start();        }        catch (Exception ex){            System.err.println(ex);        }                jtaClient.addKeyListener(new KeyAdapter() {            public void keyPressed(KeyEvent e) {                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    sendMessage = jtaClient.getText();                    jtaClient.setText("");                    if(!sendMessage.isEmpty()){                        output.println(sendMessage);                        output.flush();                    }                }             }        });    }        public static void main(String[] args) {        // TODO 自动生成方法存根        new Ex30_12Client();    }    //     Define the thread class for send message    class SendTask implements Runnable{        private Socket socket;        public SendTask(Socket socket){            this.socket = socket;        }                public void run(){            while(true){                InetAddress inetAddress = socket.getInetAddress();                if(!sendMessage.isEmpty()){                    jtaDisplay.append(inetAddress.getHostName() + "\t" + new Date() + "\n");                     jtaDisplay.append(sendMessage + "\n");                    sendMessage = "";                }            }        }                }            // Define the thread class for receive message    class ReceiveTask implements Runnable{        private Socket socket;                public ReceiveTask(Socket socket){            this.socket = socket;        }                    public void run(){            try{                while(true){                    String receiveMessage = in.readLine();                    if(!receiveMessage.isEmpty()){                        InetAddress inetAddress = socket.getInetAddress();                        if(!receiveMessage.isEmpty()){                            jtaDisplay.append(inetAddress.getHostName() + "\t" + new Date() + "\n");                             jtaDisplay.append(receiveMessage + "\n");                        }                    }                                    }            }            catch(IOException ex){                System.err.println(ex);            }        }    }}

这部分真是好事多磨,感觉总是做不好

[解决办法]

改的我头昏脑胀的,没解决。帮顶先。
------解决方案--------------------


server部分:

将响应事件提前,到server接收之前就可以了

Java code
jtaServer.addKeyListener(new KeyAdapter() {            public void keyPressed(KeyEvent e) {                System.out.println("123");                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    sendMessage = jtaServer.getText();                    jtaServer.setText("");                    if (!sendMessage.isEmpty()) {                        System.out.println(sendMessage);                        output.println(sendMessage);                        output.flush();                    } else {                    }                }            }        });                try {            ServerSocket serverSocket = new ServerSocket(8000);            while (true) {                MutiUser mu = new MutiUser(serverSocket.accept());                mu.start();            }        } catch (Exception ex) {            System.err.print(ex);        }
[解决办法]
其实楼主你这个只是单纯的一个server和一个cient通信,如果在加个lient,前一个的功能就丢失了,你设计有一定的问题,in和output两个引用最好别不要放在主类下

热点排行