Java学习笔记-网络流

来源:互联网 发布:无锡买房 知乎 编辑:程序博客网 时间:2024/06/05 12:44

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

 

1.概述:

OSI模型:                TCP/IP参考模型:

应用层                  应用模型

表示层   

会话层

 

传输层                  传输层

 

网络层                  网际层

 

数据链路层              主机至网络层

物理层

 

数据传输过程:数据封包-->通过物理层传输到对方主机-->数据拆包

 

2.IP:Java有专门描述对象的类:InetAddress

获取对象:

getByName(String host)

getLocalHost()

方法:

getHostAddress()
getHostName()
toString()

UDP协议:

特点:面向无连接

      数据包大小限制在64K内

      不可靠协议

      速度快

Tcp协议:

特点:面向连接

      大数据量传输

      可靠协议

      效率稍低

端口:进程的标识。

 

3.UDP协议:

DatagramSocket:用于创建UDP的发送端和接受端对象。

构造函数:

DatagramSocket()
DatagramSocket(int port)
方法:

receive(DatagramPacket p)
send(DatagramPacket p)

DatagramPacket:数据包的对象。

构造函数:

DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int offset, int length)
方法:

getAddress()
getData()
getLength()
getPort()
代码示例:

package NetIOTest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class UdpTest { public static void main(String [] args){  new Thread(new UdpRece()).start();//创建接收线程  new Thread(new UdpSend()).start();//创建发送线程 }}class UdpSend implements Runnable{ public void run(){  DatagramSocket ds=null;//定义UDP服务  BufferedReader bufr=null;//定义输入流  try {    bufr = new BufferedReader(new InputStreamReader(System.in));//创建标准输入流   ds = new DatagramSocket();//创建UDP服务   String line = "";   while ((line=bufr.readLine())!=null){//读取键盘输入    if("over".equals(line))     break;    byte [] buf = line.getBytes();//将读到数据存入数组中    //创建数据包,并将数组中的数据封装到包中,指定目标主机和端口    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.106"),10003);    ds.send(dp);//发送数据   }  } catch (SocketException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (UnknownHostException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }finally{   if(bufr!=null)    try {     bufr.close();//关闭输入流    } catch (IOException e1) {     // TODO Auto-generated catch block     e1.printStackTrace();    }   if(ds!=null)    try {     ds.close();//关闭UDP服务    } catch (Exception e) {     // TODO Auto-generated catch block     e.printStackTrace();    }  }   }}class UdpRece implements Runnable{ public void run(){  DatagramSocket ds=null;//定义UDP服务  try {   ds = new DatagramSocket(10003);//创建UDP服务,并监听10003端口   while (true) {    byte[] buf = new byte[1024];    DatagramPacket dp = new DatagramPacket(buf, buf.length);//定义数据包    ds.receive(dp);//接受数据,存入数据包中    String IP = dp.getAddress().getHostAddress();//获取对方主机地址    String data = new String(dp.getData(), 0, dp.getLength());//获取数据    System.out.println(IP + "::" + data);   }  } catch (SocketException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }finally{   if(ds!=null)    try {     ds.close();//关闭UDP服务    } catch (Exception e) {     // TODO Auto-generated catch block     e.printStackTrace();    }  } }}

运行结果:
hah
192.168.1.106::hah
nihao
192.168.1.106::nihao

 

4.TCP协议:

Socket:用于创建客户端TCP服务。(传输层)

构造函数:

Socket(InetAddress address, int port)
方法:

getOutputStream()
getInputStream()
getInetAddress()

客户端要成功发送数据必须先启动服务端
代码示例:

package NetIOTest;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TcpClient{public static void main(String [] args)throws Exception{Socket s = new Socket("192.168.1.106",10005);BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//创建标准输入流PrintWriter pw = new PrintWriter(s.getOutputStream(),true);//创建打印流BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));//读取网络流String line = "";while((line= bufr.readLine())!=null){//接收键盘数据if("over".equals(line))break;pw.println(line);//将数据通过打印流输出到网络流里String str = bufIn.readLine();//读取服务端返回的数据System.out.println(str);}s.close();}}

运行结果:

hahha
HAHHA
nihao
NIHAO
fuwuduan
FUWUDUAN

ServerSocket:用于创建服务端TCP服务。

构造函数:

ServerSocket(int port)
方法:

accept()

代码示例:

package NetIOTest;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TcpServer {public static void main(String [] args)throws Exception{ServerSocket ss = new ServerSocket(10005);//创建Socket服务,监听端口Socket s = ss.accept();//获取客户端的对象BufferedReader bufIn= new BufferedReader(new InputStreamReader(s.getInputStream()));//读取客户端的输入流PrintWriter pw = new PrintWriter(s.getOutputStream(),true);//将数据打印到客户的输出流String line = "";while((line=bufIn.readLine())!=null){//读取客户端的数据pw.println(line.toUpperCase());//将数据打印到客户的输出流}s.close();//关闭客户端}}

服务端不会有数据输出。服务端将得到的数据经过处理后返回给客户端。

5.URL对象:(应用层)

构造函数:

URL(String spec)
方法:

getHost()
getPath()
getPort()
getProtocol()
getFile()
getQuery()
openConnection()  返回类型:URLConnection
openStream()  返回类型:InputStream
打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。此方法是下面方法的缩写:      openConnection().getInputStream()

代码示例:

特点:URL工作在应用层,所以读到的数据没有响应头。

package NetIOTest;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;public class URLTest {public static void main(String [] args)throws Exception{URL url = new URL("http://www.baidu.com");URLConnection conn = url.openConnection();InputStream in = conn.getInputStream();byte [] buf = new byte[1024];int len =0;while((len=in.read(buf))!=-1){System.out.print(new String(buf,0,len));}}}

运行结果:
<!DOCTYPE html><html><body><script type="text/javascript">var u = 'http://www.baidu.com/?tn=SE_hldp01550_7zn76813', ua = navigator.userAgent.toLowerCase(); if (ua.indexOf('applewebkit') > 0){   var h = document.createElement('a');    h.rel = 'noreferrer';   h.href = u; document.body.appendChild(h);   var evt = document.createEvent("MouseEvents");    evt.initEvent("click", true, true);   h.dispatchEvent(evt);} else {   document.write('<meta http-equiv="Refresh" Content="0; Url=' + u + '" />');}</script></body></html>

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

0 0
原创粉丝点击