黑马程序员---网络编程

来源:互联网 发布:qmask口罩知乎 编辑:程序博客网 时间:2024/06/08 13:57

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

一网络模型

1,OSI参考模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。共七层

2,TCP/IP参考模型:主机至网络层、网际层、传输层、应用层。共四层

二网络通讯要素:

1、IP地址(InetAddress类):网络中涉笔的标识,不易记忆可用主机名,本地回环地址127.0.0.1,主机名localhost

2、端口号:用于标记进程 的逻辑地址,有效端口,0-65535,其中1024系统使用或者保留端口

3、传输协议:通讯规则,常见的协议,TCP(比如下载)和UDP(比如聊天软件)

具体步骤:1,找到对方IP

    2,数据要发送到对方指定的应用程序上,为了标记这些应用程序,所以给这些程序都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)

    3,定义通讯规则,这个通讯规则称为协议,国际组织定义了通用协议TCP/IP

4、InetAddress类,没有构造函数,创建对象用静态方法getLocalHost(),比如:InetAddress i = InetAddress.getLocalHost()

常用的方法:getHostAddress()、getHostName()

对于网络编程而言,重要的是理解其步骤,按照步骤的需要,一步步搭建根基

客户端和服务端需要交互,那么就要构建相对应的流,供其输入和输出

对于阻塞式方法,一定要注意,提供停止标签,对于PrintWriter ,记得用println而不是write;不要忘了加上true,自动刷新

import java.net.*;

class  IPDemo
{
public static void main(String[] args) throws Exception
{
//获取本地主机IP
/*
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());
System.out.println("address:"+i.getHostAddress());
System.out.println("name:"+i.getHostName());
*/
InetAddress ia = InetAddress.getByName("www.baidu.com");
System.out.println("address:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName());
}
}

三 UDP和TCP

1、Socket

socket就是为网络服务提供的一种机制,通信的两端都是socket,网络通信其实就是socket间的通信,数据在两个socket间通过IO传输,重点是要记住流程

2、UDP

将数据及源和目的封装成数据包中,不需要建立连接每个数据的大小限制在64k内,因无连接,是不可靠协议,不需要建立连接,速度快,
UDP传输:建立发送端,接收端,建立数据包,调用socket的发送接收方式,关闭socket,发送端和接收端是两个独立运行的程序,socket用到Datagramsocket类,封装成包用到DatagramPacket类,发送用到send()方法,接收用到recevie()方法
/*
需求:通过udp传输方式,将一段文字 数据发送出去
思路:
1,建立udpsocket服务
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发送出去
4,关闭资源
*/
import java.net.*;
class  UdpSend
{
public static void main(String[] args) throws Exception
{
//创建udp服务对象,通过DataGramSocket对象
DatagramSocket ds = new DatagramSocket();

//确定数据,并 封装成数据包.DatagramPacket(byte[] buf,int length,InerAddreee address,int  port)
byte[] buf = "udp ge men lai le".getBytes();
DatagramPacket dp = 
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
//通过socket服务,将已有的数据包发送出去,通过send方法
ds.send(dp);
//关闭资源
ds.close();
}
}
/*
需求:
定义一个应用程序,用于接收udp协议传输的数据并处理
定义udp接收端
思路:
1,定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字表示

2,定义一个数据包,因为要存储接收到的字节数据,
因为数据包对象有更多的功能可以提取字节数据中的不同数据信息
3,通过socket服务的 receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5,关闭资源
*/
class UdpRece
{
public static void main(String[] args) throws Exception
{
//1创建udp socket,建立端点
DatagramSocket ds = new DatagramSocket(10000);

//2定义数据包,用于存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);

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

//4通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);

//5关闭资源
ds.close(); 
}
}

三 TCP

建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低
 TCP传输:Socket和SeverSocket,建立客户端和服务端,两个独立的应用程序,建立连接后,通过socket中的IO流进行数据的传输,关闭socket
/*
客户端
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
因为tcp是面向连接的,所以在建立socket服务时
就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。
步骤:
1,创建socket服务,并指定要连接的主机和端口
import java.io.*;
import java.net.*;
class  TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s  = new Socket("192.16.1.254",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("top ge men lai le".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并 打印在控制台上
服务端:
1,建立服务端的socket服务,ServerSocket();并监听一个 端口
2,获取连接过来的客户端对象通过serverSocket的accept方法,没有连接就会等,所以这个方法是阻塞式的
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
4,关闭服务器(可选)
*/
class  TcpSever
{
public static void main(String[] args) throws Exception
{
//建立服务端的socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10003);
//通过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();
}
}

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


0 0
原创粉丝点击