java 网络编程
1.0 基本通信架构
基本的通信架构有两种,一种是CS架构,即客户端服务端架构,另一种是BS架构,即浏览器服务端架构
1.1 ip地址
java 中使用InetAddress 代表ip地址,常用的方法有:
下面是方法使用
package com.net.test;import java.net.InetAddress;
import java.net.UnknownHostException;public class IpTest {public static void main(String[] args) throws Exception {InetAddress ip=InetAddress.getLocalHost();System.out.println(ip.getHostAddress());//获得ip地址System.out.println(ip.getHostName());//获得主机名InetAddress.getByName("baidu.com");//根据ip地址或者域名获得InetAddress对象System.out.println();//判断当前书籍是否可以和当前对象对应的服务器联通,传入的时间为连接尝试时间,单位为毫秒System.out.println(ip.isReachable(1000));System.out.println();}
}
1.2 端口
端口是程序进行网络通信的出入口,被规定为一个16位的二进制,范围是0-65535
分类:
周知端口:0-1023 被预先定义的指明应用占用
注册端口:1024-49151 分配给用户进程或者某些应用程序
动态端口: 49152 到65535 动态进行分配
我们自己的程序一般使用注册端口
一个设备中不能出现两个使用同一端口的程序
1.3 UDP通信
在java中,使用DatagramSocket进行udp通信
下面是UDP通信中创建客户端并发送数据的例子
客户端
package com.net.test;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class Client {public static void main(String[] args) throws Exception {DatagramSocket client=new DatagramSocket();byte [] data= "hello".getBytes();DatagramPacket packet=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),6666);client.send(packet);System.out.println("发送完毕");client.close();}
}
其中DatagramPacket 是我们要存储数据的数据包对象 其中有参构造函数的几个参数在这里进行解释:
第一个参数是一个字节数组,存储着我们要发送的数据
第二个参数是数据发送长度,代表着我们要将第一个字节数组的多少数据发送给对方
第三个参数是一个InetAddress对象,代表我们发送数据的对象,我们可以用InetAddress.getByName
方法获得
目标对象
第四个参数是我们发送的端口,有了对象我们要指明发送给对象的哪个端口
定义完成后使用send方法发送数据包
服务端:
package com.net.test;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class Server {public static void main(String[] args) throws Exception {DatagramSocket server = new DatagramSocket(6666);byte [] data= new byte[1024*64];//UDP发送数据一次最大64KBDatagramPacket packet = new DatagramPacket(data,data.length);server.receive(packet);String rs=new String(data,0,packet.getLength());System.out.println(rs);System.out.println(packet.getAddress());System.out.println(packet.getPort());server.close();}
}
这是一个构建服务端的简单程序,现在进行解释,首先通过DatagramSoket 对象代表服务端,不过这时候要指定
端口了,不能再随机分配,因为之前客户端的端口是指定了发送给目标ip的指定端口了,接着创建字节数组来接受
数据,创建DatagramPacket来接受数据包,字节数组用来接受传输的数据,DatagramPacket不光需要接受传输
的数据,还需要接受发送过来的附加信息,比如发送客户端的ip地址,端口等信息,我们再客户端发送
DatagramPacket也是一样的原因,可以看到我们后续的就用到了附加的信息
当我们启动服务端时,在遇到 server.receive(packet);
时产生阻塞,直到接受到数据后才继续执行
执行的输出结果
hello
/198.18.0.1
51573