计算机网络
网络中数据交流
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(); } }