基于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连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。
https://fishc.com.cn/thread-226351-1-1.html 要实现一个基于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类中添加一个发送消息的方法,并将服务器端的消息发送到客户端。
此外,这个简单的实现没有考虑多个客户端连接和线程安全的问题。在实际应用中,你可能需要使用多线程来处理多个客户端连接,并确保线程安全。
Threebody1 发表于 2023-4-18 20:32
https://fishc.com.cn/thread-226351-1-1.html
你这占楼真是越来越有模有样了,是不是被举报灌水了{:10_256:} isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了
{:10_245:}他的图没有 本帖最后由 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...")
有用请设置最佳答案 isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了
不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不用绝对会忘的,事太多了,高数,线代,电路,这这那那的,没办法{:10_266:},有时候就想学这些东西干嘛,跟我以后干什么有什么关系,我以后又要干什么,唉,不管怎末说你都是我的超人{:10_256:} isdkz 发表于 2023-4-18 20:37
你这占楼真是越来越有模有样了,是不是被举报灌水了
我还以为在说我呢{:10_281:} 白痴爱面包 发表于 2023-4-18 20:46
不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不 ...
他用的是chatgpt sfqxx 发表于 2023-4-18 20:45
以下是一个简单的使用Python和Tkinter编写的socket程序,可以在启动时向多行文本框中输入“server starting ...
《鱼C论坛»论坛›技术交流›Java语言交流›基于GUI的网络通信程序设计》 白痴爱面包 发表于 2023-4-18 20:57
我还以为在说我呢
{:5_109:}我在说歌者呢,现在他每次占楼都发那个传图片 白痴爱面包 发表于 2023-4-18 20:46
不是,哈哈,是作业太多了,老师只教了个大概,意在让我们自学,但是哪有那么多精力学哟,而且学完之后不 ...
计科? isdkz 发表于 2023-4-18 21:10
计科?
是的 歌者文明清理员 发表于 2023-4-18 21:02
他用的是chatgpt
我开始还以是机器人嘞,用的chatgpt啊,我就说怎么这快每次{:10_334:},还有就是为啥他每次都这么快回复呀 白痴爱面包 发表于 2023-4-18 21:24
是的
计科是个好专业{:5_106:} 白痴爱面包 发表于 2023-4-18 21:27
我开始还以是机器人嘞,用的chatgpt啊,我就说怎么这快每次,还有就是为啥他每次都这么快回复 ...
手速快 isdkz 发表于 2023-4-18 21:28
计科是个好专业
啊,我觉得就那样了,学的东西杂,以后也不知道该具体干什么,也不知道要不要考研整个人就有点麻木,看朋友圈,qq空间别人的校园生活是真的{:10_266:},我这踏马还有早操{:10_291:} 白痴爱面包 发表于 2023-4-18 21:36
啊,我觉得就那样了,学的东西杂,以后也不知道该具体干什么,也不知道要不要考研整个人就有点麻木,看朋 ...
学的东西杂考研确实是一个优势,可以往这方面考虑 歌者文明清理员 发表于 2023-4-18 21:35
手速快
手速快,意思是说一直在那蹲着吗{:10_257:} isdkz 发表于 2023-4-18 21:37
学的东西杂考研确实是一个优势,可以往这方面考虑
那我不想考研喃,不知道是否耽误你的时间,不过跟大家交流挺好的我觉得{:10_297:}
页:
[1]
2