客户端的代码:
package com;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class ChatClient {
private OutputStream out;
private InputStream is;
private Socket socket;
Frame f = new Frame("我的聊天室");
TextField tfip = new TextField(15); // 用户输入昵称的文本框
TextField tfdata = new TextField(20);//用户输入信息的文本框
List lst = new List(6); // 用于显示接收消息的列表框
public static void main(String[] args) {
ChatClient c = new ChatClient();
c.init();
}
public void init() {
f.setSize(300, 300);
f.add(lst);
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add("West", tfip);
p.add("East", tfdata);
f.add("South", p);
f.setVisible(true);
f.setResizable(false);// 限制用户设置窗体的大小
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
tfdata.addActionListener(new ActionListener() {// 填写完内容后,按下回车键所触发的事件
public void actionPerformed(ActionEvent e) {
// 有关网络发送信息的动作
try {
out = socket.getOutputStream(); // 获取Socket输出流
String ip = socket.getLocalAddress().getHostAddress(); // 获取客户IP
String name = tfip.getText() + "(" + ip + "):"; // 获取昵称
String text = name + tfdata.getText() + "\n"; // 为信息添加结束符
out.write(text.getBytes()); // 发送信息到服务器端
out.flush();
tfdata.setText(""); // 清空文本框内容
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
try {
socket = new Socket("192.168.65.1", 8888);
} catch (Exception e1) {
e1.printStackTrace();
}// 创建连接服务器的Socket
receiveMessage();// 启动接收信息的线程
}
public void receiveMessage() {// 接收信息的方法
new Thread() {// 创建线程
public void run() {
try {
is = socket.getInputStream();
Scanner scan = new Scanner(is);// 创建输入流扫描器
while (socket.isConnected()) {
String text = scan.nextLine() + "\n";// 读取一行信息
lst.add(text);// 把读取信息显示到文本域控件
sleep(100);// 线程休眠
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();// 线程启动
}
}
服务端的代码:
package com;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class ChatServer {
static ArrayList<Socket> clients = new ArrayList<Socket>();// Socket集合 泛型
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已经启动...........");
while (true) {
Socket socket = server.accept();// 接收客户端连接
clients.add(socket);// 把客户端保存到集合中
transmitMessage(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void transmitMessage(final Socket socket) throws IOException {
new Thread() {
private Scanner scan;
public void run() {
try {
InputStream is = socket.getInputStream(); // 获取客户端Socket输入流
scan = new Scanner(is);// 创建输入流扫描器
// 发送连接成功信息
socket.getOutputStream().write("连接成功....\n".getBytes());
} catch (IOException e1) {
e1.printStackTrace();
}
while (true) {
String text = scan.nextLine() + "\n";// 接收客户发送的信息
for (Socket client : clients) {
try {
OutputStream out = client.getOutputStream();// 获取每个客户端的输出流
out.write(text.getBytes());// 向每个客户端转发信息
out.flush();
} catch (IOException e) {
}
}
}
}
}.start();
}
}