鱼C论坛

 找回密码
 立即注册
查看: 1404|回复: 22

[已解决]基于GUI的网络通信程序设计

[复制链接]
发表于 2023-4-18 20:31:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。
最佳答案
2023-4-18 20:36:26
要实现一个基于GUI的客户端-服务器网络通信程序,你可以使用Java Swing库来创建GUI界面,并使用Socket类实现网络通信。以下是一种简单实现方法:

首先,创建一个Server类,用于实现服务器端的GUI和功能:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Server extends JFrame {
    private JTextArea messageArea;
    private JButton startButton;
    private ServerSocket serverSocket;
    private Socket socket;
    
    public Server() {
        // 设置GUI
        setLayout(new BorderLayout());
        startButton = new JButton("Start");
        messageArea = new JTextArea();
        messageArea.setEditable(false);
        add(startButton, BorderLayout.NORTH);
        add(new JScrollPane(messageArea), BorderLayout.CENTER);
        
        // 添加Start按钮事件监听
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startServer();
            }
        });

        setTitle("Socket通信服务器端界面");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void startServer() {
        try {
            serverSocket = new ServerSocket(8080);
            messageArea.append("Server starting...\n");

            // 监听客户端连接
            socket = serverSocket.accept();
            messageArea.append("Client connected...\n");

            // 接收客户端消息
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message;
            while ((message = in.readLine()) != null) {
                messageArea.append("Client: " + message + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server();
    }
}

接下来,创建一个Client类,用于实现客户端的GUI和功能:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Client extends JFrame {
    private JTextArea messageArea;
    private JTextField messageField;
    private JButton connectButton;
    private Socket socket;
    private PrintWriter out;
    
    public Client() {
        // 设置GUI
        setLayout(new BorderLayout());
        connectButton = new JButton("Connect");
        messageArea = new JTextArea();
        messageArea.setEditable(false);
        messageField = new JTextField(20);

        add(connectButton, BorderLayout.NORTH);
        add(new JScrollPane(messageArea), BorderLayout.CENTER);
        add(messageField, BorderLayout.SOUTH);

        // 添加Connect按钮事件监听
        connectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                connectToServer();
            }
        });

        // 添加消息输入框事件监听
        messageField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
                messageField.setText("");
            }
        });

        setTitle("Socket通信客户端界面");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void connectToServer() {
        try {
            socket = new Socket("localhost", 8080);
            messageArea.append("Connected to server...\n");

            out = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendMessage() {
        String message = messageField.getText();
        out.println(message);
    }

    public static void main(String[] args) {
        new Client();
    }
}

现在,我们已经创建了Server和Client类,分别实现了服务器端和客户端的基本功能。接下来,我们可以运行这两个类,分别启动服务器和客户端。

  • 首先,运行Server类的main方法,启动服务器端GUI。点击Start按钮,服务器开始监听8080端口,并在文本区域显示“Server starting...”。
  • 然后,运行Client类的main方法,启动客户端GUI。点击Connect按钮,客户端尝试连接到服务器,连接成功后,客户端文本区域会显示“Connected to server...”,服务器端文本区域会显示“Client connected...”。
  • 当服务器和客户端建立了Socket连接后,客户端可以发送消息到服务器。在客户端的消息输入框中输入消息,按下回车键,消息将被发送到服务器端。服务器端接收到消息后,会将接收到的消息显示在文本区域中。


注意,这个示例实现的是一个简单的单向通信,即客户端可以发送消息给服务器,但服务器无法回复。要实现双向通信,你可以在Server类中添加一个发送消息的方法,并将服务器端的消息发送到客户端。

此外,这个简单的实现没有考虑多个客户端连接和线程安全的问题。在实际应用中,你可能需要使用多线程来处理多个客户端连接,并确保线程安全。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-18 20:32:56 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 20:36:26 | 显示全部楼层    本楼为最佳答案   
要实现一个基于GUI的客户端-服务器网络通信程序,你可以使用Java Swing库来创建GUI界面,并使用Socket类实现网络通信。以下是一种简单实现方法:

首先,创建一个Server类,用于实现服务器端的GUI和功能:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Server extends JFrame {
    private JTextArea messageArea;
    private JButton startButton;
    private ServerSocket serverSocket;
    private Socket socket;
    
    public Server() {
        // 设置GUI
        setLayout(new BorderLayout());
        startButton = new JButton("Start");
        messageArea = new JTextArea();
        messageArea.setEditable(false);
        add(startButton, BorderLayout.NORTH);
        add(new JScrollPane(messageArea), BorderLayout.CENTER);
        
        // 添加Start按钮事件监听
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startServer();
            }
        });

        setTitle("Socket通信服务器端界面");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void startServer() {
        try {
            serverSocket = new ServerSocket(8080);
            messageArea.append("Server starting...\n");

            // 监听客户端连接
            socket = serverSocket.accept();
            messageArea.append("Client connected...\n");

            // 接收客户端消息
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message;
            while ((message = in.readLine()) != null) {
                messageArea.append("Client: " + message + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server();
    }
}

接下来,创建一个Client类,用于实现客户端的GUI和功能:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Client extends JFrame {
    private JTextArea messageArea;
    private JTextField messageField;
    private JButton connectButton;
    private Socket socket;
    private PrintWriter out;
    
    public Client() {
        // 设置GUI
        setLayout(new BorderLayout());
        connectButton = new JButton("Connect");
        messageArea = new JTextArea();
        messageArea.setEditable(false);
        messageField = new JTextField(20);

        add(connectButton, BorderLayout.NORTH);
        add(new JScrollPane(messageArea), BorderLayout.CENTER);
        add(messageField, BorderLayout.SOUTH);

        // 添加Connect按钮事件监听
        connectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                connectToServer();
            }
        });

        // 添加消息输入框事件监听
        messageField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
                messageField.setText("");
            }
        });

        setTitle("Socket通信客户端界面");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void connectToServer() {
        try {
            socket = new Socket("localhost", 8080);
            messageArea.append("Connected to server...\n");

            out = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendMessage() {
        String message = messageField.getText();
        out.println(message);
    }

    public static void main(String[] args) {
        new Client();
    }
}

现在,我们已经创建了Server和Client类,分别实现了服务器端和客户端的基本功能。接下来,我们可以运行这两个类,分别启动服务器和客户端。

  • 首先,运行Server类的main方法,启动服务器端GUI。点击Start按钮,服务器开始监听8080端口,并在文本区域显示“Server starting...”。
  • 然后,运行Client类的main方法,启动客户端GUI。点击Connect按钮,客户端尝试连接到服务器,连接成功后,客户端文本区域会显示“Connected to server...”,服务器端文本区域会显示“Client connected...”。
  • 当服务器和客户端建立了Socket连接后,客户端可以发送消息到服务器。在客户端的消息输入框中输入消息,按下回车键,消息将被发送到服务器端。服务器端接收到消息后,会将接收到的消息显示在文本区域中。


注意,这个示例实现的是一个简单的单向通信,即客户端可以发送消息给服务器,但服务器无法回复。要实现双向通信,你可以在Server类中添加一个发送消息的方法,并将服务器端的消息发送到客户端。

此外,这个简单的实现没有考虑多个客户端连接和线程安全的问题。在实际应用中,你可能需要使用多线程来处理多个客户端连接,并确保线程安全。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 20:37:21 | 显示全部楼层
Threebody1 发表于 2023-4-18 20:32
https://fishc.com.cn/thread-226351-1-1.html

你这占楼真是越来越有模有样了,是不是被举报灌水了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 20:42:34 | 显示全部楼层
isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

他的图没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 20:45:54 | 显示全部楼层
本帖最后由 sfqxx 于 2023-4-18 20:47 编辑

以下是一个简单的使用Python和Tkinter编写的socket程序,可以在启动时向多行文本框中输入“server starting…”,并在客户端连接成功后打印“client connected…”消息。
import tkinter as tk
import socket
import threading

# 创建socket对象
server_socket = socket.socket()

# 设置默认主机和端口号
HOST = '127.0.0.1'
PORT = 8888

# 监听客户端连接的线程
def handle_client_connection():
    while True:
        # 等待客户端连接
        client_socket, address = server_socket.accept()

        # 打印客户端连接成功消息
        text_box.insert(tk.END, f'\nclient connected...\n')

        # 启动新线程处理客户端请求
        client_thread = threading.Thread(target=handle_client_request, args=(client_socket,))
        client_thread.start()

# 处理客户端请求的函数
def handle_client_request(client_socket):
    while True:
        # 接收客户端发送的数据
        data = client_socket.recv(1024).decode()

        if not data:
            break

        # 显示客户端发送的数据
        text_box.insert(tk.END, f'{data}\n')

        # 将数据发送回客户端
        client_socket.sendall(data.encode())

    client_socket.close()

# 客户端连接按钮的事件处理函数
def connect_to_server():
    # 连接服务器
    server_socket.connect((HOST, PORT))

    # 向文本框中插入“client connected...”消息
    text_box.insert(tk.END, f'\nclient connected...\n')

# 创建应用程序窗口
app = tk.Tk()
app.title('Socket Server')

# 创建多行文本框
text_box = tk.Text(app, height=10, width=50)
text_box.pack()

# 创建连接按钮
connect_button = tk.Button(app, text='Connect', command=connect_to_server)
connect_button.pack()

# 启动服务器
server_socket.bind((HOST, PORT))
server_socket.listen(5)

# 向文本框中插入“server starting...”消息
text_box.insert(tk.end, "server starting...")
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 20:46:49 | 显示全部楼层
isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不用绝对会忘的,事太多了,高数,线代,电路,这这那那的,没办法,有时候就想学这些东西干嘛,跟我以后干什么有什么关系,我以后又要干什么,唉,不管怎末说你都是我的超人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 20:57:56 | 显示全部楼层
isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

我还以为在说我呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:02:03 | 显示全部楼层
白痴爱面包 发表于 2023-4-18 20:46
不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不 ...

他用的是chatgpt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:02:25 | 显示全部楼层
sfqxx 发表于 2023-4-18 20:45
以下是一个简单的使用Python和Tkinter编写的socket程序,可以在启动时向多行文本框中输入“server starting ...

《鱼C论坛»论坛›技术交流›Java语言交流›基于GUI的网络通信程序设计》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:09:30 | 显示全部楼层

我在说歌者呢,现在他每次占楼都发那个传图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:10:11 | 显示全部楼层
白痴爱面包 发表于 2023-4-18 20:46
不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不 ...

计科?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 21:24:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 21:27:21 | 显示全部楼层

我开始还以是机器人嘞,用的chatgpt啊,我就说怎么这快每次,还有就是为啥他每次都这么快回复呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:28:56 | 显示全部楼层

计科是个好专业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:35:22 | 显示全部楼层
白痴爱面包 发表于 2023-4-18 21:27
我开始还以是机器人嘞,用的chatgpt啊,我就说怎么这快每次,还有就是为啥他每次都这么快回复 ...

手速快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 21:36:14 | 显示全部楼层
isdkz 发表于 2023-4-18 21:28
计科是个好专业

啊,我觉得就那样了,学的东西杂,以后也不知道该具体干什么,也不知道要不要考研整个人就有点麻木,看朋友圈,qq空间别人的校园生活是真的,我这踏马还有早操
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:37:16 | 显示全部楼层
白痴爱面包 发表于 2023-4-18 21:36
啊,我觉得就那样了,学的东西杂,以后也不知道该具体干什么,也不知道要不要考研整个人就有点麻木,看朋 ...

学的东西杂考研确实是一个优势,可以往这方面考虑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 21:39:00 | 显示全部楼层

手速快,意思是说一直在那蹲着吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 21:43:34 | 显示全部楼层
isdkz 发表于 2023-4-18 21:37
学的东西杂考研确实是一个优势,可以往这方面考虑

那我不想考研喃,不知道是否耽误你的时间,不过跟大家交流挺好的我觉得
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表