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);
// }
Scanner scanner = new Scanner(System.in);
String message = null;
while (true) {
message = scanner.nextLine();
pw.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ClientHandlerRead implements Runnable{
/**
- 当前线程负责与指定客户端交互的Socket
*/
private Socket socket;
//客户端的地址信息
private String host;
public ClientHandlerRead(Socket socket){
this.socket = socket;
/*
-
通过socket获取远程计算机地址信息
-
对于服务端而言,远程计算机就是客户端
*/
InetAddress address = socket.getInetAddress();
//获取远端计算机的IP
host = address.getHostAddress();
}
@Override
public void run() {
PrintWriter pw = null;
try {
sendMessage(host+“上线了!”);
/*
*通过Socket创建输出流,用于将消息
*发送给客户端
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,“utf-8”);
pw = new PrintWriter(osw,true);
//将该客户端的输出流存入共享集合
addOut(pw);
最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
;
OutputStreamWriter osw = new OutputStreamWriter(out,“utf-8”);
pw = new PrintWriter(osw,true);
//将该客户端的输出流存入共享集合
addOut(pw);
最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
[外链图片转存中…(img-XYmUebMx-1714369128363)]
[外链图片转存中…(img-FZmJLswZ-1714369128364)]
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!