黑马程序员——Java基础之网络编程

来源:互联网 发布:linux的dd命令详解 编辑:程序博客网 时间:2024/05/21 17:42

网络编程

网络模型: osi参考模型;tcp/ip参考模型

网络通讯要素:ip地址(大楼);端口号(房间);传输协议(通讯规则)


Ip是四段,一个字节。最大配到255.

有一个ip地址:127.0.0.1本地回环地址,ping测试网卡。有部分地址保留作为局域网使用,可重复。

当地址不够使用时,通过子网掩码使得一个区域使用一个公网ipIpv6不仅含有数字还有字母。所以他可以组合很多的地址。Web端口:80tom端口:8080;数据库端口:3306


OSI参考模型:应用层||数据在应用层封装按照数据表现规则表示层||会在数据上加上自己的标识会话层||继续封装

传输层||基本打包完成网络层||ip地址数据链路层||底层传输协议,通过什么协议出去。物理层||实在的,网线标准的物理层设备,数据被封装层包。流程叫做数据封包。【】

逆序拆包,一层一层拆包,每层都读取相应的层的标识。最后出来会确定端口,然后程序 解析数据。【】


TCP参考模型:应用层http ftp协议||传输层常见udp tcp协议||网际层常见ip协议||主机至网络层||

Ip地址一般都是四段IPV4,还有IPV6,使用主机名记忆。Baidu就是ip地址,使用主机名。

static InetAddress getLocalHost()返回本地主机。静态方法,获取对象。然后使用非静态方法。

static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址。

static InetAddress getByAddress()返回 IP 地址字符串(以文本表现形式)。

[]如果ip地址和对应的主机名的映射关系没有在网络上,我的主机出去找这个地址找到了,但是没有解析成功。所以name:192.168.1.106www.baidu.com就是百度的主机名(不为一,所以会返回数组[])。但是会出现解析错误。[InetAddress对象]

 

背也得背的下来:

UDP1,将数据及源和目的封装成数据包中,不需要建立连接。

2,每个数据包的大小在限制在64K

  3,因为面向无连接,是不可靠协议。

4,不需要建立连接,速度快找不到包就丢掉。[步话机]

TCP1,面向连接,形成传输数据的通道。

2,在连接中进行大数据量传输。

3,通过三次握手完成连接,是可  靠协议。

4,必须建立连接,效率会稍低。[记忆模型:打电话]

Socket[插座]

Socket就是为网络服务提供的一种机制。通信的两端都有Socket(码头)。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。

方法: void send(DatagramPacket p)从此套接字发送数据报包。

void receive(DatagramPacket p)从此套接字接收数据报包。

 

UDP传输:[主要记住流程,代码查文档(步话机)]

需求:通过udp传输方法,将一段文字数据发送出去

思路:1建立updsocket服务:通过DatagramSocket对象。【注意导包

DatagramSocket ds=new DatagramSocket(8888);//也可以固定自己的端口;

 2提供数据,并将数据封装到数据包中。

BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

String line=null;while((line=bufr.readLine())!=null){

if(“886”.equals(line)) break;//新增的表示为聊天式 

byte[] buf=”upv ni hao”line.getBytes(); 

DatagramPacket dp=

newDatagramPacket(buf,buf.length,InetAddress.getByName(“192.168.1.254”),10000);

 3,通过socket服务的发送功能,将数据包发出去。

ds.send(dp);}

 4,关闭资源。

ds.close();



需求:定义一个应用程序,用于接收udp协议传输的数据并处理。

思路:1,定义udpSocket服务。通常会监听一个端口,其实就是给这个接受

网络应用程序定义数字标识,方便于明确哪些数据过来由该程序处理。

DatagramSocket ds=new DatagramSocket(10000);//创建udp socket,建立端点

while(true){//一直接收

 2,定义数据包:因为接收的是数据包,从接收到的字节提取主要数据很费力,所以把字节全部往数据包里放,数据包里有分解该字节的方法。

//定义数据包,用于存储数据

byte[] buf=new byte[1024];

DatagramSocket dp=new DatagramSocket(buf,buf.length); 

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

ds.receive(dp);//通过服务的receive方法将收到的数据存入数据包(阻塞式方法,等待..

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

//通过数据包的方法获取其中的数据

String ip=dp.getAddress().getHostAddress();

String data=new String(dp.getData(),0,dp.getLength());

int port=dp.getPort();sop(ip+”::”+data+”::”+port);}

 5,关闭资源。

ds.close();dosstart瞬间打开两个命令行,并且地址相同。

/* * 编写一个聊天程序【要求自己写出来】 * 分析:有收数据的部分和发数据的部分。这两部分同时执行。那就需要使用到多线程技术。 * 一个线程控制收,一个线程控制发。因为收和发动作是不一致的, * 所以要定义两个run方法。而且这两个方法要封装不同的类中。 */import java.io.*;import java.net.*;class Send implements Runnable{private DatagramSocket ds;public Send(DatagramSocket ds){this.ds=ds;}public void run(){try{BufferedReader bufr=new BufferedReader(new InputStream(System.in));String line=null;while((line=bufr.readLine())!=null){if("886".equals(line)) break;byte[] buf=line.getBytes();DatagramSocket dp=new DatagramSocket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);ds.send(dp);}}catch(Exception e){ throw new RuntimeException("发送端失败");}}}class Rece implements Runnable{private DatagramSocket ds;public Rece(DatagramSocket ds){this.ds=ds;}public void run(){try{while(true){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);}}catch(Exception e){ throw new RuntimeException("接收端失败");}}}class ChatDemo{public static void main(String[] args) throws Exception{DatagramSocket sendSocket=new DatagramSocket();DatagramSocket receSocket=new DatagramSocket(10002);new Thread(new Send(sendSocket)).start();new Thread(new Rece(receSocket)).start();}}




TCP传输:

TCP分为客户端和服务端对应的对象分别为SocketServerSocket建立。

客户端:通过查阅socket对象,发现在该对象建立时,就可以去连接制定主机。因为tcp是面向对象的,所以在建立socket服务时,就要有服务端存在,并连接成功、形成通路之后,在该通道进行数据的传输。

/* * 演示tcp的传输的客户端和服务端的互访 * 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息 */package netdemo;import java.io.*;import java.net.*;/* * 客户端: * 1,建立socket服务,指定要连接主机和端口。 * 2,获取socket流中的输出流。将数据写到该流中,通过网络发送给服务端。 * 3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。 * 4,关闭客户端资源。 */public class TcpDemo {public static void main(String[] args)throws Exception {// TODO Auto-generated method stub//建立socket服务,制定要连接的主机和端口Socket s =new Socket("192.168.1.254",10004);//获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端OutputStream out =s.getOutputStream();out.write("服务端,你好"。getBytes());InputStream in =s.getInputStream();//客户端读取byte[] buf =new byte[1024];//建立缓冲区int len =in.read(buf);System.out.println(new String(buf,0,len));s.close();}}class TcpServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10004);//1创建服务端对象。Socket s=ss.accept();//2,获取连接过来的客户端对象。String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"----conneted");InputStream in =s.getInputStream();//3,通过socket对象获取输入流,要读取客户端发来的数据byte[] buf=new byte[1024];int len =in.read(buf);System.out.println(new String(buf,0,len));//使用客户端socket对象的输出流给客户端返回数据反馈信息OutputStream out= s.getOutputStream();out.write("你好,我已收到");}}


0 0
原创粉丝点击