白痴爱面包 发表于 2023-4-18 20:31:30

基于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连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。

Threebody1 发表于 2023-4-18 20:32:56

https://fishc.com.cn/thread-226351-1-1.html

isdkz 发表于 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类中添加一个发送消息的方法,并将服务器端的消息发送到客户端。

此外,这个简单的实现没有考虑多个客户端连接和线程安全的问题。在实际应用中,你可能需要使用多线程来处理多个客户端连接,并确保线程安全。

isdkz 发表于 2023-4-18 20:37:21

Threebody1 发表于 2023-4-18 20:32
https://fishc.com.cn/thread-226351-1-1.html

你这占楼真是越来越有模有样了,是不是被举报灌水了{:10_256:}

歌者文明清理员 发表于 2023-4-18 20:42:34

isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

{:10_245:}他的图没有

sfqxx 发表于 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...")
有用请设置最佳答案

白痴爱面包 发表于 2023-4-18 20:46:49

isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不用绝对会忘的,事太多了,高数,线代,电路,这这那那的,没办法{:10_266:},有时候就想学这些东西干嘛,跟我以后干什么有什么关系,我以后又要干什么,唉,不管怎末说你都是我的超人{:10_256:}

白痴爱面包 发表于 2023-4-18 20:57:56

isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了

我还以为在说我呢{:10_281:}

歌者文明清理员 发表于 2023-4-18 21:02:03

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

他用的是chatgpt

歌者文明清理员 发表于 2023-4-18 21:02:25

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

《鱼C论坛»论坛›技术交流›Java语言交流›基于GUI的网络通信程序设计》

isdkz 发表于 2023-4-18 21:09:30

白痴爱面包 发表于 2023-4-18 20:57
我还以为在说我呢

{:5_109:}我在说歌者呢,现在他每次占楼都发那个传图片

isdkz 发表于 2023-4-18 21:10:11

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

计科?

白痴爱面包 发表于 2023-4-18 21:24:20

isdkz 发表于 2023-4-18 21:10
计科?

是的

白痴爱面包 发表于 2023-4-18 21:27:21

歌者文明清理员 发表于 2023-4-18 21:02
他用的是chatgpt

我开始还以是机器人嘞,用的chatgpt啊,我就说怎么这快每次{:10_334:},还有就是为啥他每次都这么快回复呀

isdkz 发表于 2023-4-18 21:28:56

白痴爱面包 发表于 2023-4-18 21:24
是的

计科是个好专业{:5_106:}

歌者文明清理员 发表于 2023-4-18 21:35:22

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

手速快

白痴爱面包 发表于 2023-4-18 21:36:14

isdkz 发表于 2023-4-18 21:28
计科是个好专业

啊,我觉得就那样了,学的东西杂,以后也不知道该具体干什么,也不知道要不要考研整个人就有点麻木,看朋友圈,qq空间别人的校园生活是真的{:10_266:},我这踏马还有早操{:10_291:}

isdkz 发表于 2023-4-18 21:37:16

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

学的东西杂考研确实是一个优势,可以往这方面考虑

白痴爱面包 发表于 2023-4-18 21:39:00

歌者文明清理员 发表于 2023-4-18 21:35
手速快

手速快,意思是说一直在那蹲着吗{:10_257:}

白痴爱面包 发表于 2023-4-18 21:43:34

isdkz 发表于 2023-4-18 21:37
学的东西杂考研确实是一个优势,可以往这方面考虑

那我不想考研喃,不知道是否耽误你的时间,不过跟大家交流挺好的我觉得{:10_297:}
页: [1] 2
查看完整版本: 基于GUI的网络通信程序设计