-
实例化Socket的过程就是连接服务端
-
的过程.连接不成功该构造方法会抛出
-
异常.
*/
socket = new Socket(“localhost”,
8088);
System.out.println(“与服务端建立连接!”);
} catch (Exception e) {
throw e;
}
}
/**
- 客户端的启动方法
*/
public void start() {
try {
/*
-
先启动用于接收服务端发送过来的消息的
-
线程
*/
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();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
那么如何才能正确的掌握Redis呢?
为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
-
并发编程面试题汇总
-
JVM面试题汇总
-
Netty常被问到的那些面试题汇总
-
Tomcat面试题整理汇总
-
Mysql面试题汇总
-
Spring源码深度解析
-
Mybatis常见面试题汇总
-
Nginx那些面试题汇总
-
Zookeeper面试题汇总
-
RabbitMQ常见面试题汇总
JVM常频面试:
Mysql面试题汇总(一)
Mysql面试题汇总(二)
Redis常见面试题汇总(300+题)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
些面试题汇总
-
Zookeeper面试题汇总
-
RabbitMQ常见面试题汇总
JVM常频面试:
[外链图片转存中…(img-dDQPchoJ-1712645621104)]
Mysql面试题汇总(一)
[外链图片转存中…(img-lbjj1MkH-1712645621104)]
Mysql面试题汇总(二)
[外链图片转存中…(img-uHPA2fGN-1712645621104)]
Redis常见面试题汇总(300+题)
[外链图片转存中…(img-ZBlmsSF1-1712645621105)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Aszl0s1s-1712645621105)]