网络编程----说白了就是Socket编程.....
✔网络模型
OSI参考模型
TCP/IP参考模型
✔网络通讯要素
IP地址
端口号
传输协议
应用层--协议:http,ftp等
传输层--协议:tcp,udp
网际层—协议:ip
网络通讯要素
✔IP地址
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localHost
✔端口号
用于标识进程的逻辑地址,不同进程标识
有效端口:0~65535,其中0~1024系统使用或保留端口
✔传输协议
通讯的规则
常见协议:TCP,UDP
TCP和UDP
✔UDP
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小限制在64K内
因无连接,是不可靠协议
不需要建立连接,速度快
✔TCP
建立连接,形成传输数据的通道
在连接中进行大数据量的传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
UDP面向无连接,数据需要封包(限制在没包64K以内).现实比拟,邮局发包裹.
TCP面向连接,现实比拟打电话过程.UDP现实比拟对讲机传话过程.
java.net 包中,用于描述IP地址的
类 InetAddress
Socket
✔Socket就是为网络服务提供的一种机制
✔通信的两端都有Socket
✔网络通信其实就是Socket间的通信
✔数据在两个Socket间通过IO传输
Socket[插座;套接字]玩Socket主要记住流程.----网络编程就是Socket编程
Socket就是港口.接送货物的...
UDP传输
✔DatagramSocket与DatagramPacket
✔建立发送端,接受端
✔建立数据包
✔调用Socket的发送接受方法
✔关闭Socket
发送端与接收端是两个独立的运行程序
需求一:通过UDP协议传输一段文字数据到指定目的地.
思路:
1,建立UDPSocket服务
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发出去
4,关闭资源
需求二:接受一个UDP协议传输过来的数据
思路:
1,定义UDPSocket服务,通常会监听一个端口,其实就是给这个接受网络应哟个程序定义数字标识.
方便于明确那些数据过来该应用程序可以处理.
2,定义一个数据包,因为要存储接受到的字节数据
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3,通过socket服务的receive()方法将收到的数据存入已经定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5,关闭资源ok
接收端要指定一个监听的端口,时刻关注属于自己的包裹.
实例:实现,循环输入,循环接收………
import java.io.*;
import java.net.*;
class UdpSend{
public static void main(String[] args)throws Exception{
//建立socket服务,参数默认,系统自动分配端口.
DatagramSocket ds=new DatagramSocket();
//实现,键盘录入,实时发送消息
BufferedReader bur=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bur.readLine())!=null){
if(line.equals("exit"))
break;
byte[] btbuf=line.getBytes();
//建立包裹,指定数据缓冲byte数组和其长度,并指定ip,和端口
DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("127.0.0.1"),10000);
//发送.
ds.send(dp);
}
//exit后,关闭
ds.close();
}
}
class UdpRece{
public static void main(String[] args)throws Exception{
//建立服务,指定以下端口,让他在这个端口处等候,包裹的到来
DatagramSocket ds=new DatagramSocket(10000);
//建立循环接受---内部有阻塞方法,不能构成死循环
while(true){//注意 new DatagramSocket不要丢尽循环,会报[端口绑定异常]
//建立byte缓存,以便下面等待包裹
byte[] buf=new byte[1024];
//建立包裹存储收到的包裹
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//结束命令启动
ds.receive(dp);
//获取信息
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data+"---"+dp.getPort());
}
}
}
注意:
192.168.1.0网络段
192.168.1.255广播地址,所有的ip段内的ip都能接收到.
用UDP自制简单局域网聊天小程序
import java.io.*;
import java.net.*;
class UdpSend implements Runnable{
private DatagramSocket ds;
UdpSend(DatagramSocket ds){
this.ds=ds;
}
public void run(){
//建立socket服务,参数默认,系统自动分配端口.
try{
//实现,键盘录入,实时发送消息
System.out.println("----------------------------------");
BufferedReader bur=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bur.readLine())!=null){
if(line.equals("exit"))
break;
byte[] btbuf=line.getBytes();
//建立包裹,指定数据缓冲byte数组和其长度,并指定ip,和端口
DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("192.168.1.255"),10000);
//发送.
ds.send(dp);
}
//exit后,关闭
ds.close();
}
catch(Exception i){
throw new RuntimeException("检修");
}
}
}
class UdpRece implements Runnable{
private DatagramSocket ds;
UdpRece(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
//建立服务,指定以下端口,让他在这个端口处等候,包裹的到来
//建立循环接受
while(true){
//建立byte缓存,以便下面等待包裹
byte[] buf=new byte[1024];
//建立包裹存储收到的包裹
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//结束命令启动
ds.receive(dp);
//获取信息
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println("*******************************");
System.out.println(ip+":"+data+"---"+dp.getPort());
System.out.println("*******************************");
}
}catch(Exception e){
throw new RuntimeException(" ");
}
}
}
class chat{
public static void main(String[] args)throws Exception{
DatagramSocket ds=new DatagramSocket();
DatagramSocket d=new DatagramSocket(10000);
System.out.println("聊天模式启动");
new Thread(new UdpSend(ds)).start();
new Thread(new UdpRece(d)).start();
}
}