JAVA程序设计 实验五 网络实验

《Java程序设计》实 验 报 告(五)

实验名称: 网络实验

实验地点:10-413

所使用的工具软件及环境:

环境:Windows 8.1;jdk 1.8;

工具:eclipse

实验目的:

了解JAVA网络编程的基础知识,IP和端口等。

1.掌握客户端服务器的基本概念。

2.掌握Socket通信的基本过程。

3.掌握Socket通信的常用方法。

实验内容:

图形界面编程,利用socket和UDP/TCP编写,客户端和服务端程序可以进行多次对话。

源程序:

//ClientGUI.java

package App;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ClientGUI extends JFrame {

    private JTextField messageField;
    private JTextArea chatArea;
    private JButton sendButton;

    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;

    public ClientGUI() {
        setTitle("Client");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        chatArea = new JTextArea();
        chatArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatArea);
        add(scrollPane, BorderLayout.CENTER);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BorderLayout());

        messageField = new JTextField();
        bottomPanel.add(messageField, BorderLayout.CENTER);

        sendButton = new JButton("Send");
        bottomPanel.add(sendButton, BorderLayout.EAST);

        add(bottomPanel, BorderLayout.SOUTH);

        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        messageField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        setVisible(true);

        String serverAddress = "127.0.0.1";
        int serverPort = 12345;

        try {
            socket = new Socket(serverAddress, serverPort);
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            chatArea.append("Connected to server.\n");

            new Thread(new ReceiveThread()).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void sendMessage() {
        String message = messageField.getText();
        String timestamp = getTimeStamp();
        String formattedMessage = timestamp + "\nClient: " + message;
        out.println(formattedMessage);
        chatArea.append(formattedMessage + "\n");
        messageField.setText("");
    }

    private String getTimeStamp() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(new Date());
    }

    private class ReceiveThread implements Runnable {
        @Override
        public void run() {
            try {
                String message;
                while ((message = in.readLine()) != null) {
                    chatArea.append(message + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ClientGUI();
            }
        });
    }
}

//ServerGUI.java

package App;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
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.text.SimpleDateFormat;
import java.util.Date;

public class ServerGUI extends JFrame {

    private JTextField messageField;
    private JTextArea chatArea;
    private JButton sendButton;

    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public ServerGUI() {
        setTitle("Server");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        chatArea = new JTextArea();
        chatArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatArea);
        add(scrollPane, BorderLayout.CENTER);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BorderLayout());

        messageField = new JTextField();
        bottomPanel.add(messageField, BorderLayout.CENTER);

        sendButton = new JButton("Send");
        bottomPanel.add(sendButton, BorderLayout.EAST);

        add(bottomPanel, BorderLayout.SOUTH);

        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        messageField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        setVisible(true);

        int serverPort = 12345;

        try {
            serverSocket = new ServerSocket(serverPort);
            chatArea.append("Waiting for client...\n");
            clientSocket = serverSocket.accept();
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            chatArea.append("Client connected.\n");

            new Thread(new ReceiveThread()).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void sendMessage() {
        String message = messageField.getText();
        String timestamp = getTimeStamp();
        String formattedMessage = timestamp + "\nServer: " + message;
        out.println(formattedMessage);
        chatArea.append(formattedMessage + "\n");
        messageField.setText("");
    }

    private String getTimeStamp() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(new Date());
    }

    private class ReceiveThread implements Runnable {
        @Override
        public void run() {
            try {
                String message;
                while ((message = in.readLine()) != null) {
                    chatArea.append(message + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ServerGUI();
            }
        });
    }
}

实验结果:

该代码会创建一个具有图形界面的客户端和服务器端程序,连接成功后会显示成功消息,可以双方互相进行多次对话。每条消息都会显示发送时间,并且可以通过点击"Send"按钮或者按下回车键Enter来发送消息:

客户端代码(ClientGUI.java):

· 首先,客户端界面使用了 JFrame,创建了一个图形界面窗口,包含一个用于显示聊天记录的 JTextArea,一个用于输入消息的 JTextField,以及一个用于发送消息的 JButton。

· 在构造函数中,设置界面的标题、大小和关闭操作,然后创建各个界面组件并添加到界面中。

· 为发送按钮和消息输入框分别添加了事件监听器,使得点击发送按钮或按下回车键时都会调用 sendMessage() 方法发送消息。

· sendMessage() 方法获取输入的消息内容,并调用 getTimeStamp() 方法获取当前时间戳,然后将时间戳和消息内容拼接成格式化的消息,发送给服务器端。

· getTimeStamp() 方法使用 SimpleDateFormat 格式化当前时间,并返回时间戳字符串。

· 在 main 方法中,使用 SwingUtilities.invokeLater() 方法在事件分发线程上启动客户端界面。

服务器端代码(ServerGUI.java):

· 服务器端的代码结构和客户端类似,使用了 JFrame 创建图形界面窗口,包含一个用于显示聊天记录的 JTextArea,一个用于输入消息的 JTextField,以及一个用于发送消息的 JButton。

· 在构造函数中,设置界面的标题、大小和关闭操作,创建界面组件并添加到界面中。

· 添加了发送按钮和消息输入框的事件监听器,以便发送消息。

· sendMessage() 方法与客户端代码中的方法类似,获取输入的消息内容、当前时间戳,并将它们拼接成格式化的消息,发送给客户端。

· getTimeStamp() 方法也与客户端代码中的方法相同,用于获取格式化的时间戳字符串。

· ReceiveThread 类是一个实现了 Runnable 接口的内部类,在一个单独的线程中接收从客户端发来的消息,并将其显示在聊天记录中。

· 在 main 方法中,使用 SwingUtilities.invokeLater() 方法在事件分发线程上启动服务器端界面。

该代码通过图形界面实现了简单的客户端和服务器端聊天应用,使用 Socket 进行通信。客户端可以输入消息并发送给服务器端,服务器端接收到消息后可以回复消息给客户端。每条消息都带有发送时间戳,并支持通过点击按钮或按下回车键来发送消息。

收获与体会:

在进行网络实验中,我通过编写Java代码来实现一个基于客户端和服务器端的聊天应用,掌握了JAVA网络编程的基础知识以及Socket通信的基本过程和常用方法。以下是我在这次实验中的收获和体会:

  1. 理解客户端和服务器端的基本概念:

在网络编程中,客户端和服务器端是两个不同的实体,彼此通过网络进行通信。客户端发送请求,服务器端接收请求并提供相应的服务。通过实验,我深入理解了客户端和服务器端的角色和相互关系,以及它们在网络通信中的作用。

  1. 熟悉Socket通信的基本过程:

Socket是实现网络通信的一种机制,它提供了客户端和服务器端之间的双向通信。在实验中,我学会了创建Socket对象、建立连接、发送和接收数据的基本过程。通过Socket,我可以在不同的计算机之间建立通信,并进行数据交换。

  1. 掌握Socket通信的常用方法:

在实验中,我使用了常用的Socket类的方法,如Socket的构造函数、getOutputStream()和getInputStream()方法用于获取输入输出流,以及PrintWriter和BufferedReader等类来进行数据的读写操作。通过这些方法,我能够在客户端和服务器端之间进行数据传输和通信。

  1. 理解IP和端口的概念:

在网络通信中,每个计算机都有一个唯一的IP地址,用于标识计算机的位置。端口是一个数字,用于标识计算机上的具体应用程序。在实验中,我学习了如何使用IP地址和端口号来建立客户端和服务器端的连接,并进行数据的传输和交流。

通过这次实验,我对Java网络编程有了更深入的了解。我掌握了基本的客户端和服务器端的概念,了解了Socket通信的基本过程和常用方法。这为我今后在网络应用开发中的实践提供了坚实的基础。我相信这些知识和经验将对我今后的学习产生积极的影响。网络编程是一个广阔且重要的领域,通过实验的学习和实践,我对网络通信的原理和技术有了更深入的认识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值