* 如果一个类没有构造方法:
* A:成员全部是静态的(Math,Arrays,Collections)
* B:单例设计模式(Runtime)
* C:类中有静态方法返回该类的对象(InetAddress)
* class Demo {
* private Demo(){}
*
* public static Demo getXxx() {
* return new Demo();
* }
* }
*
* 看InetAddress的成员方法:
* public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
*/
package cn.itcast_01; import java.net.InetAddress; import java.net.UnknownHostException; /* * 如果一个类没有构造方法: * A:成员全部是静态的(Math,Arrays,Collections) * B:单例设计模式(Runtime) * C:类中有静态方法返回该类的对象(InetAddress) * class Demo { * private Demo(){} * * public static Demo getXxx() { * return new Demo(); * } * } * * 看InetAddress的成员方法: * public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象 */ public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { // public static InetAddress getByName(String host) // InetAddress address = InetAddress.getByName(\"liuyi\"); // InetAddress address = InetAddress.getByName(\"192.168.12.92\"); InetAddress address = InetAddress.getByName(\"192.168.12.63\"); // 获取两个东西:主机名,IP地址 // public String getHostName()--------获取主机名 String name = address.getHostName(); // public String getHostAddress()----返回 IP 地址字符串(以文本表现形式)。 String ip = address.getHostAddress(); System.out.println(name + \"---\" + ip); } }
UDP进行代码测试时---首先运行接受数据---然后运行发送数据
UDP发送数据
/*
* UDP协议发送数据:
* A:创建发送端Socket对象
* B:创建数据,并把数据打包
* C:调用Socket对象的发送方法发送数据包
* D:释放资源
*/
package Day26; import java.io.IOException; import java.net.*; /* * UDP协议发送数据: * A:创建发送端Socket对象 * B:创建数据,并把数据打包 * C:调用Socket对象的发送方法发送数据包 * D:释放资源 */ public class SendDemo { public static void main(String[] args) throws IOException { // 创建发送端Socket对象 //public class DatagramSocketextends Object此类表示用来发送和接收数据报包的套接字 // DatagramSocket() DatagramSocket tt = new DatagramSocket(); //创建数据并把数据打包 //public final class DatagramPacket extends Object此类表示数据报 //public DatagramPacket(byte[] buf,int length,InetAddress address,int port) //buf - 包数据。 //length - 包长度。 //address - 目的地址。 //port - 目的端口号。 // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口 //包数据---创建数据 byte [] buf = \"hello你好\".getBytes();//---将字符串类型的数据转换为字节数组 //获取包长度 int a= buf.length; //目的地地址 //得到IP地址对象---并同时获取主机名和主机的IP地址 InetAddress ia = InetAddress.getByName(\"192.168.1.4\"); //给出发送的目的端口 int port = 10086; //打包数据 DatagramPacket DP = new DatagramPacket(buf,a,ia,port); // 调用Socket对象的发送方法发送数据包 //public void send(DatagramPacket p)throws IOException从此套接字发送数据报包。 //DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 tt.send(DP); //释放资源 tt.close(); } }
UDP接受数据
/*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器)
* C:调用Socket对象的接收方法接收数据
* D:解析数据包,并显示在控制台
* E:释放资源
*/
package Day26; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; //UDP协议接受数据 /* * UDP协议接收数据: * A:创建接收端Socket对象 * B:创建一个数据包(接收容器) * C:调用Socket对象的接收方法接收数据 * D:解析数据包,并显示在控制台 * E:释放资源 */ public class ReceiveDemo { public static void main(String[] args) throws IOException { //创建接收端对象---并给出要接受机器的端口 DatagramSocket DS = new DatagramSocket(10086); //创建一个数据包(接受容器) //public DatagramPacket(byte[] buf,int length) // 构造 DatagramPacket,用来接收长度为 length 的数据包 //buf - 保存传入数据报的缓冲区。 //len - 要读取的字节数。 //指定数据包的大小---用于保存传入的数据报的缓冲区 byte [] bt = new byte[1024]; //获取包的字节数长度 int length = bt.length; DatagramPacket DP = new DatagramPacket(bt,length); //调用Sockt对象的方法来接受数据 //public void receive(DatagramPacket p)从此套接字接收数据报包 //p - 要放置传入数据的 DatagramPacket DS.receive(DP); //解析数据包并显示在控制台上 // 获取发送端对方的ip // public InetAddress getAddress() //某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 InetAddress IA = DP.getAddress(); //public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。 String ip = IA.getHostAddress(); // public byte[] getData():获取数据缓冲区 //用来接收或发送数据的缓冲 // public int getLength():获取数据的实际长度 //将要发送或接收到的数据的长度。 byte[] bt1 = DP.getData(); int get = DP.getLength(); //public String(byte[] bytes,int offset,int length)---将字节数组转换为字符串 //bytes - 要解码为字符的 byte //offset - 要解码的第一个 byte 的索引 //length - 要解码的 byte 数 String s = new String(bt1,0,get); //输出查看某个IP地址的机器传递来的数据包 System.out.println(ip+\"传送的数据是:\"+s); //释放资源 DS.close(); } }
/*
* 数据来自于键盘录入
* 键盘录入数据要自己控制录入结束。
*/
// 封装键盘录入数据-----键盘自己控制录入数据---输入规定字符就会结束循环
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if (\"886\".equals(line)) {
break;
}
UDP发送端
package cn.itcast_04; 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 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[] bys = line.getBytes(); // DatagramPacket dp = new DatagramPacket(bys, bys.length, // InetAddress.getByName(\"192.168.12.92\"), 12345); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName(\"192.168.12.255\"), 12345); // 发送数据 ds.send(dp); } // 释放资源 ds.close(); } }
UDP接收端---接收端应该一直开着等待接收数据,是不需要关闭
package cn.itcast_04; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 多次启动接收端: * java.net.BindException: Address already in use: Cannot bind * 端口被占用。 */ public class ReceiveDemo { public static void main(String[] args) throws IOException { // 创建接收端的Socket对象 DatagramSocket ds = new DatagramSocket(12345); while (true) { // 创建一个包裹 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); // 接收数据 ds.receive(dp); // 解析数据 String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(\"from \" + ip + \" data is : \" + s); } // 释放资源 // 接收端应该一直开着等待接收数据,是不需要关闭 // ds.close(); } }
多线程实现聊天室程序
一:发送端
package cn.itcast_05; 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[] bys = line.getBytes(); // DatagramPacket dp = new DatagramPacket(bys, bys.length, // InetAddress.getByName(\"192.168.12.92\"), 12345); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName(\"192.168.12.255\"), 12306); // 发送数据 ds.send(dp); } // 释放资源 ds.close(); } catch (IOException e) { e.printStackTrace(); } } }
二:接收端
package cn.itcast_05; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveThread implements Runnable { private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) { this.ds = ds; } @Override public void run() { try { while (true) { // 创建一个包裹 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); // 接收数据 ds.receive(dp); // 解析数据 String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(\"from \" + ip + \" data is : \" + s); } } catch (IOException e) { e.printStackTrace(); } } }
三:测试类
package cn.itcast_05; import java.io.IOException; import java.net.DatagramSocket; /* * 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 */ public class ChatRoom { public static void main(String[] args) throws IOException { //创建Socket对象---发送和接收对象 DatagramSocket dsSend = new DatagramSocket(); DatagramSocket dsReceive = new DatagramSocket(12306); //创建对象---并使用构造参数传递其要发送和接收的对象 SendThread st = new SendThread(dsSend); ReceiveThread rt = new ReceiveThread(dsReceive); //创建线程对象并给出运行的对象 Thread t1 = new Thread(st); Thread t2 = new Thread(rt); //启动线程 t1.start(); t2.start(); } }
来源:https://www.cnblogs.com/ztg-java-xuexi/p/16123811.html
本站部分图文来源于网络,如有侵权请联系删除。