网络编程--概述
利用java语言进行网络间的数据传输.
--网络通信要素
IP地址---网络中设备的标识.不易记忆,可用主机名。本地回环地址:127.0.0.1,主机名:localhost
端口号---网络应用程序进程的数字标识。为了方便称呼这个数字,叫做端口--逻辑端口范围0-65535 。其中0-1024:系统使用或保留端口,常用:Web服务(http) 80 ,WWW代理服务 8080MySQL 3306
传输协议---通信的规则。国际组件定义了通用协议TCP/IP,UDP
--网络模型
OSI参考模型
TCP/IO模型
网络底层传输的基本原理:发送端 数据封包-->接收端 数据解包--> 到达对应的端口上,发送端和接收端都参考OSI模型,每一层都会加上该层特有数据信息.
传输层常见的协议:TCP,UDP
网际层常见的协议:IP
应用层常见的协议:HTTP
扫盲--IP地址
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。用点分十进制表示。
--IP地址 分类
A类范围1.0.0.1-126.255.255.254,子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。
B类范围128.1.0.1-191.254.255.254,子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台。
C类范围192.0.1.1-223.255.254.254,子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台。
特殊网络地址:
多点广播地址:范围224.0.0.1-239.255.255.254
127.0.0.1到127.1.1.1用于回路测试,127.0.0.1 可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。
测试网卡,ping 127.0.0.1
import java.net.*;
class IPDemo
{
public static void main(String[] args) throws UnknownHostException
{
InetAddress i = InetAddress.getLocalHost();//获取本地主机
System.out.println(i.toString());
System.out.println("adress:"+i.getHostAddress());//获取本地主机地址
System.out.println("name:"+i.getHostName());//获取本地主机名
InetAddress ia = InetAddress.getByName("www.baidu.com");//在给定主机名的情况下确定主机的 IP 地址。
System.out.println("adress:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName());
}
}
TCP和UDP
UDP
将数据及源和目的封装成数据包,不需要建立连接
每个数据包的大小限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快.
UDP的连接有哪些:
聊天 视屏会议 桌面共享都是UDP
UDP相当于步话机
TCP相当于打电话
TCP
建立连接,形成传输数据的通道,
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
确定对方在不在 三次握手完成 1,哥们在吗 2,哥们回答我在 3,我知道你在了
Socket编程:
Socket 相当于插座
Socket就是为网络服务提供的一种机制.
通信的两端都有Socket.
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输.
UDP传输演示
需求:通过udp传输方式,将一段文字数据发送出去.
思路:
1,建立udpsocket服务.
2,提供数据,并将数据封装到数据包中.
3,通过socket服务发送功能,将数据包发出去.
4,关闭资源.
import java.net.*;
import java.io.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
//创建UDP的socket服务
DatagramSocket ds = new DatagramSocket();
//创建一个数据包,把数据,数据长度,目的,端口封装到包中,由键盘输入内容
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.2"),10001);
//通过socket服务,将已有的数据包发送出去,用send方法.
ds.send(dp);
}
//关闭资源
ds.close();
}
}
定义一个应用程序,用于接收udp协议传输的数据并处理
思路:
1,定义udp的socket服务,通过会监听一个端口.其实就是给这个接受网络应用程序定义数字标识.
方便于明确哪些数据过来该应用程序可以处理.
2,提供一个数据包用于存储接收到的字节数据.因为数据包中提供更多更能可以提取字节数据中的不同数据信息.
3,通过socket服务的receive方法将收到的数据存入已定义好 的数据包中.
4,通过数据包对象的特有功能,将这些不同数据取出,打印在控制台上.
5,关闭资源.
class UdpRece
{
public static void main(String[] args) throws Exception
{
//创建udp的socket服务,建立端点.
DatagramSocket ds = new DatagramSocket(10001);
while(true)
{
//定义数据包,用于存储数据.
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//通过服务的receive方法将收到的数据存入数据包中.
ds.receive(dp);//阻塞式方法
//通过数据包的方法,获取包中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
}
//关闭资源
//ds.close();
}
}
Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
端口被使用 ,绑定异常.
TCP传输演示
import java.net.*;
import java.io.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务
Socket s = new Socket("192.168.0.2",10005);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp gen men wo lei l ".getBytes());
s.close();
}
}
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务,并监听一个端口.
ServerSocket ss = new ServerSocket(10005);
//通过accept方法获取连接过来的客户端对象.
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据.
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端.
ss.close();//关闭服务端.(可选)
}
}