一站式学习Java网络编程-学习手记
Posted 爱上口袋的天空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一站式学习Java网络编程-学习手记相关的知识,希望对你有一定的参考价值。
1.BIO阻塞模型
简述BIO模型中服务端与客户端的响应过程
- 服务器serverSocket先要和端口进行绑定
- 绑定完成后,执行accept方法,等待客户端的连接,这个方法是阻塞式调用,也就是说,要一直等待客户端的连接响应,不做其他事情,一直等,(被阻塞的还有InputStream.read()、OutputStream.write(),这两个也会一直等待客户端的响应)
- 客户端创建Socket对象,绑定服务器的ip地址与端口号,与服务器进行连接
- 服务器接收到客户端的连接请求,accept方法获取到客户端的socket信息,连接成功
- 服务器与客户端创建各自的io流,实现全双工通信之后便可以随时结束连接
2.代码解析
这里的BufferedReader运用了装饰器模式,包裹在另外一个输入数据流之上,
3. 简单实战演示
3.1 服务器
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
final String QUIT="quit";
//服务器端监听端口8888
final int DEFAULT_PORT=8888;
ServerSocket serverSocket=null;
try {
//绑定监听端口
serverSocket =new ServerSocket(DEFAULT_PORT);
System.out.println("启动服务器,监听默认端口"+DEFAULT_PORT);
while(true){
//等待客户端连接
Socket socket=serverSocket.accept();
System.out.println("客户端["+socket.getPort()+"]已经连接");
//BufferedReader创建一个缓冲区,降低直接访问数据源的频率
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
BufferedWriter writer=new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
String msg=null;
while ((msg=reader.readLine())!=null) {
//读取客户端发送的消息
System.out.println("客户端["+socket.getPort()+"]:"+msg);
//回复客户发送的消息
writer.write( "服务器:"+msg+"\\n");
//flush缓冲区所有数据全部发送出去
writer.flush();
//查看用户是否退出
if(QUIT.equals(msg)){
System.out.println("客户端["+socket.getPort()+"]已断开链接");
break;
}
}
}
}catch (IOException e) {
e.printStackTrace();
}finally{
if(serverSocket != null){
try {
serverSocket.close();
System.out.println("服务器端关闭serverSocket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.2 客户端
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
final String QUIT="quit";
//服务器端主机地址
final String DEFAULT_SERVER_HOST="127.0.0.1";
//端口号
final int DEFAULT_SERVER_PORT=8888;
Socket socket=null;
BufferedWriter writer=null;
try {
//创建Socket
socket=new Socket(DEFAULT_SERVER_HOST,DEFAULT_SERVER_PORT);
//创建IO流
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
writer=new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
//等待用户输入信息
BufferedReader consoleReader=
new BufferedReader(new InputStreamReader(System.in)
);
while (true) {
String input=consoleReader.readLine();
//发行消息给服务器
writer.write(input+"\\n");
writer.flush();
//读取服务器返回的消息
String msg=reader.readLine();
System.out.println(msg);
//查看用户是否退出
if(QUIT.equals(input)){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
System.out.println("关闭客户端socket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.3 响应结果
Server运行结果
Client运行结果
以上是关于一站式学习Java网络编程-学习手记的主要内容,如果未能解决你的问题,请参考以下文章