⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatclient.java

📁 java入门经典教程 java入门经典教程 java入门经典教程
💻 JAVA
字号:
// 例8.5.1 ChatClient.java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class ChatClient extends JPanel
{
    private InputStream inputStream;
    private OutputStream outputStream;
    private JTextField sayText = new JTextField();
    private Socket socket;
    private DefaultListModel listModel = new DefaultListModel();
    private JList list = new JList(listModel);
    private JTextField nameText = new JTextField(10);
    private BufferedOutputStream bos;
    private JButton sendButton = new JButton("发送");
    private String host = "127.0.0.1";
    private int port = 8082;

    public void init()
{
        nameText.setText("DefaultName");
        setLayout(new BorderLayout());
        add(this.getContextPanel(), BorderLayout.CENTER);
        add(this.getButtomPanel(), BorderLayout.SOUTH);
        this.startClient(host, port);
    }

    public static void main(String[] args) 
{
        JFrame frame = new JFrame("Chat Client");
        frame.setSize(400, 500);
        frame.setLocation(150, 50);
        ChatClient chatClient = new ChatClient();
        chatClient.init();
        frame.getContentPane().add(chatClient);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setVisible(true);
    }
private boolean flag = true;
// startClient与服务器建立连接并获取输入输出流
    private void startClient(String host, int port) 
{
        try
{
            socket = new Socket(InetAddress.getByName(host), port);
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
            bos = new BufferedOutputStream(outputStream, 1024);
            System.out.println(bos);
            new ResevWord(inputStream).start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            flag = false;
        }
}
// sendData将数据发往服务器
    private void sendData() 
{
        String word = nameText.getText() + "说:" + sayText.getText();
        try
{
            bos.write(word.getBytes());
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        sayText.setText("");
}
// ResevWord可用于创建新的线程,用于接收数据
    class ResevWord extends Thread
{
        InputStream ips = null;
        BufferedInputStream bis = null;
        byte[] bytes = new byte[1024];
        public ResevWord(InputStream ips)
 {
            this.ips = ips;
            bis = new BufferedInputStream(ips, 1024);
        }
        public void run() 
{
            while (flag)
{
                try 
{
                    try
{
                        bis.read(bytes);
                        String word = new String(bytes);
                        word = word.trim();
                        listModel.add(0, word);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        flag = false;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private JPanel getContextPanel()
{
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JPanel p1 = new JPanel();
        p1.add(new JLabel("我的名字:"));
        p1.add(nameText);
        panel.add(p1, BorderLayout.NORTH);
        panel.add(new JScrollPane(list), BorderLayout.CENTER);
        return panel;
    }
    private JPanel getButtomPanel() 
{
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(sayText, BorderLayout.CENTER);
        sendButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendData();
            }
        });
        panel.add(sendButton, BorderLayout.EAST);
        return panel;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -