---------------------- android培训、java培训、期待与您交流! ----------------------
网络编程-IP地址
如何获取本地主机的名称和IP呢?
在java.net包中提供了InetAddress类,该类表示互联网协议 (IP) 地址。它不提供构造方法,需要通过它提供的一些静态方法获取对象。
1.staticInetAddress getLocalHost(),该方法返回本地主机。
2.StringgetHostName(),返回此IP地址的主机名。
3.StringgetHostAddress(),获取 IP 地址字符串(以文本表现形式)。
4.staticInetAddress getByName(String host),在给定主机名的情况下确定主机的IP 地址。
TCP和UDP
UDP传输协议特点:
1.将数据及源和目的封装成数据包,不需要建立连接,
2.每个数据报的大小限制在64K以内,
3.由于无连接,是不可靠协议
4.不需要建立连接,传输速度快
TCP传输协议特点,
1.需要建立连接,形成传输数据的通道,
2.在连接中进行大数据量传输,
3.通过三次握手完成连接,是可靠协议,
4.必须建立连接,效率会稍低。
Socket
Socket就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
UDP-发送端
UDP协议的Socket服务如何建立呢?
在java.net包中提供了DatagramSocket
类,该类
表示用来发送和接收数据报包的套接字。即发送和接收数据报包的Socket,数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
由于UDP协议是以数据报包的形式发送数据的,所以java.net包中又提供了DatagramPacket
类
,该类将Socket两端需要传输的数据封装成对象。
基于UDP协议传输发送端数据传输步骤:
1.根据DatagramSocket类建立UDP的Socket服务,
2.根据DatagramPacket类将所需要传输的数据封装到数据包中,
3.通过UDP协议的Socket服务,调用send()方法将数据包发送出去,
4.最后需要将资源关闭。
示例代码:
DatagramSocketds = new DatagramSocket();//创建UDP服务,通过DatagramSocket对象。
byte[] data= “hello,java”.getBytes[];//确定数据,并封装成数据包。
DatagramPacketdp = new DatagramPacket(data,data.length, InetAddress. getByName (“192.168.1.254”),1000);
ds.send(dp);//通过Socket服务,将已有的数据包发送出去,调用send()方法。
ds.close();//关闭资源
UDP接收端
基于UDP协议传输接收端数据接收步骤
1.根据DatagramSocket类建立UDP的Socket服务,通常还会传入一个端口作为参数,也就是说给这个接收端定义一个数字标识,方便明确哪些数据接收之后该接收端可以处理。
2.定义一个数据包对象,因为要存储接收到了字节数据包,而且数据报对象中有更多功能可以提取字节数据中的不同数据。
3.通过数据报对象的receive()方法,将接收到的数据存入已经定义好的数据报对象中。
4.通过数据包对象的特有功能,将这些不同数据取出。
5.关闭资源。
示例代码:
DatagramSocketds = new DatagramSocket(10000);//创建基于UDP传输协议的Socket,并且标识此Scoket的端口为1000
byte[] receData= new byte[1024];//定义一个字节数组,用于存储接收到的数据包。
DatagramPacketdp = new DatagramPacket(receData, receData.length);//定义数据包,将接收到的数据存储到receData中
ds.receive(dp);//接收数据包
StringIP = dp.getAddress().getHostAddress();//获取数据包发送端的IP
Stringdata = new String(dp.getData(), 0, dp.getLength());//根据接收到的数据包的长度,获取其中的数据
intport = dp.getPort();//获取数据包发送端的端口
ds.close();//关闭资源
TCP传输
基于TCP协议的数据传输,分为客户端和服务器端。
在java.net包中提供了Socket类,该类就是实现客户端套接字(也可以就叫“套接字”)的类。在套接字是两台机器间通信的端点。Socket对象在建立时,就可以去连接指定服务器,因为TCP协议是面向连接的,所以基于TCP协议的数据传输,就要有服务器端存在,并连接成功。形成通路后在该通道进行数据的传输。注意:在客户端Socket创建以后,就存在Socket输入流和输出流,可以通过OutputStream getOutputStream()方法和InputStream getInputStream()方法分别获取输入流和输出流对象。
同样,java.net包中提供了ServerSocket类,该类现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
基于TCP协议传输客户端端数据传输步骤:
1.通过Socket类创建基于TCP协议客户端,并指定要连接的服务器端和端口。
2.Socket客户端建立之后, 获取输出流对象,并向对象中写入所要传输的数据
3.关闭客户端
示例代码:
Socketsocket = new Socket(“192.168.1.254”, 10000);//创建客户端
OutputStreamoutput = socket.getOutputStream();//获取服务器端输出流对象
Output.write(“hello,java”.getByte());//向输出流中写入数据
socket.close();//关闭客户端
基于TCP协议传输服务器端数据传输步骤:
1.通过ServerSocket类创建基于TCP协议服务器端,并传入一个端口作为参数,
2.侦听并获取申请访问服务器端的客户端对象,通过调用ServerSocket类的Socket accept()侦听并获取客户端对象。所以这个方法是阻塞方法,如果客户端没有建立连接就会一直等待,
3.客户端如果发过来数据,那么服务器端就要通过对应的客户端对象,获取到该客户端对象的读取流对象来读取发过来的数据,
4.关闭服务器端(可选操作)。
示例代码:
ServerSocketserverSocket = new ServerSocket(10000);//建立服务器端,传入一个端口作为参数
Socketsocket = serverSocket.accept();通过accept()方法,获取客户端对象,
InputStreaminput = socket.getInputStream();//通过getInputStream()方法,获取客户端对象的读取流
byte[]dataByte = new byte[1024];//定义数组,用于存放数据,
intlength = input.read(dataByte);//读取客户端发过来的数据,存储到数组dataByte中,
System.out.println(newString(dataByte, 0, length));//打印到控制台,
socket.close();//关闭客户端对象(一般都要关闭客户端对象,以免浪费服务器端资源)
serverSocket.close();//关闭服务器端(看需求而定)
TCP传输-2
基于TCP协议,客户端和服务器端的互访。(客户端向服务器端发送数据,服务器端收到数据后,给客户端发送反馈信息)
客户端步骤:
1.创建基于TCP协议客户端,并指定要连接的服务器端和端口,
2.Socket客户端建立之后, 获取输出流对象,并向对象中写入所要传输的数据,并发送给服务器端,
3.获取客户端的输入流对象,用于获取服务器端反馈的数据,并打印到控制台,
4.关闭客户端。
示例代码:
Socketsocket = new Socket(“192.168.1.254”, 10000);
OutputStreamout = socket.getOutputStream();
out.write(“hello,java”.getBytes());
InputStreaminput = socket.getInputStream();
byte[]buffer = new byte[1024];
intlength = input.read(buffer);
System.out.println(newString(buffer, 0, length));
Socket.close();
服务器端示例代码:
ServerSocketserver = new ServerSocket(10000);
Socketsocket = server.accept();
InputStreamserverInput = socket.getInputStream();
byte[]buffer = new byte[1024];
intlength = serverInput.read(buffer);
System.out.println(newString(buffer, 0, length));
OutputStreamout = socket.getOutputStream();
Out.write(“datareceived…”.getBytes());
socket.close();
server.close();
---------------------- android培训、java培训、期待与您交流! ----------------------