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学习型技术博客、期待与您交流!------------
- Java学习笔记-网络流
- java 网络 学习笔记
- JAVA学习笔记-----网络
- java网络编程学习笔记
- JAVA网络编程学习笔记
- java网络编程学习笔记
- java学习笔记-网络编程
- Java网络编程 学习笔记
- Java学习笔记------网络编程
- java学习笔记网络编程
- Java网络编程学习笔记
- 网络通信学习笔记-Java
- 网络流学习笔记
- 网络流学习笔记
- 网络流学习笔记
- 网络流学习笔记
- 网络流学习笔记
- java学习笔记------Java网络编程三
- Java学习笔记-集合
- poj3069
- Java学习笔记-IO
- Oracle数据库中的触发器
- Java学习笔记-File
- Java学习笔记-网络流
- Java学习笔记-枚举(enum)
- Java学习笔记-反射(reflect)
- cocos2dx 2.2.1 Android环境搭建和使用VisualGDB调
- android 阅后即焚 防止截屏
- Java学习笔记-JavaBean-内省(Introspector)
- javascript 面向对象的简单应用
- HDU 3613 Best Reward (Manacher算法 前缀回文+后缀回文)
- Soot II: 数据流框架