------- android培训、java培训、期待与您交流! ----------
1.网络模型:
OSI参考模型:7层
TCP/IP模型:4层
2.网络通讯要素
IP地址:网络中设备的标识,不易记忆,可用主机名,本地回环地址:127.0.0.1,主机名:localhost
InetAddress ia=InetAddress.getByName(“192.168.1.1”);获取主机的地址
ia.getHostAddress(); ia.getHostName();
端口号:用于标识进程的逻辑地址,不同进程的标识;有效端口号:0-65535,其中0-1024系统使用或保留端口。
传输协议:TCP/UDP
3.TCP和UDP区别
UDP:不需要建立连接,每个数据包的大小限制在64k以内,不可靠协议,速度块。(聊天、网络视频)
TCP:需要建立连接,进行大数据量的传输,通过三次握手完成连接,是可靠协议,速度稍微慢。(下载)
4.Socket
Socket就是网络服务提供的一种机制;通信的两端都有Socket;网络通讯其实就是Socket间的通信;数据在两个Socket间通过IO传输。
5.UDP传输
发送端
1.建立udpSocket服务
2.提供数据,并将数据封装到数据包中
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
DatagramSocket ds=new DatagramSocket();//创建UDPSocket服务通过DatagramSocket对象
byte[] data="我来了".getBytes();//字符串变成字节数组
//将数据封装成数据包
DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("192.168.1.1"),4000);
ds.send(dp);//通过socket服务,将已有的数据包发送出去
ds.close();//关闭资源
}
}
接收端
1.建立udpSocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识,方便明确哪些数据过来可以处理。
2.定义一个数据包,存储接收到的字节数据。
3.通过socket服务的接收功能,将收到的数据存入定义好的数据包中
4.通过数据包对象功能,将数据取出
5.关闭资源。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
DatagramSocket ds=new DatagramSocket(4000);//创建udpSocket通过DatagramSocket对象
//定义数据包用于存储接收的数据
byte[] data=new byte[1024];
DatagramPacket dp=new DatagramPacket(data,data.length);
//通过received方法将数据存入数据包中
ds.receive(dp);
//通过数据包中的方法获取数据
String ip=dp.getAddress().getHostAddress();
String dat=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
//关闭资源
ds.close();
}
}
6.TCP传输
客户端
1.创建Socket服务,并指定要连接的主机和端口。
2.获取Socket流中的输出流发送数据,通过write方法写入要发送的内容
3.获取Socket流中的输入流接收数据,通过read方法读取接收的内容
4.关闭资源
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
Socket s=new Socket("192.168.1.1",4001);//创建客户端的Socket服务,指定目的主机和端口
OutputStream out=s.getOutputStream();//获取Socket流中的输出流发送数据
out.write("wo lai le".getBytes());//写入要发送的数据
InputStream in=s.getInputStream();//获取Socket流中接收的数据流
//读取服务端发送的数据
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
s.close();//关闭资源
}
}
服务端
1.建立服务端的Socket服务:ServerSocket(),并监听一个端口
2.获取连接过来的客户端信息:accept方法,阻塞式
3.客户端如果发过来数据,那么服务要使用对应的客户端对象,并获取到该客户端对象的读取流来读取数据。
4.关闭服务端(可选操作)
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerSocket {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//建立服务端的Socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(4001);
Socket s=ss.accept();//通过accept方法获取连接过来的客户端对象
String ip=s.getInetAddress().getHostAddress();//获取IP地址
//获取客户端发送过来的数据,使用客户端对象的读取流来读取数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
String str=new String(buf,0,len);
System.out.println(str);
}
s.close();//关闭客户端
}
}