---------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
1.网络
1.概述
如果在网络之间应用程序能够通信,那么就需要三个元素(IP,端口和协议)
IP:在网络上的每一个计算机,或者在网络上进行通信的工具,都需要标识自己,那么就会IP地址来标识,IP地址常用的是32位二进制,也有128位的二进制标识。
端口:因为每一个设备上有很多应用程序,那么我们就需要来区分,标识这应用程序,就是每一个应用程序都有自己的端口号来标识自己,都是用数字进行标识。是逻辑地址。0~65535范围,其中0~1024不能使用,因为系统端口号或者保留端口。
协议:就是在网络上通信的规则,必须双方都遵守这个规则,那么双方才能通信,有很多协议的,我们常用的是TCP/IP,UDP协议。
网络模型:OSI参考模型和TCI/IP模型
OSI参考模型:应用层,表示层,会话层,传输层,网络层,链路层,物理层
TCP/IP体系:应用层,传输层,互联层,主机网络层
2.InetAddress
import java.net.InetAddress;
public class InterAddressDemo {
public static void main(String[] agrs) throws Exception {
/**
* 获得本机地址,名字和IP
*/
InetAddress ia = InetAddress.getLocalHost();
System.out.println(ia);
System.out.println("名字:" +ia.getHostName());
System.out.println("地址:" +ia.getHostAddress());
/**
* 获得百度的,
* 地址和名字可能不唯一,因为百度对应多个IP和地址
*/
InetAddress ia1=InetAddress.getByName("www.baidu.com");
System.out.println(ia1);
System.out.println("名字:" +ia1.getHostName());
System.out.println("地址:" +ia1.getHostAddress());
}
}
结果:
yang-PC/192.168.1.101
名字:yang-PC
地址:192.168.1.101
www.baidu.com/220.181.111.148
名字:www.baidu.com
地址:220.181.111.148
3.传输协议
UDP:面向无连接的(发数据之前不需要建立连接,打成包,)。不可靠协议,速度快,数据报大小限制在64k内,速度快,例如:qq,网络会议
TCP:要建立连接,可以传输大量数据 通过三次握手玩成连接是可靠协议 必须建立连接,效率低,例如:下载,打电话
2. Socket
1.Socket
Socket就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket的通信
数据在两个Socket间通过IO传输
2. UDP-DatagramSocket
创建步骤:
1.建立发送端和接收端
2.建立数据包。
3.调用Socket的发送和接受方法
4.关闭Socket
需求:通过UDP传输方式,将一段文字发送出去。
1.建立udpsocket服务
2.提供数据,将数据封装到数据包中
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源
接收:
需求:定义一个应用程序,用于接收数据并处理
1.定义UDF服务
2.定义一个数据包(无数据,用于存储接收到的字节数据),用其方法提取在包中数据信息
3.通过receive方法接受数据
4.从数据包中提取信息,然后打印在控制台上
5,关闭资源
发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 发送端
*/
public class UdpSend {
public static void main(String[] args) throws Exception{
/**
* 定义服务,可以指定当前端口,如果不指定那么就是随机的
* 定义数据包,指定要发送信息,长度,对方的地址和端口
* 发送,关闭
*/
DatagramSocket socket=new DatagramSocket(20000);//如果不指定,那么就是随机分配
String str="hello world";
DatagramPacket packet=newDatagramPacket(str.getBytes(),str.length(), “192.168.1.101”,10000);
socket.send(packet);//发送
socket.close();
}
}
接收
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 接收端
*/
public class UdpReceive {
public static void main(String[] args) throws Exception {
/**
* 定义服务,指定本端口号,此端口号要和发送端发动的地址一样定义数据包,然后从数据包中提取信息,关闭
*/
DatagramSocket socket = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);// 接收这是一个阻塞方法
System.out.println(packet.getAddress().getLocalHost());
System.out.println("信息:"
+ new String(packet.getData(), 0, packet.getLength()));
System.out.println("端口号:" + packet.getPort());
socket.close();
}
}
结果:
yang-PC/192.168.1.101
信息:hello world
端口号:20000
3.键盘录入发送
发送端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 发送端
*/
public class UdpSend {
public static void main(String[] args) throws Exception{
/**
* 定义服务,可以指定当前端口,如果不指定那么就是随机的
* 键盘循环录入
* 定义数据包,指定要发送信息,长度,对方的地址和端口
* 发送,关闭
*/
DatagramSocket socket=newDatagramSocket(20000);//如果不指定,那么就随机分配
BufferedReader br=new BufferedReader(newInputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null){
if(line.equals("886"))
break;
DatagramPacketpacket=new DatagramPacket(line.getBytes(),line.length(),“192.168.1.101”,10000);
socket.send(packet);//发送
}
socket.close();
}
}
接收端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 接收端
*/
public class UdpReceive {
public static void main(String[] args) throws Exception {
/**
* 定义服务,指定本端口号,此端口号要和发送端发动的地址一样定义数据包,
* 循环接收数据
* 然后从数据包中提取信息
*/
DatagramSocket socket = new DatagramSocket(10000);
while (true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);// 接收这是一个阻塞方法
System.out.println(packet.getAddress().getLocalHost());
System.out.println("信息:"
+ new String(packet.getData(), 0, packet.getLength()));
System.out.println("端口号:" + packet.getPort());
}
}
}
向广播地址发的话,那么就会所有的计算机当前网络都会收到。
要是想扩展的话,比如:把接收到的数据存到文件中,那么就读取一条信息就开始存,这样循环存储,道理是一样的。
4 .聊天程序
因为有发和接收,所以需要用到同步,那就用到了多线程。
发送端
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 CharSend implements Runnable {
private DatagramSocket sock;
public CharSend(DatagramSocket sock) {
this.sock = sock;
}
public void run() {
BufferedReader bufR = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
try {
while ((line = bufR.readLine()) != null) {
if (line.equals("baibai"))
break;
byte[] bu = line.getBytes();
DatagramPacket pac = new DatagramPacket(bu, bu.length,
InetAddress.getByName("192.168.1.101"), 30001);
sock.send(pac);
}
} catch (IOException e) {
e.printStackTrace();
}
sock.close();
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端循环的接收
*/
public class CharReceive implements Runnable {
private DatagramSocket sock;
public CharReceive(DatagramSocket sock) {
this.sock = sock;
}
public void run() {
while (true) {
try {
byte[] bu = new byte[1024];
DatagramPacket pac = new DatagramPacket(bu, bu.length);
sock.receive(pac);
String ip = pac.getAddress().getHostAddress();
byte[] data = pac.getData();
String da = new String(data, 0, pac.getLength());
int port = pac.getPort();
System.out.println(ip + ":" + da + ":" + port);
} catch (IOException e) {
System.out.println("接受失败");
}
}
}
}
测试
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 测试类
* @author yang
*
*/
public class CharText {
public static void main(String[] args) throws SocketException {
DatagramSocket send = new DatagramSocket();// 发送服务
DatagramSocket rece = new DatagramSocket(30001);// 接受服务,此时的端口号要和发送端要发送的端口育养
new Thread(new CharReceive(rece)).start();// 开始接收
new Thread(new CharSend(send)).start();// 开启发送
}
}
结果
结果:
你好
192.168.1.101:你好:51813
大家好
192.168.1.101:大家好:51813
很高兴认识你
192.168.1.101:很高兴认识你:51813
---------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------