网络编程--概述

利用java语言进行网络间的数据传输.

--网络通信要素

IP地址---网络中设备的标识.不易记忆,可用主机名。本地回环地址:127001,主机名:localhost

端口号---网络应用程序进程的数字标识。为了方便称呼这个数字,叫做端口--逻辑端口范围0-65535 。其中0-1024:系统使用或保留端口,常用:Web服务(http) 80 ,WWW代理服务 8080MySQL 3306

传输协议---通信的规则。国际组件定义了通用协议TCP/IPUDP

--网络模型

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,每个网络支持的最大主机数为2563次方-2=16777214台。

B类范围128.1.0.1-191.254.255.254,子网掩码为255.255.0.0,每个网络支持的最大主机数为2562次方-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

127001127111用于回路测试,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());

 }

}

 

TCPUDP

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

 {

  //创建UDPsocket服务

  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,定义udpsocket服务,通过会监听一个端口.其实就是给这个接受网络应用程序定义数字标识.

 方便于明确哪些数据过来该应用程序可以处理.

2,提供一个数据包用于存储接收到的字节数据.因为数据包中提供更多更能可以提取字节数据中的不同数据信息.

3,通过socket服务的receive方法将收到的数据存入已定义好 的数据包中.

4,通过数据包对象的特有功能,将这些不同数据取出,打印在控制台上.

5,关闭资源.

class  UdpRece

{

 public static void main(String[] args) throws Exception

 {

  //创建udpsocket服务,建立端点.

  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();//关闭服务端.(可选)

 }

}