Java 聊天室

来源:互联网 发布:linux用ubuntu 编辑:程序博客网 时间:2024/05/20 18:15

学习内容 : Socket , Thread, IO操作简单的GUI控件

效果图如下 :

这里写图片描述

界面可自行美化

代码如下

package com.hwaphon;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.Iterator;public class ServerClient {    private ArrayList<PrintWriter> mWriters;    public class MyHandler implements Runnable {        Socket mSocket;        BufferedReader mReader;        public MyHandler(Socket socket) {            mSocket = socket;            try {                InputStreamReader reader = new InputStreamReader(                        mSocket.getInputStream());                mReader = new BufferedReader(reader);            } catch (IOException e) {                e.printStackTrace();            }        }        @Override        public void run() {            String message = "";            try {                while ((message = mReader.readLine()) != null) {                    tellEveryone(message);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    public void start() {        mWriters = new ArrayList<>();        try {            ServerSocket serverSocket = new ServerSocket(5000);            while (true) {                Socket socket = serverSocket.accept();                PrintWriter pWriter = new PrintWriter(socket.getOutputStream());                mWriters.add(pWriter);                Thread thread = new Thread(new MyHandler(socket));                thread.start();                System.out.println("Got a connection");            }        } catch (IOException e) {            e.printStackTrace();        }    }    public void tellEveryone(String message) {        Iterator<PrintWriter> iterator = mWriters.iterator();        while (iterator.hasNext()) {            PrintWriter writer = iterator.next();            writer.println(message);            writer.flush();        }    }    public static void main(String[] args) {        new ServerClient().start();    }}package com.hwaphon;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import com.hwaphon.ServerClient.MyHandler;public class SocketClient {    private JFrame mFrame;    private JPanel mPane;    private JTextArea mArea;    private JScrollPane mScrollPane;    private JButton mButton;    private JTextField mField;    private Socket mSocket;    private PrintWriter mWriter;    private BufferedReader mReader;    public SocketClient() {        setUI();        setNetWork();        new Thread(new IncomingReader()).start();    }    private void setNetWork() {        try {            mSocket = new Socket("127.0.0.1", 5000);            mWriter = new PrintWriter(mSocket.getOutputStream());            mReader = new BufferedReader(new InputStreamReader(                    mSocket.getInputStream()));        } catch (UnknownHostException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    private void setUI() {        mButton = new JButton("Send");        mButton.setFocusable(false);        mButton.setBackground(Color.WHITE);        mButton.addActionListener(new SendListener());        mField = new JTextField(20);        mArea = new JTextArea(6, 18);        Font font = new Font("sanserif", Font.BOLD, 24);        mArea.setFont(font);        mArea.setLineWrap(true);        mArea.setWrapStyleWord(true);        mArea.setEditable(false);        mScrollPane = new JScrollPane(mArea);        mScrollPane                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        mScrollPane                .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);        mPane = new JPanel();        mPane.add(mScrollPane);        mPane.add(mField);        mPane.add(mButton);        mFrame = new JFrame();        mFrame.getContentPane().add(mPane, BorderLayout.CENTER);        mFrame.setSize(480, 320);        mFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        mFrame.setLocationRelativeTo(null);        mFrame.setVisible(true);    }    public class SendListener implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            String message = mField.getText().toString();            mWriter.println(message);            mWriter.flush();            mField.setText("");            mField.requestFocus();        }    }    public static void main(String[] args) {        SocketClient soClient = new SocketClient();    }    public class IncomingReader implements Runnable {        @Override        public void run() {            String message = "";            try {                while ((message = mReader.readLine()) != null) {                    mArea.append(message + "\n");                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

注意修改包名。

5 2
原创粉丝点击