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


浙公网安备 33010602011771号