/*
-
先启动用于接收服务端发送过来的消息的
-
线程
*/
ServerHandler handler = new ServerHandler();
Thread t = new Thread(handler);
t.start();
Scanner scanner = new Scanner(System.in);
/*
-
Socket提供了方法:
-
OutputStream getOutputStream()
-
该方法可以获取一个字节输出流,通过
-
该输出流写出的数据会发送至远端计算机
-
对于客户端这边而言远端就是服务端.
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, “UTF-8”);
PrintWriter pw = new PrintWriter(osw, true);
String message = null;
while (true) {
message = scanner.nextLine();
pw.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Client client = new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
该线程负责循环接收服务端发送过来的消息
-
并输出到客户端的控制台
*/
class ServerHandler implements Runnable{
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(
socket.getInputStream(),
“utf-8”
)
);
String message = null;
while((message=br.readLine())!=null){
System.out.println(“服务端:”+message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
-
聊天室服务端
-
@author Cher_du
*/
public class Server {
/*
-
java.net.ServerSocket
-
运行在服务端的ServerSocket有两个作用
-
1.申请服务端口(客户端通过该端口与服务端建立连接)
-
2.监听服务端口,等待客户端连接,一旦客户端连接则
-
创建一个Socket实例用于与该客户端交互.
*/
private ServerSocket server;
/*
*该集合用于保存所以客户端的Socket(数据流)
*/
private List allOut;
public Server() throws Exception{
try {
allOut = new ArrayList();
/*
-
实例化ServerSocket需要指定
-
服务端口.该端口不能与当前操作系统
-
其他程序申请的端口冲突,否则会抛出
-
端口被占用异常
*/
server = new ServerSocket(8088);
} catch (Exception e) {
throw e;
}
}
/**
- 将给定的输出流存入共享集合
*/
private synchronized void addOut(PrintWriter out){
allOut.add(out);
}
/**
- 将给定的输出流从共享集合中删除
*/
private synchronized void removeOut(PrintWriter out){
allOut.remove(out);
}
/**
- 将给定的消发送给所以的客户端
*/
private synchronized void sendMessage(String message){
for(PrintWriter out :allOut){
out.println(message);
}
}
public void start() {
try {
/*
-
ServerSocket提供一个方法:
-
Socket accept()
-
该方法是一个阻塞方法,作用是监听
-
ServerSocket开启的服务端口,
-
直到一个客户端通过该端口连接,该方法
-
才会解除阻塞,并返回一个Socket实例
-
通过该Socket实例与刚刚建立连接的
-
客户端进行通信.
*/
while (true) {
System.out.println(“等待客户端连接…”);
Socket socket = server.accept();
System.out.println(“一个客户端连接了!”);
/*
*当一个客户端连接后,启动一个线程来处理
*与该客户端的交互工作.
*/
ClientHandlerWriter clientHandler = new ClientHandlerWriter(socket);
Thread t = new Thread(clientHandler);
t.start();
ClientHandlerRead clientHandler2 = new ClientHandlerRead(socket);
Thread t2 = new Thread(clientHandler2);
t2.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Server server = new Server();
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
该线程负责与指定的客户端进行交互
-
@author Cher_du
*/
class ClientHandlerWriter implements Runnable{
/**
- 当前线程负责与指定客户端交互的Socket
*/
private Socket socket;
//客户端的地址信息
private String host;
public ClientHandlerWriter(Socket socket){
this.socket = socket;
/*
-
通过socket获取远程计算机地址信息
-
对于服务端而言,远程计算机就是客户端
*/
InetAddress address = socket.getInetAddress();
//获取远端计算机的IP
host = address.getHostAddress();
}
@Override
public void run() {
PrintWriter pw = null;
try {
/*
*通过Socket创建输出流,用于将消息
*发送给客户端
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,“utf-8”);
pw = new PrintWriter(osw,true);
/*
-
br.readLine读取客户端发送过来的一行字符串
-
时,客户端断开连接时,由于客户端所在系统不同,
-
这里readLine方法的执行结果也不相同:
-
当windows的客户端断开连接时,readLine方法
-
会直接抛出异常
-
当Linux的客户端断开连接时,readLine方法会
-
返回null.
*/
// while((message = br.readLine())!=null){
// System.out.println(host+“说:”+message);
// //pw.println(host+“说:”+message);
// //转发给所有客户端
// sendMessage(host+“说:”+message);
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
message);
// //pw.println(host+“说:”+message);
// //转发给所有客户端
// sendMessage(host+“说:”+message);
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
[外链图片转存中…(img-NqYbNOdC-1714369198266)]
[外链图片转存中…(img-bWaAD2Ws-1714369198266)]
更多笔记分享
[外链图片转存中…(img-KPP19Qu8-1714369198267)]