设计网络聊天程序,实现如下功能:
(1)聊天两端具有相同的界面,包括能输入消息 的文本框、发送消息按钮、消息列表文本框;
(2)任意一端均可以实时发送和接收消息,并在 自身的消息列表中显示消息记录。
客户端窗口
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.PrintStream; import java.net.Socket; public class ClientFrame extends JFrame implements ActionListener{ private JLabel label = new JLabel("客户端主程序"); private JLabel label_IP = new JLabel("IP:"); private JLabel label_port = new JLabel("Port:"); private JTextField field_IP = new JTextField();//存储IP地址 private JTextField field_port = new JTextField();//储存端口号 private JTextArea receive = new JTextArea();//接收框 private JTextArea send = new JTextArea();//发送框 private JButton button = new JButton("连接"); private JButton button1 = new JButton("发送"); private Socket client; boolean press = true; public JTextArea getReceive() { return receive; } public ClientFrame() { super("客户端"); this.setLayout(null); this.setBounds(100,200,550,530); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); label.setBounds(230,30,200,30); this.getContentPane().setBackground(Color.PINK); label.setFont(new Font("Dialog",0,20)); this.add(label); label_IP.setBounds(50,70,30,30); label_IP.setFont(new Font("Dialog",0,18)); this.add(label_IP); field_IP.setBounds(80,70,100,30); this.add(field_IP); field_IP.setEditable(false);//设置文本框的不能编辑 field_IP.setText("192.168.0.01");//设置IP地址 label_port.setBounds(340,70,50,30); label_port.setFont(new Font("Dialog",0,18)); this.add(label_port); field_port.setBounds(400,70,100,30); this.add(field_port); field_port.setText("2018"); field_port.setEditable(false);//设置文本框不可编辑 //接收文本域 JScrollPane jScrollPane = new JScrollPane(receive);//添加滚动面板 jScrollPane.setBounds(50,110,450,200); receive.setSize(400,110); this.add(jScrollPane); receive.setEditable(false);//设置文本不可编辑 //发送文本域 JScrollPane jScrollPane1 = new JScrollPane(send); jScrollPane1.setBounds(50,320,450,100); this.add(jScrollPane1); //连接按钮 button.setBounds(150,430,60,50); button.addActionListener( this); this.add(button); //发送按钮 button1.setBounds(300,430,60,50); button1.addActionListener(this); this.add(button1); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { String ip = label_IP.getToolTipText(); int port = Integer.parseInt(field_port.getText()); try { client = new Socket(ip, port); if(press) { receive.append(("与服务器连接成功!\n")); press = false; }else{ receive.append("已连接\n"); } Client client = new Client(this); client.setClient(this.client); client.start(); }catch (Exception e1){ e1.printStackTrace(); } } else { try { PrintStream date = new PrintStream(client.getOutputStream()); date.println(send.getText()); receive.append("客户端:\n"+send.getText()+"\n"); send.setText(""); }catch (Exception e1) { e1.printStackTrace(); } } } }客户端
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.InputStreamReader; import java.net.Socket; public class Client extends Thread{ Socket client; private ClientFrame frame; public Client(ClientFrame frame) { this.frame = frame; } public void setClient(Socket client) { this.client = client; } @Override public void run() { try { //读取服务端信息 DataInputStream date = new DataInputStream(client.getInputStream()); InputStreamReader reader = new InputStreamReader(date); BufferedReader bufferedReader = new BufferedReader(reader); while (true) { String str = bufferedReader.readLine(); if(!str.equals("")) { frame.getReceive().append("服务端:\n" + str + "\n"); }else{ frame.getReceive().append("\n"); } } }catch (Exception e){ e.printStackTrace(); } } }主类
public class ClientTest { public static void main(String[] args) { ClientFrame frame = new ClientFrame(); frame.setVisible(true); } }
服务端
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.PrintStream; import java.net.Socket; public class SeverFrame extends JFrame implements ActionListener{ private JLabel label = new JLabel("客户端程序"); private JTextArea receive = new JTextArea();//接收文本域 private JTextArea send = new JTextArea();//发送文本域 private JButton button = new JButton("发送"); private Socket sever; public void setSever(Socket sever) { this.sever = sever; } public JTextArea getReceive() { return receive; } public SeverFrame() { this.setLayout(null); this.setResizable(false); this.setBounds(200,200,550,450); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setBounds(230,30,200,30); label.setFont(new Font("Dialog",0,20)); this.getContentPane().setBackground(Color.PINK); this.add(label); JScrollPane scrollPane = new JScrollPane(receive);//将文本域加入到滚动面板中 scrollPane.setBounds(50,70,450,200); receive.setEditable(false);//设置文本框不可编辑 this.add(scrollPane); JScrollPane scrollPane1 = new JScrollPane(send); scrollPane1.setBounds(50,280,350,100); this.add(scrollPane1); button.setBounds(410,280,100,100); this.add(button); button.addActionListener(this); this.setVisible(true); } public void actionPerformed(ActionEvent e) { try { PrintStream printStream = new PrintStream(sever.getOutputStream()); printStream.println(send.getText()); receive.append("服务端:\n"+send.getText()+"\n"); send.setText(""); }catch (Exception e1){ e1.printStackTrace(); } } }
接收数据
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.InputStreamReader; import java.net.*; public class Server extends Thread{ private SeverFrame frame; private ServerSocket ss;//根据端口号,接收客户端连接 private Socket socket ; public Server() { frame = new SeverFrame(); try { ss = new ServerSocket(2018); socket = ss.accept(); frame.setSever(socket); frame.getReceive().append("与客户端连接成功!\n"); }catch (Exception e){ e.printStackTrace(); } } @Override public void run() { try { DataInputStream inputStream = new DataInputStream(socket.getInputStream()); InputStreamReader streamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(streamReader); while (true) { String str = reader.readLine(); if(!str.equals("")) { frame.getReceive().append("客户端:\n" + str + "\n"); }else{ frame.getReceive().append("\n"); } } } catch (Exception e) { e.printStackTrace(); } } }
主类
public class TestSever { public static void main(String[] args) { Server server = new Server(); server.start(); } }