Java中的网络编程(一)——UDP(可以实现两台电脑之间的通信哦)

一、网络模型:

      计算机之间的通信规则

1、网络模型:
       OSI(Open System Interconnection)参考模型
       TCP/IP参考模型

               

2、网络编程三要素
       IP地址
       端口
       协议

 

二、IP地址:网络中计算机的的唯一标识

1、 IP的组成:网络号 + 主机号

       A类:第一号段为网络号段+后三段的主机号段
             1.0.01---127.255.255.254
       B类:前两个号段为网络号段+后两端的主机号段
             128.0.0.1---191.255.255.254
      C类:前三号段为网络号段+后一段的主机号段
             224.0.0.1---239.255.255.254
      D类:
             224.0.0.1---239.255.255.254
      E类:
             240.0.0.1---247.255.255.254

2、DOS命令:
       ipconfig  查看本机IP地址
       ping  后面跟IP地址。测试本机与指定的IP地址间的通信是否有问题
3、特殊的IP地址:
       127.0.0.1   回环地址(表示本机)
        x.x.x.255  广播地址
        x.x.x.0      网络地址
4、InetAddress类:
      对IP地址的获取和操作

     如果一个类没有构造方法:
         (1)成员都是静态的(Math , Arrays , Collections)
         (2)单例设计模式(Runtime)
         (3)类中有静态方法返回类的对象(InetAddress)

     InetAddress类的方法:
             public static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址
             public String getHostName():获取此 IP 地址的主机名。
             public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。

 查看IP地址和主机名:

package NetDemo;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        
        InetAddress address = InetAddress.getByName("DESKTOP-3CRMG0N");
        //获取主机名和IP地址
        String name = address.getHostName();
        String ip = address.getHostAddress();
        
        System.out.println(name + "----" + ip);
    }
}

 

三、端口:

         正在运行的程序的标识
         有效端口:0~65535,其中0~1024系统使用或者保留端口

 

四、协议:

1、通信的规则:
 (1)UDP:
          把数据打包
          数据有限制
          不建立连接
          速度快
          不可靠
 (2)TCP:
          建立连接通道
          数据无限制
          速度慢
          可靠

Socket:  网络套接字
Socket包含:  IP地址+端口
Socket原理机制:
    通信的两端都有Socket
    网络通信其实就是Socket间的通信
    数据在两个Socket间通过IO传输

2、UDP协议发送数据:
(1)创建发送端Socket对象
(2)创建数据,并把数据打包
(3)调用Socket对象的发送方法发送数据包
(4)释放资源

package NetDemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();
        
        //封装键盘录入数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        
        while((line = br.readLine()) != null) {
            if("886".equals(line))
                break;
            
            //创建数据,把数据打包
            //内容
            byte[] b = line.getBytes();
            //长度
            int length = b.length;
            //接收端IP
            InetAddress i = InetAddress.getByName("172.28.***.41");
            //端口
            int port = 10000;
            DatagramPacket dp = new DatagramPacket(b, length, i, port);
            
            //调用Socket对象的发送方法发送数据包
            ds.send(dp);
        }
        
        //释放资源
        ds.close();
    }
}


3、UDP协议接收数据:
(1)创建接收端Socket对象
(2)创建一个数据包(接收容器)
(3)调用Socket对象的接收方法接收数据
(4)解析数据包,并显示在控制台
(5)释放资源

package NetDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建接收端Socket对象
        DatagramSocket ds = new DatagramSocket(10000);
        
        while(true) {
            //创建一个数据包(接收容器)
            byte[] b = new byte[1024];
            int length = b.length;
            DatagramPacket dp = new DatagramPacket(b, length);
            
            //调用Socket对象的接受方法接收数据
            ds.receive(dp);
            
            //解析数据包,并显示在控制台
            //获取对方IP
            InetAddress address = dp.getAddress();
            String ip = address.getHostAddress();
            byte[] by = dp.getData();
            int len = dp.getLength();
            String s = new String(by, 0, len);
            System.out.println(ip + " 向您发送了:" + s);
            
        }
        
    }
}

 

五、实现两台电脑之间的通信:

   

第一步:主类,两台电脑都要有的 

10020是自己电脑接收消息的端口,可以随意设置,

package ChatRoomDemo;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ChatRoom {
	public static void main(String[] args) throws IOException {
		DatagramSocket dsend = new DatagramSocket();
		DatagramSocket dreceive = new DatagramSocket(10020);
		
		SendThread st = new SendThread(dsend);
		ReceiveThread rt = new ReceiveThread(dreceive);
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(rt);
		
		t1.start();
		t2.start();
	}
}

 

第二步:发送类

类中的10030是接收你信息电脑的端口号,IP也是接收你信息的电脑IP

package ChatRoomDemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {
	private DatagramSocket ds;
	public SendThread(DatagramSocket ds) {
		this.ds = ds;
	}
	
	@Override
	public void run() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in ));
			String line = null;
			while((line = br.readLine()) != null) {
				if("886".equals(line)) {
					break;
				}
				byte[] b = line.getBytes();
				DatagramPacket dp = new DatagramPacket(b, b.length, 
						InetAddress.getByName("172.***.22.41"), 10030);
				
				ds.send(dp);
			}
			ds.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
		

	}

}

 

第三步:接收类

package ChatRoomDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveThread implements Runnable {
	private DatagramSocket ds;
	
	public ReceiveThread(DatagramSocket dreceive) {
		this.ds = dreceive;
	}

	@Override
	public void run() {
		try {
			while(true) {
				byte[] b = new byte[1024];
				DatagramPacket dp = new DatagramPacket(b, b.length);
				
				ds.receive(dp);
				
				String ip = dp.getAddress().getHostAddress();
				String s = new String(dp.getData(), 0, dp.getLength());
				System.out.println(ip + " 向您发送了:" + s);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

注意:要实现两台电脑的通信,接收IP地址设为对方的,自己设置自己的接收端口要和对方设置你的端口号一致,反之也一样,这样你的IP才能找到对方的IP,再接着你的端口找到对方的端口

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值