java聊天程序源码
一.客户端程序,有窗口,可以输入、显示所有人发的信息
- import java.awt.BorderLayout;
- import java.awt.Button;
- import java.awt.TextArea;
- import java.awt.TextField;
- 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.PrintStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import javax.swing.JFrame;
- @SuppressWarnings("serial")
- public class Client extends JFrame {
- TextArea textArea = new TextArea();// 创建一个文本域
- TextField textField = new TextField();// 创建一个文本框
- Button button_send = new Button("发送");
- Button button_clear = new Button("清屏");
- static Socket clientLink;
- BufferedReader br;
- PrintStream ps;
- String msg;
- StringBuffer sb = new StringBuffer();
- static {
- try {
- clientLink = new Socket("127.0.0.1",8888);
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public Client() {
- super("客户端");
- }
- public void runClient() {
- this.setLocation(400, 450);
- this.setSize(400, 400);
- this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中
- this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中
- this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中
- this.add(button_clear, BorderLayout.WEST);
- this.setVisible(true);// 窗体是否可见
- this.pack();// 自动调整布局
- textField.setText("请输入信息");
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- try {
- br = new BufferedReader(new InputStreamReader(clientLink
- .getInputStream()));
- ps = new PrintStream(clientLink.getOutputStream());
- // 发送按钮事件
- button_send.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- msg = textField.getText();
- System.out.println(msg);
- // 这里不能用缓冲流,向服务器发送信息
- ps.println(msg);
- ps.flush();
- }
- });
- // 回车时,文本域事件
- textField.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- msg = textField.getText();
- // 这里不能用缓冲流写
- ps.println(msg);
- ps.flush();
- }
- });
- // 清屏按钮事件
- button_clear.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- textArea.setText("");
- sb.delete(0, sb.length());
- }
- });
- // 接受服务器信息
- while (true) {
- msg = br.readLine();
- sb.append(msg + "\n");
- textArea.setText(sb.toString());
- textField.setText("");
- }
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (null != clientLink) {
- clientLink.close();
- }
- if (null != br) {
- br.close();
- }
- if (null != ps) {
- ps.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) {
- new Client().runClient();
- }
- }
package com.adu.client; import java.awt.BorderLayout; import java.awt.Button; import java.awt.TextArea; import java.awt.TextField; 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.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JFrame; @SuppressWarnings("serial") public class Client extends JFrame { TextArea textArea = new TextArea();// 创建一个文本域 TextField textField = new TextField();// 创建一个文本框 Button button_send = new Button("发送"); Button button_clear = new Button("清屏"); static Socket clientLink; BufferedReader br; PrintStream ps; String msg; StringBuffer sb = new StringBuffer(); static { try { clientLink = new Socket("127.0.0.1",8888); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public Client() { super("客户端"); } public void runClient() { this.setLocation(400, 450); this.setSize(400, 400); this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中 this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中 this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中 this.add(button_clear, BorderLayout.WEST); this.setVisible(true);// 窗体是否可见 this.pack();// 自动调整布局 textField.setText("请输入信息"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { br = new BufferedReader(new InputStreamReader(clientLink .getInputStream())); ps = new PrintStream(clientLink.getOutputStream()); // 发送按钮事件 button_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { msg = textField.getText(); System.out.println(msg); // 这里不能用缓冲流,向服务器发送信息 ps.println(msg); ps.flush(); } }); // 回车时,文本域事件 textField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { msg = textField.getText(); // 这里不能用缓冲流写 ps.println(msg); ps.flush(); } }); // 清屏按钮事件 button_clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { textArea.setText(""); sb.delete(0, sb.length()); } }); // 接受服务器信息 while (true) { msg = br.readLine(); sb.append(msg + "\n"); textArea.setText(sb.toString()); textField.setText(""); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != clientLink) { clientLink.close(); } if (null != br) { br.close(); } if (null != ps) { ps.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Client().runClient(); } }
二.服务器端实现了线程的控制,只要启动就可以监听客户端的请求以及发送的消息
- package com.adu.server;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author GYH
- *
- */
- public class Server {
- static ServerSocket server;
- Socket clientLink;
- List<Socket> clientLinkList = new ArrayList<Socket>();
- int count;
- static {
- try {
- // 开启服务器
- server = new ServerSocket(8888);
- System.out.println("服务器已启动!");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void runServer() {
- try {
- while (true) {
- clientLink = server.accept();
- System.out.println("连接数:" + (++count));
- clientLinkList.add(clientLink);
- ServerThread st = new ServerThread(clientLinkList, clientLink);
- new Thread(st).start();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Server server = new Server();
- server.runServer();
- }
- }
package com.adu.server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * @author GYH * */ public class Server { static ServerSocket server; Socket clientLink; List<Socket> clientLinkList = new ArrayList<Socket>(); int count; static { try { // 开启服务器 server = new ServerSocket(8888); System.out.println("服务器已启动!"); } catch (IOException e) { e.printStackTrace(); } } public void runServer() { try { while (true) { clientLink = server.accept(); System.out.println("连接数:" + (++count)); clientLinkList.add(clientLink); ServerThread st = new ServerThread(clientLinkList, clientLink); new Thread(st).start(); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.runServer(); } }
- package com.adu.server;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- import java.util.List;
- public class ServerThread implements Runnable {
- List<Socket> clientLinkList;
- Socket clientLink;
- BufferedReader br;
- PrintStream ps;
- String msg;
- String ip;
- public ServerThread(List<Socket> clientLinkList, Socket clientLink) {
- this.clientLinkList = clientLinkList;
- this.clientLink = clientLink;
- }
- @Override
- public void run() {
- try {
- br = new BufferedReader(new InputStreamReader(clientLink
- .getInputStream()));
- //获得当前用户的IP
- ip=clientLink.getInetAddress().getHostAddress();
- //把当前用户发来的信息发送给所有用户.
- while (null != (msg=br.readLine())) {
- for (int i = 0; i < clientLinkList.size(); i++) {
- ps = new PrintStream(clientLinkList.get(i)
- .getOutputStream());
- ps.println("IP为:"+ip+"的朋友说:"+msg+"\n");
- ps.flush();
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- try {
- if(null!=clientLink){
- clientLink.close();
- }
- if(null!=br){
- br.close();
- }
- if(null!=ps){
- ps.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }