JAVA网络编程设计

设计网络聊天程序,实现如下功能:

(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();
    }
}



猜你喜欢

转载自blog.csdn.net/weixin_42103959/article/details/80598741
今日推荐