Java学习笔记-网络流

-----------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));
		}
	}
}

运行结果:

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

你可能感兴趣的:(Java学习笔记-网络流)