----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1、网络模型:OSI参考模型(7层)和TCP/IP参考模型(4层)
2、网络通信要素:IP地址,端口号、传输协议。
1)IP地址:
A、它是网络中的设备标识
B、不易记忆,可用主机名表示,两者存在映射关系
C、本机回环地址:127.0.0.1,主机名为:localhost
2)端口号:
A、用于标识进程的逻辑地址,不用进程的标识。
B、有效端口:0 ~ 65535,系统使用或保留的端口是:0 ~ 1024.
3)传输协议:
A、即通信规则,包含TCP和UDP协议
B、UDP是面向无连接,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中
协议特点:
a、面向无连接,即将数据及源和目的封装成数据包中,不建立链接的发送
b、每个数据报的大小限制在64K之内
c、因无连接,是不可靠的协议
d、不建立连接,速度快。可以类比传呼机,呼叫不确定对方是否在。
C、TCP是面向连接的,必须连接成功才能传输数据,应用于下载等程序上
协议特点:
a、面向连接,在建立连接后,形成传输数据的通道
b、在连接中进行大数据量的传输
c、通过三次握手完成连接,是可靠的协议
d、必须建立连接,效率稍慢。 可以类比打电话,需要两边相互交流。
三次握手:第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。
import java.io.*;
import java.net.*;
//发送数据
class SendSocket implements Runnable
{
//定义全局变量
private DatagramSocket ds;
//初始化发送类对象的参数
public SendSocket(DatagramSocket ds)
{
this.ds = ds;
}
//覆写run方法,此线程发送键盘录入的数据
public void run()
{
try
{
//创建读取流,读取键盘数据
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))
break;
byte[] b = line.getBytes();
//创建发送服务对象,将数据发送出去
DatagramPacket dp =
new DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.255"),10001);
ds.send(dp);
}
//关闭资源
ds.close();
}
catch (Exception e)
{
throw new RuntimeException("发送失败");
}
}
}
//接收数据
class ReceSocket implements Runnable
{
//定义全局变量
private DatagramSocket ds;
//初始化接收类对象的参数
public ReceSocket(DatagramSocket ds)
{
this.ds = ds;
}
//覆写run方法,此线程接收数据
public void run()
{
try
{
//循环读取接收到的数据
while(true)
{
//创建字节数组存储数据
byte[] by = new byte[1024];
//创建接收数据的对象,接收数据
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
//获取发送方的ip地址
String ip = dp.getAddress().getHostAddress();
//getData获取byte数组中的数据
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收失败");
}
}
}
//测试
class SocketDemo
{
public static void main(String[] args) throws Exception
{
//创建发送和接收服务的对象
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10001);
//创建两个线程,同时执行
new Thread(new SendSocket(sendSocket)).start();
new Thread(new ReceSocket(receSocket)).start();
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------