黑马程序员——Java基础之网络编程
来源:互联网 发布:linux的dd命令详解 编辑:程序博客网 时间:2024/05/21 17:42
网络编程
网络模型: osi参考模型;tcp/ip参考模型
网络通讯要素:ip地址(大楼);端口号(房间);传输协议(通讯规则)
Ip是四段,一个字节。最大配到255.
有一个ip地址:127.0.0.1本地回环地址,ping测试网卡。有部分地址保留作为局域网使用,可重复。
当地址不够使用时,通过子网掩码使得一个区域使用一个公网ip。Ipv6不仅含有数字还有字母。所以他可以组合很多的地址。Web端口:80;tom端口: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.106。www.baidu.com就是百度的主机名(不为一,所以会返回数组[])。但是会出现解析错误。[InetAddress对象]
背也得背的下来:
UDP:1,将数据及源和目的封装成数据包中,不需要建立连接。
2,每个数据包的大小在限制在64K内
3,因为面向无连接,是不可靠协议。
4,不需要建立连接,速度快。找不到包就丢掉。[步话机]
TCP:1,面向连接,形成传输数据的通道。
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();dos:start瞬间打开两个命令行,并且地址相同。
/* * 编写一个聊天程序【要求自己写出来】 * 分析:有收数据的部分和发数据的部分。这两部分同时执行。那就需要使用到多线程技术。 * 一个线程控制收,一个线程控制发。因为收和发动作是不一致的, * 所以要定义两个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分为客户端和服务端对应的对象分别为Socket和ServerSocket建立。
客户端:通过查阅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("你好,我已收到");}}
- 黑马程序员——JAVA基础之网络编程
- 黑马程序员——Java基础之网络编程
- 黑马程序员——Java基础之网络编程
- 黑马程序员—java基础之网络编程
- 黑马程序员—JAVA基础之网络编程
- 黑马程序员—【Java基础篇】之网络编程
- 黑马程序员---java基础之网络编程
- <<黑马程序员>>java基础之网络编程
- 黑马程序员---java基础之网络编程
- 黑马程序员--JAVA基础之网络编程
- 黑马程序员--Java基础之网络编程
- 黑马程序员-java基础之网络编程
- 黑马程序员 Java基础之网络编程
- 黑马程序员 java基础之网络编程
- 黑马程序员java基础之网络编程
- 黑马程序员-JAVA基础之网络编程
- 黑马程序员——Java基础---网络编程(UDP编程)
- 黑马程序员——Java基础---网络编程(TCP编程)
- 第三章第32题
- js弹窗,div弹窗效果
- spark-broadcast
- java中的多线程
- LeetCode【1】. Two Sum--java的不同方法实现
- 黑马程序员——Java基础之网络编程
- Spark-杂项
- p123,32
- C++刷题——1938: 首字母变大写
- 杭电ACM1312——Red and Black~~广搜
- 语音对讲---基于图灵机器人+科大讯飞
- Spark-storage
- 第一次学习python感受
- [Unity技巧]单例基类