网络编程: 

 
 
 
 

  网络模型 
 
 OSI参考模型: 
 
 应用层:将数据封装一下                         应用层 
 
 表示层:                                       表示层 
 
 会话层:                                      会话层: 
 
 传输层:                                      传输层             
 
 网络层:付给封装的数据IP地址                   网络层 
 
 数据链路层:                                  数据链路层 
 
 物理层:网线、蓝牙。。是物理层设备 ————    物理层         
 
 
 
 

  整个下来就叫数据封包                              拆包 
 
 TCP/IP参考模型: 
 
 应用层----HTTP/FTP协议 
 
 传输层---TCP/IP 
 
 网际层----IP 
 
 主机至网络层 
 
 
 
 

  网络通信要素:ip地址、端口号 、传输协议 
 
 java.net包 
 
 1、IP地址:用于描述IP对象的类、InetAddress 
 
  InetAddress i=InetAddress.getLocalHost();//获得本机IP对象 
 
           i.getHostAddress();//获取本机地址 
 
 如何获取任意主机地址?? 
 
 InetAddress  ir=InetAddress.getByName("192.168.1.234")//传入你要解析的IP地址可以传入主机名 但要解析很慢主张IP地址 
 
 例如百度肯定不是一台主机 
 
 
 
 
 
 
 
 
 
 
 
 
 127.0.0.1 没有配置任何IP地址默认本机回环地址 
 
 
 
 

  2、端口 
 
 数据要求发送到对方指定的应用程序上。为了标识这些应用程序所以这些网络应用程序都用数字标识, 
 
 为了方便称呼这个数字叫做端口 :逻辑端口0-65535 (0-1024最好不要用) 
 
 3、定义通信规则。就是协议 
 
 国际组织定义了通用协议:TCP/IP 
 
 
 
 

  UDP   QQ,寄包裹、网络视频会议 
 
 将数据及源和目的封装称数据包中,不需要建立连接 
 
 每个数据包的大小限制在64K内 
 
 因无连接,是不可靠协议 
 
 不需要建立连接,速度快、 
 
 
 
 

  TCP 
 
 建立连接,形成传输数据的通道 
 
 在链接中进行大数据量传输、 
 
 通过三次握手完成连接,是可靠协议 
 
 必须建立连接,效率会降低 
 
 
 
 

  网络编程即Socket 为网络编程提供的一种机制 

 
 
 
 

  需求:定义一个udp传输方式,用于发送数据 
 
 思路: 
 
 1、定义一个socket服务 DatagramSocket 
 
 2、将数据封装到数据包中 DatagramPacket 
 
 3、通过DatagramSocket里发送方法send()发送数据 
 
 4、关闭资源 
 
 
 
 
 
 
 需求:定义一个udp传输方式用于接收数据 
 
 思路: 
 
 1、定义udpsocket服务。通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识、、 
 
 方便于明确哪些数据过来该应用程序可以处理 
 
 2、先定义一个字节数组然后定义一个数据包用于存储接受的数据DatagramPacket 
 
 因为数据包有更多的功能来取出不同数据 
 
 3、通过socket服务的receive方法来存储在已定义好的数据包中 
 
 4、通过数据包对象的特有功能将这些数据取出打印在控制台上 
 
 5、关闭资源 
 
 
 
 

  UDP键盘录入方式数据: 
 
 DatagramSocket ds = new DatagramSocket(); 
 
 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in)); 
 
 String line = null; 
 
 while ((line = bfr.readLine()) != null) { 
 
 if (line.equals("886")) { 
 
  break; 
 
  } 
 
 byte[] buf = line.getBytes();//把键盘录入数据 
 
 DatagramPacket dp = new DatagramPacket(buf, buf.length, 
 
 InetAddress.getByName("127.0.0.1"), 10005); 
 
 ds.send(dp); 
 
 
 
 

  } 
 
 ds.close(); 
 
 
 
 
 
 
 TCP传输: 
 
 1、tcp分客户端 和服务端 
 
 2、客户端对应的对象是Socket 服务端对应的对象是ServerSocket 
 
 
 
 

  客户端 

 
 
 
 

  1、创建客户端服务对象Socket() 
 
       并指定连接的主机和端口 
 
 Socket s=new Socket("服务器端的ip地址",端口号); 
 
 2、为了发送数据应获取socket流中的输出流 
 
 OutputStream out=s.getOutputStream(); 
 
 out.write("tcp wo lai le".getBytes()); 
 
 s.close(); 
 
 
 
 
 
 
 服务端: 
 
 1、建立服务端的socket服务 ServeSocket  并监听一个端口 
 
 ServerSocket ss=new ServerSocket(10006); 
 
 2、获取连接过来的客户端对象 
 
 通过ServerSocket的accept方法。没有连接就会等,所以这个方法是阻塞式的 
 
 
 
 

  Socket s=ss.accept(); 

 
 
 
 

  3、客户端如果发来数据,那么服务端要使用对应的客户端对象,并取到该客户端对象的读取流来读取数据 
 
 并打印在控制台 
 
 InputStream in=s.getInputStream(); 
 
 byte[] buf=new byte[1024]; 
 
 int len=0; 
 
 len=in.read(buf); 
 
 String s=new String(buf,0,len); 
 
 system.out.println(s) 
 
 //获取客户端发来的ip地址 
 
 String  ip=s.getInetAddress().getHostAddress(); 
 
 
 
 
 
 
 4、关闭服务器(可选)关闭客户端必选 
 
 s.close(); 
 
 
 
 
 
 
 
 
 
 

  。。。。。。。。。。。。。。。。。。。。。。。。。。。。 
 
 文本转换服务器 
 
 将客户端发到服务端的信息服务端转换成大写发回来 
 
 
 
 

  客户端: 
 
 1、建立服务  Socket s=new Socket("127.0.0.1",10008); 
 
 try{ 
 
 2、键盘录入:源 BufferedReader bfr=new BufferedReader(new InputStreamReader(system.in)); 
 
 目的;网络输出流  PrintWriter pw=new PrintWriter(s.getOutputStream()); 
 
  //定义一个网络输入流接收来自服务端返回的信息  BufferedReader bfrIn=new BufferedReader(new InputStreamReader(s.getInputStream())); 
 
 3、String line=null; 
 
 while((line=bfr.readLine())!=null){ 
 
 if(line.equals("over")) 
 
 break; 
 
 pw.println(line);//发送到客户端 
 
 String str=bfrIn.readLine();//接收来自服务端的信息 
 
 system.out.println(“server”+str);//并打印在控制台 
 
 
 
 
 
 
 } 
 
 
 
 

  s.close(); 
 
 bfr.close(); 
 
 }catch(){ 
 
 
 
 
 
 
 }


服务端: 
 
 1、建立服务 ServerSocket ss=new ServerSocket(10008); 
 
 2、获取socket对象 输入流 Socket s=ss.accept(); 
 
 
 
 

  源:socket输入流:BufferedReader bfrIn=new BufferedReader(new InputStreamReader(s.getInputStream())) 
 
 目的 :socket输出流:printWriter pw=new PrintWriter(s.getOutputStream()); 
 
 String line=null; 
 
 while((line=bfrIn.readerLine)!=null){ 
 
 pw.println(line.ToUpperCase()); 
 
 
 
 

  } 
 
 bfrIn.close(); 
 
 s.close();


TCP复制文件
要注意的是结束标记:用socket里的一个方法shutdownOutput();关闭网络输出流,也是文件的一个结束标记-1



需求:上传图片
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。



用于描述URL的对象 URL:同一资源定位符 
 
  URL url=new URL("http://127.0.0.1:8080/mydemo/html?name=haha&age=20"); 
 
 url.getPtotocol();//获取协议 
 
 url.getHost();//获取主机 
 
 url.getPort();//获取端口号 
 
 url.getPath();//获取路径 
 
 url.getFile();//获取文件名 
 
 url.getQuery();//获取传入的参数 
 
 
 
 

  URLConnection  拆包:应用层 不用再定义Socket 
 
 URLConnection conn=url.openConnection(); 
 
 
 
 
 
 
 
 
 
 

  Socket 有一个无参数的构造函数怎么样传ip地址和端口号呢。 
 
 socket里有一个connect()方法里面传入的参数是InetSocketAddress 
 
 
 
 
 
 
 域名解析:(将主机名翻译成ip地址) 
 
 DNS服务器,域名解析 
 
 
 
 

  某一个网站不想开启可以找 
 
 C:\Windows\System32\drivers\etc\hosts文件 
 
 127.0.0.1    网站的地址  此时网站走的是本地主机,不走网络DNS 
 
 、、