Java实验———基于GUI的网络通信程序设计

Java实验———基于GUI的网络通信程序设计


实验内容:编写程序完成以下功能:

  • 1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示。
    图1 Socket通信服务器端界面 图2 Socket通信客户端界面
  • 2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1界面中间的多行文本区域显示“Server starting…”字样)。图2为Socket通信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图2所示界面中间的多行文本区域显示“Connect to server…”字样,当服务器端监听到客户端的连接后,在图1界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立Socket连接。
  • 3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。
  • 图2
    在这里插入图片描述
    实验代码:

服务器:

package Practice1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

class myServerFrame extends JFrame implements ActionListener {
        JPanel panel1,panel2,panel3;
        Label label1,label2;
        Button button1,button2;
        TextArea textarea;
        TextField textfile1,textfile2;
        ServerSocket server;
        static Socket socket;       //声明通信界面的组件,其中声明Socket为静态变量供不同线程使用
        public myServerFrame(){
            super("服务器");
            this.setBounds(700,100,500,500);
            this.setLayout(new BorderLayout());     //设置Frame标题、大小、边界和布局器

            panel1=new JPanel();
            panel1.setBackground(new Color(0xF7F7FD));
            panel1.setPreferredSize(new Dimension(500, 80));
            panel1.setBorder(BorderFactory.createTitledBorder("服务器设置"));
            label1=new Label("Port:");
            label1.setFont(new Font("Dialog", 1, 15));
            panel1.add(label1);
            textfile1=new TextField(45);
            panel1.add(textfile1);
            button1=new Button("start");
            button1.addActionListener(this);        //为button1注册监听器
            panel1.add(button1);
            this.add(panel1,BorderLayout.NORTH);        //设置并添加panel1、label、textfiled和Button

            panel2=new JPanel();
            panel2.setBackground(new Color(0xF7F7FD));
            textarea=new TextArea(18,60);
            panel2.add(textarea);
            this.add(panel2,BorderLayout.CENTER);       //设置并添加panel2、textarea

            panel3=new JPanel();
            panel3.setBackground(new Color(0xF7F7FD));
            panel3.setPreferredSize(new Dimension(500, 60));
            label2=new Label("Say");
            label2.setFont(new Font("Dialog", 1, 15));
            panel3.add(label2);
            textfile2=new TextField(50);
            panel3.add(textfile2);
            button2=new Button("Say");
            button2.addActionListener(this);
            panel3.add(button2);
            this.add(panel3,BorderLayout.SOUTH);        //设置panel3,label,textfile和button,并为button添加监听器

            this.setVisible(true);      //设置Frame可见
            this.addWindowListener(new WindowAdapter() {        //为关闭程序添加监听器
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(1);
                }
            });
        }

        public void start()throws IOException {     //按下按钮start时在聊天区域输出start connect..并将文本框的内容转化为端口号
            this.textarea.append("start connect......\n");
            int ports = Integer.valueOf(this.textfile1.getText());

            server = new ServerSocket(ports);
            socket = server.accept();
            Runnable r=new Runnable() {     //使用线程使serversocket保持开启,随时接收socket发来的信息
                @Override
                public void run() {
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while (true) {
                        try {
                            InputStream is = socket.getInputStream();
                            while ((len = is.read(bytes)) != -1) {
                                textarea.append(new String(bytes, 0, len)+'\n');
                            }
                        } catch (IOException je) {
                            System.out.println(je);
                        }
                    }
                }
            };
            Thread thread=new Thread(r);
            thread.start();
        }
        public void DataOutput(){       //按下按钮Say时将聊天文本框中的内容发送给客户端
            String string=textfile2.getText();
            try {
                OutputStream os=socket.getOutputStream();
                os.write(("服务器:"+string).getBytes());
                System.out.println("已发送");
            }catch(IOException ie){
                System.out.println(ie);
            }
        }
    @Override
    public void actionPerformed(ActionEvent e) {        //两个按钮的监听器,分别对应创建Sockrt功能和发送信息功能
            if(e.getSource()==button1){
                try{
                    this.start();
                }catch(IOException ie){
                    System.out.println("start异常");
                }
            }
            else if(e.getSource()==button2){
                System.out.println("感应到Say");
                DataOutput();
            }
    }
}
public class mySeverSocket {
    public static void main(String[] args) {
        myServerFrame msf=new myServerFrame();
    }
}

客户端:

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


class myFrame extends JFrame implements ActionListener {
    JPanel panel1, panel2, panel3;
    Label label1, label2, label3, label4;
    TextField text1, text2, text3, text4;
    TextArea textarea;
    Button button1, button2;
    static Socket socket;       //声明通信界面的组件,其中声明Socket为静态变量供不同线程使用

    public myFrame() {
        super("客户端");
        setBounds(100, 100, 500, 500);
        setLayout(new BorderLayout());      //设置Frame标题、位置、大小和布局类型
                                            //采用BorderLayout,添加三个Panel分别在South,Center,North位置
        panel1 = new JPanel();
        panel2 = new JPanel();
        panel3 = new JPanel();

        panel1.setBackground(new Color(0xF7F7FD));
        panel1.setPreferredSize(new Dimension(500, 80));
        panel1.setBorder(BorderFactory.createTitledBorder("客户端设置"));    //设置panel大小,背景颜色和带标题边框
        label2 = new Label("Server IP:");
        label2.setFont(new Font("Dialog", 1, 15));     //设置标签1 Server Ip
        label3 = new Label("Server Port:");
        label3.setFont(new Font("Dialog", 1, 15));      //设置标签2 Server Port
        text1 = new TextField(10);
        text2 = new TextField(10);      //加入文本框并设置列数

        button1 = new Button("Connent");
        button1.addActionListener(this);        //添加按钮Connect,为按钮注册监听器

        panel1.add(label2);
        panel1.add(text1);
        panel1.add(label3);
        panel1.add(text2);
        panel1.add(button1);

        panel2.setBackground(new Color(0xF7F7FD));
        textarea = new TextArea(18, 60);
        panel2.add(textarea);       //设置panel2背景颜色、大小并添加文本区域,作聊天区域

        panel3.setBackground(new Color(0xF7F7FD));
        panel3.setPreferredSize(new Dimension(500, 60));    //设置并添加panel3
        label4 = new Label("Say:");
        label4.setFont(new Font("Dialog", 1, 15));      //设置并添加label Say

        button2 = new Button("Say");
        button2.addActionListener(this);        //设置添加按钮 Say,并注册监听器

        text4 = new TextField(50);      //添加文本框作输入框
        panel3.add(label4);
        panel3.add(text4);
        panel3.add(button2);

        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.CENTER);
        add(panel3, BorderLayout.SOUTH);

        setVisible(true);       //设置Frame可见
        this.addWindowListener(new WindowAdapter() {        //为退出注册监听器
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    public void CreateSocket()throws IOException{       //当按下按钮Connect,从文本框获取ip地址和端口号,创建socket
        int ports=Integer.valueOf(this.text2.getText());
        String string = text1.getText();
         socket=new Socket(string,ports);

        this.textarea.append("connect to server...\n");     //创建socket后在聊天区域输出connect to server...
         OutputStream os=socket.getOutputStream();
         os.write("Client connected......\n".getBytes());   //获取socket输出流并向服务器发送Client connected...

         Runnable r=new Runnable() {        //使用线程使socket保持开启,随时接收serversocket发来的信息
             @Override
             public void run() {
                 while(true) {
                     try {
                         InputStream is = socket.getInputStream();
                         int len = 0;
                         byte[] bytes = new byte[1024];
                         while ((len = is.read(bytes)) != -1) {
                             String string = new String(bytes, 0, len);
                             textarea.append(string + '\n');
                         }
                     }catch(IOException ie){
                         System.out.println(ie);
                       }
                 }
             }
         };
         Thread thread=new Thread(r);
         thread.start();
    }
    public void OutputData()throws IOException {        //当按下按钮Say,将输入文本框的内容发送到服务器

                System.out.println("已发送");
                OutputStream os = socket.getOutputStream();
                String string = text4.getText();
                os.write(("客户端:"+string).getBytes());
            }

    @Override
    public void actionPerformed(ActionEvent e) {        //两个按钮的监听器,分别对应创建Sockrt功能和发送信息功能
            if(e.getSource()==button1) {
                try {
                    this.CreateSocket();
                } catch (IOException ie) {
                    System.out.println(ie);
                }
            }
            else if (e.getSource()==button2){
                try{
                    this.OutputData();
                }catch(IOException ie){
                    System.out.println(ie);
                }
            }
    }

}


public class mySocket {
    public static void main(String[] args) {
        myFrame frame=new myFrame();
    }
}

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值