GUI和网络联机测试小程序

问题

java.net函数库
缓冲区的使用
socket
多线程

最好

深入的理解TCP/IP等协议的原理

在本地创建GUI实现服务器和客户端的通信(本地服务器和客户端通信小程序)

GUI如何实现

    客户端和服务器端一样的布局
    先创建一个窗口
        JFrame frame = new JFrame("服务器端");
        等于一个框架,可以往里面放东西,比如画板
    再创建自己需要的面板(可能不止一个)
            JPanel panel01 = new JPanel();
            JPanel panel02 = new JPanel();
            JPanel panel03 = new JPanel();
        多个面板的布局可以用默认的布局管理器BorderLayout
    添加组件
        比如按钮,文本显示框,文本输入框
            先初始化
    将组件添加到面板上
    最后使用布局管理器(可以自己再定义使用哪个)将面板放到一开始的框架上,设置大小,让窗口显示出来就行了

问题:实现了一个GUI,但是没法用,点按钮什么反应都没有,输入了文字也不会有什么效果

通过事件监听机制实现自己想要的功能

    使用内部类,实现接口向组件注册,使组件可以实现相应的功能,而功能实现代码在内部类中实现

问题:如果其中一个按钮中间代码实现需要使用循环来轮询以确定某个行为是否发生,那么就会无法再使用其他按钮

使用多线程让不同的按钮实现不同的功能,在一个按钮工作时,依旧可以在文本框中输入文字并发送出去,也可以在文本框中显示文字
    具体的线程的任务在使用Runnable接口的类中实现,具体在run()函数中

服务器端代码:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    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.io.Reader;
    import java.io.Writer;
    import java.net.ServerSocket;
    import java.net.Socket;

    import javax.swing.BoxLayout;
    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 Stwifi {
        JButton wifiopen;
        JButton wificlose;
        JButton clientopen;
        JButton clientclose;
        JTextArea textArea01;
        JTextField textField01;

        ServerSocket serverSocket;
        PrintWriter writer;
        Socket socket;
        BufferedReader reader;
        InputStreamReader streamReader;
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Stwifi stwifi = new Stwifi();
            stwifi.showGui();
        }
        public void showGui() {
            JFrame frame = new JFrame("服务器端");
            JPanel panel01 = new JPanel();
            JPanel panel02 = new JPanel();
            JPanel panel03 = new JPanel();
            textField01 = new JTextField();

            wificlose = new JButton("WifiClose");
            wifiopen = new JButton("WifiOpen");
            clientclose = new JButton("ClientClose");
            clientopen = new JButton("ClientOpen");

            textArea01 = new JTextArea(20, 20);
            textArea01.setLineWrap(true); //可以使用滚动条

            //设置滚动条
            JScrollPane scrollPane = new JScrollPane(textArea01);
            scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);



            //Font font =new Font("楷体", Font.BOLD + Font.ITALIC, 20);
            //textField01.setFont(font);
            textField01.setText("please input                                  ");

            textField01.addActionListener(new java.awt.event.ActionListener() {      

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    // TODO Auto-generated method stub
                    //监听机制
                    //输入回车,发送数据
                    //System.out.println("already input");
                    writer.println(textField01.getText());
                    textArea01.append("Server_sent: "+textField01.getText()+"\n");
                    textField01.requestFocus();
                    writer.flush();
                    //String x = ;

                    //writer.close();
                }

            }
                    );




            wifiopen.addActionListener(new Myopen_wifi());    //如何只让按钮点击一次,直到关闭后才能再打开
            clientopen.addActionListener(new Myopen_client());
            clientclose.addActionListener(new Myclose_client());

            panel01.setBackground(Color.PINK);
            panel01.setLayout(new BoxLayout(panel01, BoxLayout.Y_AXIS));
            panel02.setBackground(Color.magenta);
            panel03.setBackground(Color.CYAN);

            panel01.add(wifiopen);
            panel01.add(wificlose);
            panel01.add(clientopen);
            panel01.add(clientclose);
            panel02.add(textField01);
            //panel03.add(textArea01);    //加了滚动条就不用加这个了
            panel03.add(scrollPane);//不能忘了加滚动条

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(BorderLayout.EAST, panel01);
            frame.getContentPane().add(BorderLayout.NORTH, panel02);
            frame.getContentPane().add(BorderLayout.CENTER, panel03);


            frame.setSize(600, 600);
            frame.setVisible(true);

        }
        class Myopen_wifi implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                textArea01.append("Wifi socket Open!\n");
            }

        }

        class Clientget implements Runnable{

            @Override
            public void run() {
                String message;
                // TODO Auto-generated method stub
                try {
                        while((message =reader.readLine())!=null)
                        {
                            textArea01.append(message+"\n");
                        }

                } catch (Exception e2) {
                    // TODO: handle exception
                    System.out.println("发生异常.\n");
                }
            }

        }

        class Myopen_client implements ActionListener{

            //@SuppressWarnings("resource")
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                textArea01.append("server socket open  ing!\n");
                try {
                    //@SuppressWarnings("resource")
                    serverSocket = new ServerSocket(6699);

                        Socket socket = serverSocket.accept();

                        streamReader = new InputStreamReader(socket.getInputStream());
                        reader = new BufferedReader(streamReader);                  
                        writer = new PrintWriter(socket.getOutputStream());
                        Thread tserver = new Thread(new Clientget());
                        tserver.start(); 
                        textArea01.append("服务器已启动!\n");

                } catch (Exception e2) {
                    // TODO: handle exception
                    System.out.println("发生异常.\n");
                }
            }

        }

        class Myclose_client implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                try {
                    serverSocket.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

        }

    }

客户端代码:

    import java.awt.BorderLayout;
    import java.awt.Color;
    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.BoxLayout;
    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 Stclient {
        JButton opensocket;
        JButton closesocket;
        JTextArea textArea01;
        JTextField textField01;

        Socket socket;
        BufferedReader reader; 
        InputStreamReader streamReader;
        PrintWriter writer;
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Stclient stclient = new Stclient();
            stclient.showGui(); 
        }
        public void showGui() {
            JFrame frame = new JFrame("客户端");
            JPanel panel01 = new JPanel();
            JPanel panel02 = new JPanel();
            JPanel panel03 = new JPanel();
            textField01 = new JTextField();

            opensocket = new JButton("Open Socket");
            closesocket = new JButton("Close Socket");

            textArea01 = new JTextArea(20, 20);
            textArea01.setLineWrap(true); //可以使用滚动条

            //设置滚动条
            JScrollPane scrollPane = new JScrollPane(textArea01);
            scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

            textField01.setText("sent to server                                  ");

            textField01.addActionListener(new java.awt.event.ActionListener() {      

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    // TODO Auto-generated method stub
                    //监听机制
                    //输入回车,发送数据
                    //System.out.println("already input");
                    writer.println(textField01.getText());
                    textArea01.append("Client_sent: "+textField01.getText()+"\n");
                    textField01.requestFocus();
                    writer.flush();

                }

            }
                    );


            opensocket.addActionListener(new Client_open());
            closesocket.addActionListener(new Client_close());

            panel01.add(opensocket);
            panel01.add(closesocket);
            panel02.add(textField01);

            panel01.setBackground(Color.PINK);
            panel01.setLayout(new BoxLayout(panel01, BoxLayout.Y_AXIS));
            panel02.setBackground(Color.magenta);
            panel03.setBackground(Color.CYAN);

            //panel03.add(textArea01);    //加了滚动条就不用加这个了
            panel03.add(scrollPane);//不能忘了加滚动条

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(BorderLayout.EAST, panel01);
            frame.getContentPane().add(BorderLayout.NORTH, panel02);
            frame.getContentPane().add(BorderLayout.CENTER, panel03);


            frame.setSize(600, 600);
            frame.setVisible(true);


        }
        class GetFromServer implements Runnable{

            @Override
            public void run() {
                String message;
                // TODO Auto-generated method stub
                try {
                        while((message =reader.readLine())!=null)
                        {
                            textArea01.append("get from server : "+message+"\n");
                        }

                } catch (Exception e2) {
                    // TODO: handle exception
                    System.out.println("发生异常.\n");
                }
            }

        }
        class Client_open implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                textArea01.append("Client Socket Open!\n");

                    try {
                        socket = new Socket("127.0.0.1", 6699);
                        streamReader = new InputStreamReader(socket.getInputStream());
                        reader = new BufferedReader(streamReader);
                        writer = new PrintWriter(socket.getOutputStream());
                        Thread tclient = new Thread(new GetFromServer());
                        tclient.start();

                    } catch (Exception e2) {
                        // TODO: handle exception
                        textArea01.append("客户端socket创建失败!\n");
                    }
            }

        }
        class Client_close implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub

                try {
                    socket.close();
                    textArea01.append("Client Socket Close Now!\n");
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    textArea01.append("关闭客户端socket失败!\n");
                    e1.printStackTrace();
                }
            }

        }
    }

最终实现界面
初始界面
测试界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值