标签:
1.IP地址
IP地址组成:网络号段+主机号段
IP地址分类:
A类:第一号段为网络号段+后三段的主机号段
1.0.0.1---127.255.255.254(10.x.x.x是私有地址)
一个网络号可分配256*256*256个IP
B类:前二号段为网络号段+后二段的主机号段
128.0.0.1---191.255.255.254(172.16.0.0---172.31.255.255是私有地址)
一个网络号可分配256*256个IP
C类:前三号段为网络号段+后一段的主机号段(常用)
192.0.0.1---223.255.255.254(192.168.x.x是私有地址)
一个网络号可分配256个IP
D类:保留地址
224.0.0.1---239.255.255.254
E类:保留地址
240.0.0.1---247.255.255.254
特殊IP地址:
127.0.0.1:回环地址,表示本机
x.x.x.255:广播地址
x.x.x.0:网络地址
2.端口(逻辑端口)
每个网络程序都至少有一个逻辑端口
用于标识进程的逻辑地址,不同进程的标识
有效端口:0--65535,其中0--1024为系统使用或保留端口
3.协议
UPD:把数据打包,数据有限制,不建立连接,速度快,不可靠
TCP:建立连接通道,数据无限制,速度慢,可靠
4.Socket:网络套接字,包含了IP地址+端口号
通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输
5.UDP协议发送接收数据
public class SendDemo { public static void main(String[] args) throws Exception { //1.创建UDP协议发送端Socket对象 DatagramSocket ds = new DatagramSocket(); //2.创建数据,并把数据打包 byte[] bytes = "Hello World".getBytes();//创建要发送的数据 int length = bytes.length; //创建要发送的Ip地址对象 InetAddress address = InetAddress.getByName("127.0.0.1"); //设置端口(1024以上) int port = 10110; //public DatagramPacket(byte buf[], int length,InetAddress address, int port) DatagramPacket dp = new DatagramPacket(bytes, length, address, port); //3.调用Socket对象的发送方法发送数据包,public void send(DatagramPacket p) ds.send(dp); //4.释放资源 ds.close(); } }
public class ReceiveDemo { public static void main(String[] args) throws Exception { //1.创建UDP协议接收端Socket对象,端口号与发送端一致 DatagramSocket ds = new DatagramSocket(10110); //2.创建一个数据包(接收容器) byte[] bytes = new byte[1024]; int length = bytes.length; DatagramPacket dp = new DatagramPacket(bytes, length); //3.调用Socket对象的接收方法接收数据包 ds.receive(dp); //4.解析数据包 String ip = dp.getAddress().getHostAddress();//获取发送端的IP byte[] bytes1 = dp.getData();//获取数据缓冲区 int length1 = dp.getLength();//获取数据实际长度 String str = new String(bytes1, 0, length1); System.out.println(ip + ":" + str);//接收到的数据显示在控制台 //5.释放资源 ds.close(); } }
6.TCP协议发送接收数据
public class ClientDemo { public static void main(String[] args) throws IOException { //1.创建发送端的Socket对象,设置访问的IP和端口 Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8888); //2.获取通道内的输出流,写数据 OutputStream os = s.getOutputStream(); os.write("Hello World".getBytes()); s.shutdownOutput();//写数据完成,服务端不用在等待 //3.获取输入流,读取返回结果 InputStream is = s.getInputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes); String str = new String(bytes, 0, len); System.out.println("返回结果:" + str); //4.释放资源 s.close(); } }
public class ServerDemo { public static void main(String[] args) throws IOException { //1.创建接收端的Socket对象 ServerSocket ss = new ServerSocket(8888); while (true) { //2.监听客户端连接,返回一个对应的Socket对象 Socket s = ss.accept(); new Thread(new ClientThread(s)).start(); } } }
public class ClientThread implements Runnable { private Socket s; public ClientThread(Socket s) { this.s = s; } @Override public void run() { try { //3.获取输入流,读取数据显示在控制台 InputStream is = null; is = s.getInputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes); String str = new String(bytes, 0, len); String ip = s.getInetAddress().getHostAddress();//获取客户端IP地址 System.out.println(ip + ":" + str); //4.获取输出流,写入返回结果 OutputStream os = s.getOutputStream(); os.write("数据已收到".getBytes()); //5.释放资源 s.close(); } catch (IOException e) { e.printStackTrace(); } } }
标签:
原文地址:http://www.cnblogs.com/shijunzhang/p/4857935.html