设计网络聊天程序,实现如下功能:
(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();
}
}