Java实验二——设计一个基于GUI的客户-服务器的通信应用程序

Server

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class Sserver {
    public static void main(String[] args) {
        new SUI();//新建服务器界面
    }
}

class SUI extends JFrame {
    private static final long serialVersionUID = 1L;
    JTextField Fport;//端口地址输入口
    JTextArea Fsay;//对话输入框
    JTextArea Aoutput;//对话输出框
    JButton Bstart;//start键
    JButton Bsay;//say键
    JPanel top_jp = new JPanel();//上面板
    JPanel down_jp = new JPanel();//下面板
    ServerSocket sSoc;//服务器套接字
    Socket soc;//accept()返回的套接字
    Border pad = BorderFactory.createEmptyBorder(5, 10, 5, 10);   //间距框

    void init() {
        setBounds(440, 200, 600, 480);//设置大小
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Sserver");
        Fport = new JTextField(16);
        Fsay = new JTextArea();
        Aoutput = new JTextArea();
        Bstart = new JButton("Start");
        Bsay = new JButton("Say");
        //连接区设置
        top_jp.setLayout(new FlowLayout(FlowLayout.LEFT));  //顶部设为流式布局,左对齐
        top_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("服务器设置")));
        top_jp.add(new JLabel("Port:"));
        top_jp.add(Fport);
        top_jp.add(Bstart);

        //消息区设置
        Aoutput.setOpaque(true);    //设置背景色打开
        Aoutput.setBackground(Color.WHITE); //设置背景色
        Aoutput.setEditable(false);
        Aoutput.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("消息框")));  //添加复合边框
        Aoutput.setLineWrap(true);    //自动换行打开
        JScrollPane scroll1 = new JScrollPane(Aoutput);  //滚动条
        scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现

        //待发送区设置
        down_jp.setLayout(new BorderLayout());  //发送区设为卡片布局,中间是输入框,下面是发送按钮
        down_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("输入框")));
        Fsay.setLineWrap(true);    //自动换行打开
        JScrollPane scroll2 = new JScrollPane(Fsay);  //滚动条
        scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
        down_jp.add(scroll2, BorderLayout.CENTER);   //把带滚动条的textarea加进去
        JPanel send_jp = new JPanel();
        send_jp.setLayout(new FlowLayout(FlowLayout.RIGHT));
        Bsay.setPreferredSize(new Dimension(70, 18));
        send_jp.setPreferredSize(new Dimension(0, 26));
        send_jp.add(Bsay);
        down_jp.add(send_jp, BorderLayout.SOUTH);

        //设置布局
        add(top_jp, BorderLayout.NORTH);
        add(scroll1, BorderLayout.CENTER);
        add(down_jp, BorderLayout.SOUTH);
        top_jp.setPreferredSize(new Dimension(0, 80));
        down_jp.setPreferredSize(new Dimension(0, 120));

        setVisible(true);
    }

    SUI() {
        init();
        //为start键添加监听器
        Bstart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Aoutput.append("Server starting...\n");
                //信息输入线程
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            sSoc = new ServerSocket(Integer.parseInt(Fport.getText()));
                            soc = sSoc.accept();
                            Aoutput.append("Client connected...\n");
                            while (true) {
                                BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
                                String s;
                                while ((s = br.readLine()) != null) {
                                    Aoutput.append("Client said: " + s + "\n\n");
                                }
                            }
                        } catch (IOException exc) {
                            exc.printStackTrace();
                        }
                    }
                }).start();
            }
        });
        //为say键添加监听器
        Bsay.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //信息输出至客户端
                try {
                    Aoutput.append("I said: " + Fsay.getText() + "\n\n");
                    PrintWriter pw = new PrintWriter(soc.getOutputStream());
                    pw.println(Fsay.getText());
                    pw.flush();
                    Fsay.setText("");
                } catch (IOException exc) {
                    exc.printStackTrace();
                }
            }
        });
    }
}

Client

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class Sclient {
    public static void main(String[] args) {
        new CUI();//新建客户端界面
    }
}

class CUI extends JFrame {
    private static final long serialVersionUID = 1L;
    JTextField Fip;//IP地址输入口
    JTextField Fport;//端口地址输入口
    JTextArea Fsay;//对话输入框
    JTextArea Aoutput;//对话输入框
    JButton Bconnect;//connect键
    JButton Bsay;//say键
    JPanel top_jp = new JPanel();//上面板
    JPanel down_jp = new JPanel();//下面板
    Border pad = BorderFactory.createEmptyBorder(5, 10, 5, 10);
    Socket soc;//客户端套接字

    //设置基本信息的初始化函数
    void init() {
        setBounds(440, 200, 600, 480);  //设置大小
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Sclient");
        Fip = new JTextField(12);
        Fport = new JTextField(12);
        Fsay = new JTextArea();
        Aoutput = new JTextArea();
        Bconnect = new JButton("Connect");
        Bsay = new JButton("Say");

        //连接区设置
        top_jp.setLayout(new FlowLayout(FlowLayout.LEFT));  //顶部设为流式布局,左对齐
        top_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("服务器设置")));
        top_jp.add(new JLabel("Server IP:"));
        top_jp.add(Fip);
        top_jp.add(new JLabel("Server Port:"));
        top_jp.add(Fport);
        top_jp.add(Bconnect);

        //消息区设置
        Aoutput.setOpaque(true);    //设置背景色打开
        Aoutput.setBackground(Color.WHITE); //设置背景色
        Aoutput.setEditable(false);
        Aoutput.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("消息框")));  //添加复合边框
        Aoutput.setLineWrap(true);    //自动换行打开
        JScrollPane scroll1 = new JScrollPane(Aoutput);  //滚动条
        scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现

        //待发送区设置
        down_jp.setLayout(new BorderLayout());  //发送区设为卡片布局,中间是输入框,下面是发送按钮
        down_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("输入框")));
        Fsay.setLineWrap(true);    //自动换行打开
        JScrollPane scroll2 = new JScrollPane(Fsay);  //滚动条
        scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
        down_jp.add(scroll2, BorderLayout.CENTER);   //把带滚动条的textarea加进去
        JPanel send_jp = new JPanel();
        send_jp.setLayout(new FlowLayout(FlowLayout.RIGHT));
        Bsay.setPreferredSize(new Dimension(70, 18));
        send_jp.setPreferredSize(new Dimension(0, 26));
        send_jp.add(Bsay);
        down_jp.add(send_jp, BorderLayout.SOUTH);

        //设置布局
        add(top_jp, BorderLayout.NORTH);
        add(scroll1, BorderLayout.CENTER);
        add(down_jp, BorderLayout.SOUTH);
        top_jp.setPreferredSize(new Dimension(0, 80));
        down_jp.setPreferredSize(new Dimension(0, 120));

        setVisible(true);
    }

    //构造函数
    CUI() {
        init();
        //为connect键添加监听器
        Bconnect.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Aoutput.append("Connect to server...\n\n");
                //信息输入线程
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            soc = new Socket(Fip.getText(), Integer.parseInt(Fport.getText()));
                            while (true) {
                                BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
                                String s;
                                while ((s = br.readLine()) != null) {
                                    Aoutput.append("Server said: " + s + "\n\n");
                                }
                            }
                        } catch (IOException exc) {
                            exc.printStackTrace();
                        }
                    }
                }).start();
            }
        });
        //为say键添加监听器
        Bsay.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    //将要发送的信息上传至客户端
                    Aoutput.append("I said: " + Fsay.getText() + "\n\n");
                    PrintWriter pw = new PrintWriter(soc.getOutputStream());
                    pw.println(Fsay.getText());
                    pw.flush();
                    Fsay.setText(""); //清空输入框
                } catch (IOException exc) {
                    exc.printStackTrace();
                }
            }
        });
    }
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值