客户端
package socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* 聊天室客户端
*/
public class Client {
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client() {
try {
System.out.println("正在连接服务端...");
socket = new Socket("localhost",8088);
System.out.println("与服务端连接成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 客户端开始工作的方法
*/
public void start() {
try {
//启动读取服务端发送过来消息的线程
ServerHandler handler = new ServerHandler();
Thread t = new Thread(handler);
t.start();
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
BufferedWriter bw= new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw,true);
Scanner scanner = new Scanner(System.in);
while(true) {
String line = scanner.nextLine();
pw.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
private class ServerHandler implements Runnable{
public void run() {
try {
//通过socket获取输入流读取服务端发送过来的消息
InputStream in = socket.getInputStream();
InputStreamReader isr= new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
String message;
while((message = br.readLine())!=null) {
System.out.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
服务端
package socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
/**
* 聊天室服务端
* @author pc
*
*/
public class Server {
private ServerSocket server;
private PrintWriter[] allOut = {};
/**
* 构造方法,用来初始化服务端
*/
public Server() {
try {
System.out.println("正在启动服务端...");
server = new ServerSocket(8088);
System.out.println("服务端启动完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 服务端开始工作的方法
*/
public void start() {
try {
while(true) {
System.out.println("等待客户端连接...");
Socket socket = server.accept();
System.out.println("一个客户端连接了!");
//启动一个线程处理该客户端交互
ClientHandler handler = new ClientHandler(socket);
Thread t = new Thread(handler);
t.start();
System.out.println("启动了线程"+t+"来处理该客户端交互");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
/**
* 该线程任务是负责与指定的客户端进行交互
*/
private class ClientHandler implements Runnable{
private Socket socket;
private String host;//记录客户端的IP地址
public ClientHandler(Socket socket) {
this.socket = socket;
//通过socket得到远端计算机IP地址(客户端)
host = socket.getInetAddress().getHostAddress();
}
public void run() {
PrintWriter pw = null;
try {
//运行当前任务的线程
Thread t = Thread.currentThread();
InputStream in = socket.getInputStream();
InputStreamReader isr= new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
/*
* 通过socket获取输出流,以便给客户端回复消息
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw= new OutputStreamWriter(out,"UTF-8");
BufferedWriter bw= new BufferedWriter(osw);
pw = new PrintWriter(bw,true);
//将对应当前客户端的输出流存入共享数组allOut
synchronized (allOut) {
//1对allOut数组扩容
allOut = Arrays.copyOf(allOut, allOut.length+1);
//2将当前客户端的输出流存入该数组最后位置
allOut[allOut.length-1] = pw;
}
System.out.println(host+"上线了!当前在线人数:"+allOut.length);
String message;
while((message = br.readLine())!=null) {
System.out.println(host+"说:"+message);
//将消息回复给所有客户端
synchronized (allOut) {
for(PrintWriter o : allOut) {
o.println(host+"说:"+message);
}
}
}
} catch (Exception e) {
} finally {
//在这里处理客户端断开连接后的操作
//将当前客户端输出流pw从allOut中删除
synchronized (allOut) {
for(int i=0;i<allOut.length;i++) {
if(allOut[i]==pw) {
allOut[i] = allOut[allOut.length-1];
allOut = Arrays.copyOf(
allOut, allOut.length-1);
break;
}
}
}
System.out.println(
host+"下线了,当前在线人数:"+allOut.length);
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
学习记录