计算机网络
网络中数据交流
IP:
Ipv4:
32位,唯一标识计算机
Ipv6:
128位
端口号:
唯一标识进程(软件)找到是程序
package cn.jiedada.getip;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//DESKTOP-0H89I0E/172.16.9.175
InetAddress[] allByName = InetAddress.getAllByName("DESKTOP-0H89I0E");
for (InetAddress inetAddress : allByName) {
System.out.println(inetAddress);
}
InetAddress name = InetAddress.getByName("baidu.com");
System.out.println(name);
InetAddress name2 = InetAddress.getByName("taobao.com");
System.out.println(name2);
}
}
URL
IP+端口号+urs(什么文件夹下的什么文件)

package cn.jiedada.url;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
public class UrlTest {
public static void main(String[] args) throws Exception {
/*获得豆瓣的网址
* 获得一个输入流和一个输出流
* 把输入byte数组存入流中
* 通过int来存入字节大小
* */
URL url = new URL("http://www.douban.com");
InputStream is = url.openStream();
FileOutputStream fos = new FileOutputStream("F:\\log\\db.html");
byte[] buff=new byte[1024*10];
int len;
while ((len=is.read(buff))!=-1) {
fos.write(buff, 0, len);
}
fos.close();
is.close();
}
}
TCP
传输层层:数据传输的方式,可靠的,安全的,基于字节流的传输,如果超时没有收到消息就会再次发送连接,通常用于下载文件,等等需要完整的上传和下载的时候,缺点:速度慢
UDP
和TCP一样的传输层,不可靠的,基于数据报的传输协议,不用建立连接
速度块,不占用资源,用于QQ等这样的软件中
Socket编程
套接字编程主要为SOCKET客户机和server socket服务器两个套接字,通过服务器的对象.accpt()方法获得客户机和服务器的连接然后通过
TCP编程
三次握手:假设有2个A,B
A发送一次信息给B,B收到后返回给A,A收到后在发送给B,就能确定双方都收到了消息
客户机

package cn.jiedada.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientTest {
private Socket socket;
public ClientTest() throws IOException {
System.out.println("创建一个客户端");
socket=new Socket("localhost", 8088);
}
public void start() throws IOException{
//接收
OutputStream os = socket.getOutputStream();
//OutputStreamWriter osw = new OutputStreamWriter(os,"utf-8");
PrintWriter pw = new PrintWriter(os, true);
pw.println("你好呀");
//接受消息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
pw.close();
os.close();
}
public static void main(String[] args) throws IOException {
ClientTest ct = new ClientTest();
ct.start();
}
}
服务器

package cn.jiedada.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
//创建服务器和端口号
private ServerSocket serverSocket;
public ServerTest() throws IOException {
System.out.println("初始化服务器");
serverSocket=new ServerSocket(8088);
}
//因为涉及流的关闭所以在这里我们选择对异常进行抓取不抛出
//想法二因为这里不需要打包为一个jar包所以这里最好用的方法是try(){}catch{}
public void start() {
//监听客户端并且阻塞该方法
System.out.println("监听");
Socket accept;
InputStream is = null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
accept = serverSocket.accept();
System.out.println(accept.getInetAddress());
//获得流
is= accept.getInputStream();
/*一个inputstreamreader是桥从字节流字符流:将字节数组解码成文字使用指定的 charset。
字符集,它使用可指定名称或可给予明确,或平台的默认字符集可以接受。
每次调用一个inputstreamreader的read()方法可能会导致一个或多个字节是从底层字节输入流中读取。
为了使字节的有效转换为字符,更多的字节可以从底层流读取,而不是满足当前读操作的必要。*/
isr = new InputStreamReader(is, "utf-8");
/*char[] cs=new char[1];
int len;
while ((len=isr.read(cs))!=-1) {
System.out.print(cs);
}*/
br = new BufferedReader(isr);
String rl = br.readLine();
System.out.println(rl);
//写回给客户端
os = accept.getOutputStream();
pw = new PrintWriter(os,true);
pw.println("收到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
is.close();
isr.close();
br.close();
os.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
}
public static void main(String[] args) throws IOException {
ServerTest st = new ServerTest();
st.start();
}
}
HTTP协议
是应用层的协议解决包装问题
分为请求文报和响应文报主要还是对psot请求的解决
请求行
请求头
请求体
TOMCAT模拟
首先创建一个服务器,通过输入和输出流将文件读取出来,再通过HTTP协议将文件发布到浏览器中,通过输入IP和PORT访问

package cn.jiedada.tomcatsimulation;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**首先创建一个服务器
* 把网站发布到服务器中
* 然后通过服务器访问到。mthl文件
* 怎么访问html呢,通过自己写入方法读取文件内容
* input和output
* 还必须通过HTTP协议才能把网站发布出去
* @author 杰大大是真滴帅
*
*/
public class IpPortStartServerTest {
private ServerSocket ss;
public IpPortStartServerTest() {
try {
//初始化成功
ss =new ServerSocket(8088);
start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void start(){
try {
Socket accept = ss.accept();
/*遇到的问题1这样读写有什么用呢?需要读入缓存区这样能提高速率
* 怎么把输入流和输出流串联起来呢,通过方法;(这是之前没有理解到的地方)
* */
File file = new File("F:\\JAVAEE\\2019_08_16_HTML_CSS\\WebContent\\homework.html");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(isr);
OutputStream os = accept.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
PrintWriter pw = new PrintWriter(osw, true);
//读入和写出过后是先发布到http协议还是输入流和输出流串联起来
//响应测试页面
pw.println("http/1.1 200 OK");
pw.println("Context-Type:text/html;charset=utf-8");
pw.println("Context-Length"+file.length());
pw.println();
//需要要写这样才知道
String s;
while ((s=br.readLine())!=null) {
pw.write(s);
}
pw.close();
os.close();
br.close();
isr.close();
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new IpPortStartServerTest();
}
}
