------- android培训、java培训、java基础学习技术总结、期待与您交流! ----------
网络程序
1.找到对方Ip
2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给
这些网络应用程序都用数字进行标识。
为了方便称呼这个数字,叫做端口,逻辑端口
3.定义通信规则,这个通讯规则成为协议。
轨迹组织定义了通用协议Tcp/Ip.
网络模型:按层次对网络进行细致化的划分
OSI参考模型 ,TCP参考模型
1.OSI:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
2.TCP/Ip:应用层,传输层,网际层,主机至网络层
主机对网络数据的处理:本地主机进行逐层封包,目的进行逐层拆包
Ip地址:网络中的设备标识,不易理解;可用主机名
本地回环地址:127.0.0.1 主机名:localhost
Tcp与Udp
Udp
将数据及源和目的封装数据包中,不需要建立连接
每个数据包的大小限制在64K内
因无连接,是不可靠协议,容易丢包
不需要建立连接,速度快
udp:qq聊天,视频聊天,视频会议,下载。
Tcp
建立连接,形成传输数据的通道
在连接中进行大数据传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket
Socket就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket间通信
数据在两个Socket间通过IO传输。
获取Ip信息示例如下:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] inet=InetAddress.getAllByName("www.baidu.com");
System.out.println(inet.toString());
System.out.println(inet[0]);
for(int i=0;i<inet.length;i++)
{
System.out.println(inet[i].getHostAddress());
System.out.println(inet[i].getHostName());
}
// System.out.println("address:"+inet.getHostAddress());
//System.out.println("name:"+inet.getHostName()); //如果没有解析成功,主机名还是Ip地址。
}
}
UdpSend类:用于信息的发送.
通过Udp传输方式,将一段文字数据发送出去
思路:
1.建立UdpSocket服务
2.提供数据,并将数据封装到数据包
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源
public class UdpSend {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket ds=new DatagramSocket();
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null){
if("886".equals(line))
break;
byte[] buf=line.getBytes();
DatagramPacket dp=
new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),10000);
ds.send(dp);
}
ds.close();
}
}
UdpRecv,用于信息的接收:
需求:
* 定义udpsocket服务,通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识
* 方便于明确哪些数据过来该应用程序可以处理。
* 1.定义一个应用程序,用于读取Udp协议传输的数据并处理,
* 2.定义一个数据包,因为要存储接收到的字节数据。
* 因为数据包对象中有更多的功能可以提取字节数据存入已定义好的数据包中。
* 3.通过socket服务的receive方法可以将收到的数据存入已定义好的数据包中。
* 4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
* 5.关闭资源。
class UdpRecv{
public static void main(String[] args) throws IOException{
DatagramSocket ds=new DatagramSocket(10000);
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,0,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
/*System.out.println("Address:"+dp.getAddress().getHostAddress());
System.out.println("port:"+dp.getPort());
System.out.println("url:"+dp.getSocketAddress()); */
}
}
}
在一个窗口中同时发送和接收,代码示例如下:
class Send implements Runnable{
DatagramSocket ds;
Send(DatagramSocket ds){
this.ds=ds;
}
public void run()
{
try{
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null){
if("886".equals(line))
break;
byte[] buf=line.getBytes();
DatagramPacket dp=
new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),10004);
ds.send(dp);
}
ds.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
class Recv implements Runnable{
DatagramSocket ds;
Recv(DatagramSocket ds){
this.ds=ds;
}
public void run() {
try {
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,0,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 (IOException e) {
e.printStackTrace();
}
}
}
public class IpDemo2 {
public static void main(String[] args) throws SocketException {
DatagramSocket sendSocket=new DatagramSocket();
DatagramSocket recvSocket=new DatagramSocket(10004);
new Thread(new Recv(recvSocket)).start();
new Thread(new Send(sendSocket)).start();
}
}