设计一个图形界面应用程序此程序包括两个部分一个为客户端程序窗口;另外一个为服务器端程序窗口在客户端的窗口中有一个按钮和两个文本框一个用于输入信息另外一个用于显示服务器传回来的文本信息当点击按钮时将第一个文本框中的内容发送到指定的服务器服务器窗口中有一个文本区域组件TextArea类此组件用于显示客户端发来的信息当服务器接收到客户端的访问时传送信息client num到客户端窗口当接收到bye 时结
以下是一个简单的Java Swing实现:
客户端程序窗口:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ClientWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JTextField textField;
private JTextArea textArea;
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private int clientNum;
public ClientWindow(Socket socket, int clientNum) {
super("Client " + clientNum);
this.socket = socket;
this.clientNum = clientNum;
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
textField = new JTextField();
panel.add(textField);
textField.setColumns(20);
JButton sendButton = new JButton("Send");
panel.add(sendButton);
textArea = new JTextArea(10, 30);
getContentPane().add(textArea, BorderLayout.CENTER);
pack();
setVisible(true);
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String message = textField.getText();
out.println("Client " + clientNum + ": " + message);
textField.setText("");
}
});
new Thread(new Runnable() {
@Override
public void run() {
try {
String message;
while ((message = in.readLine()) != null) {
textArea.append(message + "\n");
if (message.equals("bye")) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端程序窗口:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class ServerWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
private List<ClientWindow> clients;
public ServerWindow() {
super("Server");
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
JButton closeButton = new JButton("Close");
panel.add(closeButton);
textArea = new JTextArea(10, 30);
getContentPane().add(textArea, BorderLayout.CENTER);
pack();
setVisible(true);
clients = new ArrayList<>();
try {
ServerSocket serverSocket = new ServerSocket(12345);
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
Socket socket = serverSocket.accept();
ClientWindow clientWindow = new ClientWindow(socket, clients.size() + 1);
clients.add(clientWindow);
textArea.append("New client connected: " + socket.getInetAddress().getHostAddress() + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
for (ClientWindow clientWindow : clients) {
clientWindow.out.println("bye");
clientWindow.socket.close();
}
dispose();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
}
使用方法:
- 运行ServerWindow类,启动服务器程序窗口。
- 运行ClientWindow类,启动客户端程序窗口。
- 在客户端程序窗口中输入信息,点击Send按钮发送到服务器。
- 在服务器程序窗口中可以看到客户端发送的信息,可以通过TextArea组件与客户端进行交互。
- 当客户端发送“bye”时,程序结束
原文地址: https://www.cveoy.top/t/topic/cDoD 著作权归作者所有。请勿转载和采集!