-----------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学习型技术博客、期待与您交流!------------