目录
1. Tomcat
1.1 Tomcat帮助启动http服务器。
1.2 tomcat理解:
2. 计算机网络最基本的流程
2.1 信息是怎么来的?
2.2 端口是干什么的?
3. 简单的Socket案例
服务端
客户端
启动:
3.2 在Tomcat发送信息,看能不能接收到
1. Tomcat
大公司的MVC框架都是自己设计搭建的。
Tomcat---本身只是一个web容器,这个容器能够承载项目。
1.1 Tomcat帮助启动http服务器。
解释:xxxDemo 自己写好的项目,外部是无法通过http访问到这个写好的项目的,那么我们把它放进tomcat中,然后启用http,外部就能够访问了。
http是网络访问形式,
1.2 tomcat理解:
比如,
我们写一个a.html,在网页上打开显示访问方式:
我们想要http访问,可以:
把它放进tomcat中。
我们直接打开tomcat
所有的项目都在 tomcat 下的webapps目录下。
我们在 tomcat 的 webapps 下直接新建一个文件夹(其实就是新建一个项目),起名叫 'myweb' , 把我们写的 a.html文件放进这个文件夹中,启动tomcat。
.bat文件是Windows的启动。
启动之后再访问a.html,此时的访问是http的访问形式。
总结:
tomcat:是服务器---->能让其中配置的项目接受http请求。
2. 计算机网络最基本的流程
1> 操作系统做网络的问答。
2> 应用程序在操作系统之上。
3> 应用程序通过Socket与操作系统通讯。
4> 操作系统之下是物理硬件--网卡。
网卡通过导线相连(即网线),两个网卡通过大型的计算机网络相连。
网卡就是 接收 和 发送 0101这样信号的。
这就是计算机网络最基本的流程。
总结:
Socket就是两个软件之间的通讯保证。
2.1 信息是怎么来的?
Tomcat本身就是一个应用软件,如果我们现在去掉操作系统。
如果一个信息发送过来,肯定是先打到网卡,然后通过Socket,最后把 当前信息 给到 应用程序Tomcat中。
2.2 端口是干什么的?
网卡上设置有端口。
网卡:什么样的信息都可以发送到网卡。
操作系统之上运行有各种各样的软件(WX,QQ,Tomcat...),那么,怎么把当前信息准确地发到对应的软件?
答:通过端口。
比如:
与微信上的女朋友说:I love you.
与QQ上的女朋友说“今晚一起吃饭。”
如何发送到对应的软件?
要想被识别,信息必须带上端口号,才能对应上。
3. 简单的Socket案例
打开IDEA,新建项目,选择java项目,SDK默认即可,其余都不选,下一步取个名字 ’javaDemo‘。
过程:
首先,新建一个客户端,起名’SocketClient‘
客户端是发送信息的。可以理解为浏览器。
再新建一个类,’SocketServer‘
服务器端,类比于tomcat,接收信息。
服务端
在服务端:
写个run()方法
1.创建Socket:
监听4747端口(我们所能监听的端口,0--65535,因为端口只有这些)
public static void run() throws IOException {
ServerSocket serverSocket=new ServerSocket(4747);//端口的范围:0--65535
}
2. 写一个循环等待客户的连接
while(true){
}
while(true)本身是一个死循环,为了不让程序卡死,我们调用一个 serverSocket.accept() 方法,阻塞监听:只有监听到客户端的信息后才会向下执行。
Socket socket = serverSocket.accept();//阻塞监听,只有监听到客户端的信息后才会向下执行
3.下一步输出客户端给我们发来的程序。
socket.getInputStream() 打开当前的输入流,接收输入的信息。
InputStream inputStream = socket.getInputStream();//打开输入流:接收输入的信息
输入的字节流信息按字节流读取:read()阻塞
从Socket上读取对端发过来的数据一般有两种方法:
1)按照字节流读取BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); int r = -1; List<Byte> l = new LinkedList<Byte>(); while ((r = in.read()) != -1) { l.add(Byte.valueOf((byte) r)); }
2)按照字符流读取BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String s; while ((s = in.readLine()) != null) { System.out.println("Reveived: " + s); }
这两个方法 read() 和 readLine() 都会读取对端发送过来的数据,如果无数据可读,就会阻塞直到有数据可读。或者到达流的末尾,这个时候分别返回-1和null。
这个特性使得编程非常方便也很高效。
信息量是多少,输入流就是0101这样的数据,最后把0101数据转换成String类型的字符串数据。
int count=0;
while(count==0){
count= inputStream.available();
}
byte[] bytes=new byte[count];//010101001
inputStream.read(bytes);
String context=new String(bytes);
System.out.println(context);
客户端
1. 创建Socket
Socket socket=new Socket("127.0.0.1",4747);
本地端口号是'127.0.0.1', 向 4747 端口号传信息。
2. 打开输出流,建立Socket连接
getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
OutputStream outputStream = socket.getOutputStream();
3. 打印输出流
PrintStream printStream=new PrintStream(outputStream);
System.out.println("hello");
若想输入自己想要的东西
Scanner scanner=new Scanner(System.in);
String context = scanner.nextLine();
printStream.println(context);
4. 关闭输出流
close()方法用于关闭基础输出流。
启动:
先启动服务器端,让他处于随时的监听状态。
再启动客户端。
3.2 在Tomcat发送信息,看能不能接收到
首先,运行服务器。
Tomcat:
4747端口发送aaaaaa.ssss
能够接收到。
就是说,当前服务端能直接接收浏览器传输的信息的。