• 简易聊天客户端程序


    import java.io.*;
    import javax.swing.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class simpleChatClientA {
        JTextArea incoming;
        BufferedReader reader;
        Socket sock;
        JTextField outgoing;
        PrintWriter writer;
        //build the interface
        public void go(){
            JFrame frame = new JFrame("Gaby's specific chatClient");
            JPanel mainPanel = new JPanel();
            /*此处为一大堆GUI组件 incoming 和 JScrollPane的设置
             * 我在此忽略 
             */
            outgoing = new JTextField(20);
            JButton sendButton = new JButton("send");
            
            mainPanel.add(outgoing);
            mainPanel.add(sendButton);
            sendButton.addActionListener(new buttonListener());
            
            frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
            setUpNetWorking();
            Thread t = new Thread(new incomingReader());
            t.start();
            frame.setSize(300, 400);
            frame.setVisible(true);
        }
        
        //build the link between the class and the server
        public void setUpNetWorking(){
            try{
                sock = new Socket("192.168.0.105",5000);
                InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(streamReader);
                writer = new PrintWriter(sock.getOutputStream());
                System.out.println("networking established");
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        
        //register to a button and send message to server
        class buttonListener implements ActionListener{
            public void actionPerformed(ActionEvent ev){
                writer.println(outgoing.getText());//因为输出时,只有等到缓冲区满了才输出,有些时候输出的内容比较少的时候,没有充满缓冲区,不会立刻输出的。
                writer.flush();
            }
        }
        //Runnable类使用多线程
        public class incomingReader implements Runnable{
            String message;
            public void run(){
                try{
                    while((message = reader.readLine()) != null ){
                        System.out.println("read " + message);
                        incoming.append(message + "
    ");
                    }
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }
        
        //main
        public static void main(String args[]){
            simpleChatClientA client = new simpleChatClientA();
            client.go();
        }
    }
    View simpleChatClient.java

    该程序可分为以下功能块:

    • go
    • setUpNetWorking
    • buttonListener implements ActionListener
    • incomingReader implements Runnable

    go:

    用于建立GUI,并调用 setUpNetWorking(),并且启动用于接收服务器信息的新线

    setUpNetWorking:

    通过让Socket sock充当这个对象的实例变量,使得其生存期伴随整个程序

    同时,设置好reader和writer

    buttonListener implements ActionListener(内部类):

    在go里面向button注册了监听,如果遇到click,则由buttonListener对象处理,处理方式则是向服务器发送信息,意味着writer得是实例变量

    incomingReader implements Runnable(内部类):

    里面的run函数是新线程执行的内容,也因此用到了外部类对象的reader

  • 相关阅读:
    ContextLoaderListener作用详解
    @Autowired与@Resource的区别
    使用SimpleDateFormat时的日期和时间模式
    git将本地内容传送到远程仓库出现![rejected] master -> master (fetch first)错误
    使用SSH框架遇到的错误总结
    struts2 action中字符串转json对象出错 java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
    2017百度web前端实习生在线笔试题
    学习模型-视图-控制器MVC模式
    DOM元素加载之前执行的jQuery代码
    使用$.post和action或servlet交互 URL出现 http://localhost:8080/../[object%20Object] 错误的问题解决
  • 原文地址:https://www.cnblogs.com/gabygoole/p/4947746.html
Copyright © 2020-2023  润新知