———–android培训、java培训、java学习型技术博客、期待与您交流!————
1
InetAddress类的概述和使用
该类没有构造方法:
没有构造方法的类是什么情况:
A:单例设计模式(Runtime)
B:类中的成员变量都是静态的
C:通过一个静态方法返回该类的对象
//public static InetAddress getByName(String host)
//根据主机名获得Ip地址对象
InetAddress address=InetAddress.getByName("lin-pc");
System.out.println(address );
//获取主机名public String getHostName()
String nameString=address.getHostName();
System.out.println(nameString );
//获取ip地址
String ip=address.getHostAddress();
System.out.println(ip);
网络通信的三要素:
A:IP地址
计算机在网络中的唯一标识。
现在使用的是:"点分十进制"
B:端口号
每一个进程的逻辑地址就是一个标识号
一个进程就是一个应用程序,所以可以说端口号就是应用程序的标识号
端口号是有范围的: 0--65535
0-1204的端口号不能随便取,这是操作系统的进程所占用的
C:协议
通信的规则。
UDP:不建立连接,数据打包传输,数据有限制(64K),数据不可靠,速度快。
TCP:建立连接,数据无限制,数据可靠,速度慢。
4
Socket服务:
两个计算机之间通信,需要知道ip地址,以及端口号,Socket服务就包装了这两个东西
5
UDP发送和接收数据
先开启谁都无所谓。
先来掌握一个重要的类
DatagramSocket--此类表示用来发送和接收数据报包的套接字。
构造方法--public DatagramSocket()
构造数据报套接字并将其绑定到本地主机上任何可用的端口
构造方法--public DatagramSocket(int port)
创建数据报套接字并将其绑定到本地主机上的指定端口
成员方法--public void send(DatagramPacket p)
从此套接字发送数据报包
参数:DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号
DatagramPacket--此类表示数据报包。
构造方法——public DatagramPacket(byte[] buf,
int length,
InetAddress address,
int port)
参数:
buf - 包数据。
length - 包长度。
address - 目的地址。
port - 目的端口号
构造方法———public DatagramPacket(byte[] buf,
int length)用来接收长度为 length 的数据包。
参数: buf - 保存传入数据报的缓冲区。
len - 要读取的字节数。
成员方法:--public byte[] getData()
返回数据缓冲区。
--public InetAddress getAddress()
返回某台机器的 IP 地址
A:发送端
public class sText
{
public static void main(String[] args) throws IOException
{
/*1 创建发送端Socket服务
*2 数据打包
*3 发送数据
*4 关闭流对象
*
*/
//创建发送端Socket服务
DatagramSocket ds=new DatagramSocket();
//封装键盘数据,形成循环,可以不断的输入
BufferedReader sb=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=sb.readLine())!=null)
{
if(line=="886")
{
break;
}
//数据打包
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("lin-pc"), 10086);
//发送数据
ds.send(dp);
}
//关闭流对象
ds.close();
}
}
B:接收端
public class reText
{
public static void main(String[] args) throws IOException
{
/*1 创建接受端Socket服务
*2 创建数据包,用于接受数据
*3 接受数据
*4解析数据
*5关闭
*/
//创建接受端Socket服务,并且指定接收数据的端口
DatagramSocket ds=new DatagramSocket(10086);
//创建数据包,用于接受数据
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
//接受数据
ds.receive(dp);
//解析数据
byte[] buff=dp.getData();
//从发送端的数据中得到发送端的ip地址
String ip=dp.getAddress().getHostAddress();
//把接收到的数据转换成字符串形式
String s=new String(buff,0,dp.getLength());
//把数据显示在可控制台
System.out.println(ip+"---------"+s);
}
}
}
6
TCP发送和接收数据必须先开启服务器。
先认识两个重要的类
Socket(类)--此类实现客户端套接字
构造方法--public Socket()
通过系统默认类型的 SocketImpl 创建未连接套接字
构造方法--public Socket(InetAddress address,int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
成员方法————public InputStream getInputStream()
返回此套接字的输入流
成员方法————public OutputStream getOutputStream()
返回此套接字的输出流
ServerSocket(类)--此类实现服务器套接字
构造方法--public ServerSocket(int port)
创建绑定到特定端口的服务器套接字
成语方法---public Socket accept()
侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
A:客户端:
public class client
{
public static void main(String[] args) throws IOException
{
/*1 创建发送端的Scoket对象
* 创建此对象时,要指定目标主机和端口
*2 获取Scoket对象的输出流(字节流)
*3 写数据
*4 释放资源
*
*/
//Tcp协议,必须先开启服务端,
Socket s=new Socket("lin-pc",10086);
//获取scoket的输出流对象
OutputStream os=s.getOutputStream();
//写数据
os.write("你好呀,吃饱了吗".getBytes());
//释放资源
os.close();
}
}
B:服务器端:
public class Service
{
public static void main(String[] args) throws IOException
{
/*
* 1 创建服务器Socket对象。
2监听客户端连接。
3 获取输入流。
4 读取数据。
5 释放资源。
*/
//创建服务器Socket对象。
ServerSocket ss=new ServerSocket(10086);
//2监听客户端连接。
Socket socket=ss.accept();
//3 获取输入流。
InputStream stream= socket.getInputStream();
//4 读取数据。
byte[] buf=new byte[1024];
int length=stream.read(buf);
String string=new String(buf, 0, length);
System.out.println(string);
ss.close();
stream.close();
}
}