EncoreLaw 2016-08-30 13:15 采纳率: 46.2%
浏览 958
已采纳

问了几天,看了些别人的程序,修改了还是不行!!真的没人指教一下吗:c ?

客户端代码

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;


public class chat {

    JFrame frame;
    JTextArea outputText;
    JTextField inputText;
    JButton sendButton;
    JPanel mainPanel;
    JPanel inputPanel;
    BufferedReader reader;
    Socket socket;
    PrintWriter writer;
    public static void main(String[] args) {

        chat chat=new chat();
        chat.setUpNetWorking();
        chat.buildGUI();

    }

    public void setUpNetWorking() {
        try {
            socket=new Socket("127.0.0.1",5000);

            reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            writer=new PrintWriter(socket.getOutputStream());
        }catch (IOException e) {
            e.printStackTrace();
        }


    }

    public void buildGUI(){

        outputText=new JTextArea("",8,20);
        outputText.setLineWrap(true);
        outputText.setEditable(false);
        JScrollPane scroller=new JScrollPane(outputText);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);


        inputText=new JTextField(15);
        inputText.addActionListener(new SendListener());
        sendButton=new JButton("send");
        inputPanel=new JPanel();
        inputPanel.setLayout(new BorderLayout());
        inputPanel.add(inputText,BorderLayout.CENTER);
        inputPanel.add(sendButton,BorderLayout.EAST);

        frame=new JFrame("Chat Windows");
        frame.getContentPane().add(scroller,BorderLayout.CENTER);
        frame.getContentPane().add(inputPanel,BorderLayout.SOUTH);
        frame.setVisible(true);
        frame.pack();
        inputText.requestFocus();
    }
    public class SendListener implements ActionListener{



        @Override
        public void actionPerformed(ActionEvent e) {

            outputText.setText(outputText.getText()+"me :"+inputText.getText()+"\n");
            writer.println(inputText.getText());
            writer.flush();
            System.out.println("client send it "+inputText.getText());
            inputText.setText("");
            inputText.requestFocus();
        }

        public class ReceiveRunnable implements Runnable {

            @Override
            public void run() {
                while(true){
                String message=null;
                try {
                    while((message=reader.readLine())!=null){
                        System.out.println("cilent Revive it "+message);
                        outputText.setText(outputText.getText()+"someone:"+message+"\n");
                    }
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
            }

        }
    }

}

服务器代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;


public class ChatServer {
    ArrayList<PrintWriter> inputStramList=new ArrayList<PrintWriter>();

    public static void main(String[] args) {
        ChatServer server=new ChatServer();
        server.go();

    }
    public void go(){
         try {
            ServerSocket serverSocket=new ServerSocket(5000);

            while(true){
                Socket clientSocket=serverSocket.accept();
                System.out.println("server connected it");
                PrintWriter writer=new PrintWriter(clientSocket.getOutputStream());
                inputStramList.add(writer);

                Thread t=new Thread(new ReceiveRunnable(clientSocket));
                t.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public class ReceiveRunnable implements Runnable {
        BufferedReader reader;

        public ReceiveRunnable(Socket socket){
            try {
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            } catch (IOException e) {

            }
        }
        public void run() {
            String message;
            while(true){ 
            try { 
                while((message=reader.readLine())!=null){
                    telleverbody(message);
                    System.out.println("server send it "+message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            }
        }
        private void telleverbody(String message) {
            Iterator<PrintWriter> it=inputStramList.iterator();
            while(it.hasNext()){
                PrintWriter writer=(PrintWriter) it.next();
                writer.println(message);
                writer.flush();
            }

        }

    }
}

  • 写回答

5条回答 默认 最新

  • IT-小崔 2016-08-30 14:41
    关注
     import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    
    public class ChatServer {
        ArrayList<PrintWriter> inputStramList=new ArrayList<PrintWriter>();
    
        public static void main(String[] args) {
            ChatServer server=new ChatServer();
            server.go();
    
        }
        public void go(){
             try {
                ServerSocket serverSocket=new ServerSocket(5000);
    
                while(true){
                    Socket clientSocket=serverSocket.accept();
                    System.out.println("server connected it");
                    PrintWriter writer=new PrintWriter(clientSocket.getOutputStream());
                    inputStramList.add(writer);
    
    
                    Thread t=new Thread(new ReceiveRunnable(clientSocket));
                    t.start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public class ReceiveRunnable implements Runnable {
            BufferedReader reader;
    
            public ReceiveRunnable(Socket socket){
                try {
                    reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
                } catch (IOException e) {
    
                }
            }
            public void run() {
                String message;
                while(true){ 
                try { 
                    //  同客户端
                    if((message=reader.readLine())!=null){
                        telleverbody(message);
                        System.out.println("server send it "+message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                }
            }
            private void telleverbody(String message) {
                Iterator<PrintWriter> it=inputStramList.iterator();
                while(it.hasNext()){
                    // 本来Iterator就有泛型,不需要强制类型转换
                    PrintWriter writer= it.next();
                    writer.println(message);
                    writer.flush();
                }
    
            }
    
        }
    }
    
     import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.ScrollPaneConstants;
    
    public class chat {
    
        JFrame frame;
        JTextArea outputText;
        JTextField inputText;
        JButton sendButton;
        JPanel mainPanel;
        JPanel inputPanel;
        BufferedReader reader;
        Socket socket;
        PrintWriter writer;
        //定义一个昵称用于表示消息的发送者
        private String nickName;
    
        public static void main(String[] args) {
    
            chat chat = new chat();
            chat.setUpNetWorking();
            chat.buildGUI();
    
        }
    
        public void setUpNetWorking() {
            try {
                socket = new Socket("127.0.0.1", 5000);
    
                reader = new BufferedReader(new InputStreamReader(socket
                        .getInputStream()));
    
                writer = new PrintWriter(socket.getOutputStream());
    
                //线程应该在此处开启
                // 用于监听服务器消息
                ReceiveRunnable run = new ReceiveRunnable();
                Thread t = new Thread(run);
                t.start();
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        public void buildGUI() {
            //初始化昵称
            while(nickName==null || "".equals(nickName.trim()))
            {
                nickName = JOptionPane.showInputDialog(frame, "请输入昵称");
            }
            frame.setTitle(nickName + "的聊天室");
    
            outputText = new JTextArea("", 8, 20);
            outputText.setLineWrap(true);
            outputText.setEditable(false);
            JScrollPane scroller = new JScrollPane(outputText);
            scroller
                    .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            scroller
                    .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    
            inputText = new JTextField(15);
    //      inputText.addActionListener(new SendListener());
            // 发送事件应该加在button上 而不是JTextField上
            sendButton = new JButton("send");
            sendButton.addActionListener(new SendListener());
            inputPanel = new JPanel();
            inputPanel.setLayout(new BorderLayout());
            inputPanel.add(inputText, BorderLayout.CENTER);
            inputPanel.add(sendButton, BorderLayout.EAST);
    
            frame = new JFrame("Chat Windows");
            frame.getContentPane().add(scroller, BorderLayout.CENTER);
            frame.getContentPane().add(inputPanel, BorderLayout.SOUTH);
            frame.setVisible(true);
            frame.pack();
            inputText.requestFocus();
        }
    
        public class SendListener implements ActionListener {
    
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
                //服务器是将数据写回到所有客户端,所以不需要在自己的消息区拼接消息
    //          outputText.setText(outputText.getText() + "me :"
    //                  + inputText.getText() + "\n");
                String msg = nickName + ":" + inputText.getText();
                writer.println(msg);
                writer.flush();
                System.out.println("client send it " + inputText.getText());
                inputText.setText("");
                inputText.requestFocus();
            }
    
    
        }
    
        public class ReceiveRunnable implements Runnable {
    
            @Override
            public void run() {
                while (true) {
                    String message = null;
                    try {
                        //不应该是while循环,外面已经有while了 if就够了
                        //其实if都不需要,因为reader.readLine()会阻塞线程
                        if ((message = reader.readLine()) != null) {
                            System.out.println("cilent Revive it " + message);
                            // 发送时已经加过昵称,所以不需要someone
                            outputText.setText(outputText.getText()
                                     + message + "\n");
                        }
                    } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧