服务器server端
private ServerSocket server;// 创建了ServerSocket对象
// 存放所有客户端输出流的集合,并初始化
private List<PrintWriter> allOut = new ArrayList<PrintWriter>();
// 向集合中添加元素
private synchronized void addOut(PrintWriter out) {
allOut.add(out);
}
// 从集合中删除元素
private synchronized void removeOut(PrintWriter out) {
allOut.remove(out);
}
// 遍历集合向所有的客户端发送信息
private synchronized void sendMessage(String msg) {
for (PrintWriter out : allOut) {
out.println(msg);
}
}
/**
* 构造方法,用来初始化ServerSocket
*
* @throws IOException
*/
public Server() throws IOException {
try {
server = new ServerSocket(8088);
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
public void start() throws IOException {
while (true) {
try {
Socket socket = server.accept();
/**
* 当一个客户端连接后,应该启动一个线程,来负责与客户端的交互 这样才能循环接待不同的客户端
*/
ClientHandler hander = new ClientHandler(socket);
Thread thread = new Thread(hander);
// 启动线程
thread.start();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
}
public static void main(String[] args) {
Server server = null;
try {
server = new Server();
server.start();
} catch (IOException e) {
System.out.println("服务器启动失败");
}
}
/**
* 启动线程的成员内部类
*
* @author Admin
*
*/
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
PrintWriter writer = null;
try {
// 向客户端发送信息
writer = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream(), "utf-8"), true);
addOut(writer);
// 读取客户端的信息
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8"));
String msg = null;
while ((msg = reader.readLine()) != null) {
// 将客户端发送过来的信息转发给客户端
sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 处理客户端断开连接后的工作
// 将客户端的输出流从集合中移除
removeOut(writer);
}
}
}
客户端client端
// 创建与服务端通讯的Socket
private Socket socket;
public Client() throws IOException {
try {
socket = new Socket("localhost", 8088);
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
// 客户端开始工作的方法
public void start() {
// 启动线程,用于读取服务端发送过来的信息
ServerHandler handler = new ServerHandler();
Thread thread = new Thread(handler);
// 启动线程
thread.start();
/**
* 循环从控制台输入信息发送至服务端
*/
Scanner sca = new Scanner(System.in);
try {
PrintWriter writer = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream(), "utf-8"), true);
String msg = null;
while (true) {
msg = sca.nextLine();
writer.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client c = null;
try {
c = new Client();
c.start();
} catch (IOException e) {
System.out.println("连接失败");
}
}
// 读取服务端发送过来的信息的线程
class ServerHandler implements Runnable {
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8"));
String msg = null;
while ((msg = reader.readLine()) != null) {
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
感谢分享,赞一个