Java基础---网络编程 ip udp

package cn.itcast.ip;


import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;


/*
 网络编程:主要用于解决计算机与计算机(手机,平板)之间的数据传输问题。
 
 网络编程:不需要基于html页面就可以达到数据之间的传输。比如:QQ,微信
 
 网页编程:就是要基于html页面的基础上进行数据的交互的,比如:珍爱网,oa(办公自动化),高考的报考系统。。
 
计算机网络:分布在不同地域的计算机通过外部设备链接起来达到消息互通,资源共享的效果就称作为一个计算机网络


网络通讯的三要素:
 1.IP
 2.端口号
 3.协议
 
     
     192.168.10.1
     
     IP地址:IP地址的本质就是一个由32位的二进制数据组成的数据。后来别人为了方便我们记忆IO地址,就把IP地址切成4份,每份8bit。2^8=0~255
     
     00000000-00000000-00000000-00000000
     
     IP地址 = 网络号+主机号
     
     IP地址的分类:
     A类地址 = 一个网络号+三个主机号 2^24 政府单位用
     B类地址 = 两个网络号+两个主机号 2^16事业单位(学校,银行。。。)
     C类地址 = 三个网络号+一个主机号 2^8 私人使用
     
   InetAddress  (IP类):
   
   常用的方法:
   getLocalhosHost()获取本机的IP地址对象
    getByName("IP或者主机名")根据一个IP地址的字符串形式或者一个主机名生成一个IP地址对象。(用于获取别人的IP地址对象) 
   getHostAddress() 返回一个IP地址的字符串表示。
   getHostName()  返回计算机的主机名
   getByName()  
   
   端口号是没有类描述的:
     端口号的范围:0-65535
     
     0-1023,系统紧密绑定于一些服务
     1024-49151 系统松散地绑定一些服务  我们可以使用的。。。
     
     常用端口号:21 FTP
         80 HTTP
         443 HTTPS
         
 网络通信协议:
 
 UDP协议:
 
 TCP协议:
 */
public class Demo1 {


public static void main(String[] args) throws IOException {
/*// getLocalhosHost  获取本机的IP地址对象
InetAddress address = InetAddress.getLocalHost();
System.out.println("Ip地址:"+address.getHostAddress());
System.out.println("主机名:"+address.getHostName());
*/
//获取别人机器的IP地址对象
InetAddress address = InetAddress.getByName("192.168.15.50");
System.out.println("Ip地址:"+address.getHostAddress());
System.out.println("主机名:"+address.getHostName());

InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");//域名
}


}




package cn.itcast.udp;


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


/*
 在Java中网络通讯也称为Socket(插座)通讯,要求通讯的两台机器必须要安装socket。
 
 不同的协议就有不同的插座(Socket)
 
 UDP通讯协议的特点:
 
 1.将数据及其源和目的封装为数据包,面向无连接。
 
2. 每个数据包大小限制在64K中
 3.因为无连接,所以不可靠
4. 因为不需要建立链接,所以速度快
5.udp通讯是不分服务端与客户端的,只分发送端与接收端
 
 比如:物管的对讲机,飞Q聊天,游戏。。。
 
 
 udp协议下的Socket:

DatagramSocket(udp插座服务)
DatagramPacket(数据包类)
DatagramPacket(buf, length, address, port)
buf: 发送的数据内容
length : 发送数据内容的大小。
address : 发送的目的IP地址对象
port : 端口号。


发送端的使用步骤:
1. 建立udp的服务。
2. 准备数据,把数据封装到数据包中发送。 发送端的数据包要带上ip地址与端口号。
3. 调用udp的服务,发送数据。
4. 关闭资源。


 
 
 
 */
public class Demo1Sender {


public static void main(String[] args) throws IOException {
//建立udp服务
DatagramSocket datagramSocket = new DatagramSocket();
//准备数据,把数据封装到数据包中。
String data = "这个是我的第一个udp的例子";
DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getLocalHost(),9090);

//调用udp的服务发送数据包
datagramSocket.send(packet);
//关闭资源
datagramSocket.close();


}


}




package cn.itcast.udp;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
 接收端的使用步骤:
   1.建立udp的服务
   2.准备空的数据包接收数据。
   3.调用udp的服务接收数据
   4.关闭资源
 */
public class Demo1Receive {


public static void main(String[] args) throws IOException {
//建立udp的服务,并且要监听一个端口。
DatagramSocket socket = new DatagramSocket(9090);

//准备空的数据包用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket datagramPacket= new DatagramPacket(buf,buf.length);
//调用udp服务接收数据
socket.receive(datagramPacket);//receive 是一个阻塞型的方法,没有接收到数据之前会一直等待。数据实际上就是存储到了byte的自己数组中了

System.out.println("接收端接收到的数据:"+new String(buf,0,datagramPacket.getLength()));
//关闭资源
socket.close();


}


}




package cn.itcast.udp;


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


/*
 
 使用使用udp协议给飞Q发送消息
每个网络程序都有自己所处理的特定格式数据,如果接收到的数据不符合指定的格式,那么就会被当成垃圾数据丢弃。(加密..) 
 飞Q接收的数据格式:
 version:time :sender : ip: flag:content ;
 版本号          时间         发送人   :IP: 发送的标识符(32): 真正的内容;


 在udp协议中,有一个IP地址称作为广播地址,广播地址就是主机号为255地址。


 给广播IP地址发送消息的时候,在同一个网络段的机器都可以接收 到信息。
 192.168.15.255
 */
public class FeiQDemo {


public static void main(String[] args) throws IOException {
// 建立udp的服务
DatagramSocket socket = new DatagramSocket();
// 准备数据,把数据封装到数据包中
String data = getData("feiQ你好!");
DatagramPacket packet = new DatagramPacket(data.getBytes(),
data.getBytes().length,
InetAddress.getByName("192.168.15.255"), 2425);
// 发送数据
socket.send(packet);
// 关闭资源
socket.close();


}


// 把数据拼接成指定格式的数据
public static String getData(String content) {
StringBuilder sb = new StringBuilder();
sb.append("1.0:");
sb.append(System.currentTimeMillis() + ":");
sb.append("习大大:");
sb.append("192.168.10.1:");
sb.append("32:");
sb.append(content);


return sb.toString();
}


}




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;
import java.net.UnknownHostException;


//群聊发送端
public class ChatSender extends Thread {

@Override
public void run() {
try {
//建立udp的服务
DatagramSocket socket = new DatagramSocket();
//准备数据,把数据封装到数据包中发送
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet  = null;
while((line = keyReader.readLine())!=null){
//把数据封装 到数据数据包中,然后发送数据。
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.15.255"), 9090);
//把数据发送出去
socket.send(packet);
}
//关闭 资源
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}



}




package cn.itcast.udp;


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


//群聊接收端
public class ChatReceive extends Thread {

@Override
public void run() {
try {
//建立udp的服务,要监听一个端口
DatagramSocket socket = new DatagramSocket(9090);
//准备空的数据包存储数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag){
socket.receive(packet);
// packet.getAddress() 获取对方数据 包的IP地址对象。
System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf,0,packet.getLength()));
}
//关闭资源
socket.close();

}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


}




package cn.itcast.udp;


public class ChatMain {

public static void main(String[] args) {
ChatReceive chatReceive = new ChatReceive();
chatReceive.start();

ChatSender chatSender = new ChatSender();
chatSender.start();


}


}



package cn.itcast.udp;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;


/*
udp是一个不可靠(数据包可能会丢失)的协议




什么情况下数据包会出现丢失呢?
1.带宽不足 。
2.cpu的处理能力不足。




 */
public class SafeSender {

public static void main(String[] args) throws Exception {
//建立udp的服务
DatagramSocket socket = new DatagramSocket();
//准备数据,数据封装到数据中发送
DatagramPacket packet = null;
for(int i =  0 ; i< 10; i++){  //连续发送10个数据包
String data =i +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
//发送数据包
socket.send(packet);
}
//关闭资源
socket.close();
}


}




package cn.itcast.udp;


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


public class SafeReceive {

public static void main(String[] args) throws IOException, Exception {
//建立udp的服务
DatagramSocket socket = new DatagramSocket(9090);

//建立空的数据包存储数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);

//不断接收数据包
while(true){
socket.receive(packet);
System.out.println(new String(buf,0,packet.getLength()));
Thread.sleep(10);
}



}




}

猜你喜欢

转载自blog.csdn.net/sophiaviayang/article/details/77433962
今日推荐