要求:编写带图形界面的聊天程序,实现让客户可以持续地发送消息给服务器,服务器也可以即时看到客户端发送的消息,并回消息给客户端。 程序运行界面如下:
实现代码(服务器):
package T8;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import static T8.Serve.jTextArea;
public class Serve{
static Socket socket;
static String text;
static JTextArea jTextArea;
OutputStream outputStream;
public Serve(){
display();
}
public void display() {
JFrame jFrame = new JFrame("服务器");
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setBounds(0, 0, 400, 270);
jTextArea = new JTextArea(12, 35);
JScrollPane scroll = new JScrollPane(jTextArea);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jFrame.add(scroll, BorderLayout.CENTER);
JPanel jPanel2 = new JPanel();
JTextField jTextField = new JTextField(20);
JButton jButton = new JButton("发送");
jTextArea.setEditable(false);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
text=jTextField.getText();
jTextField.setText("");
jTextArea.append("服务器说:"+text+"\n");
try {
outputStream=socket.getOutputStream();
PrintStream printStream=new PrintStream(outputStream);
printStream.println(text);
printStream.flush();
} catch (Exception ex) {
System.out.println("连接已断开");
}
}
});
jPanel2.add(jTextField);
jPanel2.add(jButton);
jFrame.add(jPanel2, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new Serve();
try {
ServerSocket serverSocket=new ServerSocket(8888);
while (true){
socket=serverSocket.accept();
new Mythread(socket).start();
}
} catch (Exception e) {
System.out.println("连接已断开");
}
}
}
class Mythread extends Thread{
Socket socket;
public Mythread(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
while (true){
InputStream inputStream= socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String info;
if((info=bufferedReader.readLine())!=null){
jTextArea.append("客户端说:"+info+"\n");
}
}
} catch (Exception e) {
System.out.println("连接已断开");
}
}
}
实现代码(客户端):
package T8;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
public class Client{
OutputStream outputStream;
static Socket socket;
static {
try {
socket = new Socket("127.0.0.1",8888);
} catch (IOException e) {
System.out.println("连接已断开");
}
}
static String text;
static JTextArea jTextArea;
public Client(){
display();
}
public void display() {
JFrame jFrame = new JFrame("客户端");
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setBounds(0, 0, 400, 270);
jTextArea = new JTextArea(12, 35);
JScrollPane scroll = new JScrollPane(jTextArea);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jFrame.add(scroll, BorderLayout.CENTER);
JPanel jPanel2 = new JPanel();
JTextField jTextField = new JTextField(20);
JButton jButton = new JButton("发送");
jTextArea.setEditable(false);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
text=jTextField.getText();
jTextArea.append("客户端说:"+text+"\n");
jTextField.setText("");
outputStream= socket.getOutputStream();
PrintStream printStream=new PrintStream(outputStream);
printStream.println(text);
printStream.flush();
} catch (Exception ex) {
System.out.println("连接已断开");
}
}
});
jPanel2.add(jTextField);
jPanel2.add(jButton);
jFrame.add(jPanel2, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new Client();
try {
while (true){
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String info;
if ((info=bufferedReader.readLine())!=null){
jTextArea.append("服务器说:"+info+"\n");
}
}
} catch (Exception e) {
System.out.println("连接已断开");
}
}
}