鱼C论坛

 找回密码
 立即注册
查看: 914|回复: 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和功能:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5. import javax.swing.*;

  6. public class Server extends JFrame {
  7.     private JTextArea messageArea;
  8.     private JButton startButton;
  9.     private ServerSocket serverSocket;
  10.     private Socket socket;
  11.    
  12.     public Server() {
  13.         // 设置GUI
  14.         setLayout(new BorderLayout());
  15.         startButton = new JButton("Start");
  16.         messageArea = new JTextArea();
  17.         messageArea.setEditable(false);
  18.         add(startButton, BorderLayout.NORTH);
  19.         add(new JScrollPane(messageArea), BorderLayout.CENTER);
  20.         
  21.         // 添加Start按钮事件监听
  22.         startButton.addActionListener(new ActionListener() {
  23.             @Override
  24.             public void actionPerformed(ActionEvent e) {
  25.                 startServer();
  26.             }
  27.         });

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

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

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

  40.             // 接收客户端消息
  41.             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  42.             String message;
  43.             while ((message = in.readLine()) != null) {
  44.                 messageArea.append("Client: " + message + "\n");
  45.             }
  46.         } catch (IOException e) {
  47.             e.printStackTrace();
  48.         }
  49.     }

  50.     public static void main(String[] args) {
  51.         new Server();
  52.     }
  53. }
复制代码


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

  6. public class Client extends JFrame {
  7.     private JTextArea messageArea;
  8.     private JTextField messageField;
  9.     private JButton connectButton;
  10.     private Socket socket;
  11.     private PrintWriter out;
  12.    
  13.     public Client() {
  14.         // 设置GUI
  15.         setLayout(new BorderLayout());
  16.         connectButton = new JButton("Connect");
  17.         messageArea = new JTextArea();
  18.         messageArea.setEditable(false);
  19.         messageField = new JTextField(20);

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

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

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

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

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

  47.             out = new PrintWriter(socket.getOutputStream(), true);
  48.         } catch (IOException e) {
  49.             e.printStackTrace();
  50.         }
  51.     }

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

  56.     public static void main(String[] args) {
  57.         new Client();
  58.     }
  59. }
复制代码


现在,我们已经创建了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和功能:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5. import javax.swing.*;

  6. public class Server extends JFrame {
  7.     private JTextArea messageArea;
  8.     private JButton startButton;
  9.     private ServerSocket serverSocket;
  10.     private Socket socket;
  11.    
  12.     public Server() {
  13.         // 设置GUI
  14.         setLayout(new BorderLayout());
  15.         startButton = new JButton("Start");
  16.         messageArea = new JTextArea();
  17.         messageArea.setEditable(false);
  18.         add(startButton, BorderLayout.NORTH);
  19.         add(new JScrollPane(messageArea), BorderLayout.CENTER);
  20.         
  21.         // 添加Start按钮事件监听
  22.         startButton.addActionListener(new ActionListener() {
  23.             @Override
  24.             public void actionPerformed(ActionEvent e) {
  25.                 startServer();
  26.             }
  27.         });

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

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

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

  40.             // 接收客户端消息
  41.             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  42.             String message;
  43.             while ((message = in.readLine()) != null) {
  44.                 messageArea.append("Client: " + message + "\n");
  45.             }
  46.         } catch (IOException e) {
  47.             e.printStackTrace();
  48.         }
  49.     }

  50.     public static void main(String[] args) {
  51.         new Server();
  52.     }
  53. }
复制代码


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

  6. public class Client extends JFrame {
  7.     private JTextArea messageArea;
  8.     private JTextField messageField;
  9.     private JButton connectButton;
  10.     private Socket socket;
  11.     private PrintWriter out;
  12.    
  13.     public Client() {
  14.         // 设置GUI
  15.         setLayout(new BorderLayout());
  16.         connectButton = new JButton("Connect");
  17.         messageArea = new JTextArea();
  18.         messageArea.setEditable(false);
  19.         messageField = new JTextField(20);

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

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

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

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

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

  47.             out = new PrintWriter(socket.getOutputStream(), true);
  48.         } catch (IOException e) {
  49.             e.printStackTrace();
  50.         }
  51.     }

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

  56.     public static void main(String[] args) {
  57.         new Client();
  58.     }
  59. }
复制代码


现在,我们已经创建了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…”消息。

  1. import tkinter as tk
  2. import socket
  3. import threading

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

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

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

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

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

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

  24.         if not data:
  25.             break

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

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

  30.     client_socket.close()

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

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

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

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

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

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

  49. # 向文本框中插入“server starting...”消息
  50. 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-4-27 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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