黑马程序员——网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

网络通讯要素:

· IP地址:InetAddress类:

1. 网络中设备的标识

2. 不易记忆,可以用主机名

3. 本地回环地址:127.0.0.1 主机名:localhost

· 端口号:数据要发送到指定的应用程序上,为了标识这些应用程序,所以给这些网络程序都用数字进行标识。为了方便称呼这些数字,称其为端口——逻辑端口。(有效的端口:0-65535,其中0-1024系统使用或者保留端口)

· 传输协议:是通信的规则,这个规则称为协议;国际组织定义了通用协议TCP/IP,常见的有TCP和UDP

网络参考模型:

黑马程序员——网络编程_第1张图片


UDP:

· 将数据的源和目的封装成数据包,不需要建立连接

· 每个数据包的大小限制在64kb内

· 因无连接,是不可靠的协议

· 不需要建立连接,速度快

TCP

· 建立连接,形成传输数据的通道

· 在连接中进行大数据量传输

· 通过“三次握手”来完成连接,是可靠协议

· 必须建立连接,效率会稍低

Socket:

· Socket就是为网络服务提供的一种机制

· 通信的两端都有Socket

· 网络通信其实就是Socket通信

· 数据在两个Socket间通过IO传输

UDP传输:

· DatagramSocket和DatagramPakcet类

1. 使用DatagramSocket建立发送端和接收端

2. 用DatagramPacket建立数据包

3. 调用Socket的发送和接收的方法

4. 关闭Socket

注意:发送端和接收端是2个独立运行的程序

· 发送端:在发送端,要在数据包对象中明确目的地IP以及端口,代码示例:

//创建upd服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//确定数据,并封装成数据包
byte[] bs = "hello,udp".getBytes();
DatagramPacket dp = new DatagramPacket(bs, 0, bs.length, InetAddress.getByName("localhost"), 10000);
//通过socket服务,将已有的数据包发送出去
ds.send(dp);
//关闭资源
ds.close();

· 接收端:在接收端要指定监听的端口

//创建udp socket,建立端点
DatagramSocket ds = new DatagramSocket(10000);
//定义数据包,用于存储数据
byte[] bs = new byte[1024];
DatagramPacket dp = new DatagramPacket(bs, bs.length);
//通过服务的receive方法将收到的数据存入数据包中
ds.receive(dp);
//通过数据包的方法获取其中的数据
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
//关闭资源
ds.close();

TCP传输:

· Socket和ServerSocket

1. 建立客户端和服务端

2. 建立连接后,通过Socket中的IO流进行数据的传输

3. 关闭Sokcet

注:客户端和服务端一样是2个独立的程序

· 客户端基本思路

1. 客户端需要明确服务器的IP地址以及端口,这样才可以试着建立连接,如果连接失败,会出现异常

2. 连接成功,说明客户端与服务端建立了通道,那么通过IO流可以进行数据的传输,而Sokcet对象已经提供了输入流和输出流对象,通过getInputStream()和getOutputStream()获取即可

3. 与服务端通讯结束后,关闭Socket。

代码示例:

//建立Socket连接,指定IP地址和端口
Socket s = new Socket("127.0.0.1",10009);
		
//通过Socket对象获取输出流,通过输出流输出
OutputStream out = s.getOutputStream();
out.write("hello".getBytes());
//结束标记,告诉服务端,已经输出完毕
s.shutdownOutput();
		
//通过Socket对象获取输入流,读取客户端发来的信息
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
//假设服务器只回复一句话,所以不使用while循环了
len = in.read(buf);
System.out.println(new String(buf,0,len));
		
//关闭客户端
s.close();
· 服务端基本思路

1. 服务端需要明确它要处理的数据是从哪个端口进入的

2. 当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据的传输

3. 当客户端访问结束,关闭该客户端。也可以选择关闭服务端

代码示例:

//建立ServerSocket并监听端口
ServerSocket ss = new ServerSocket(10009);
//通过ServerSocket获取Socket
Socket s = ss.accept();
//通过Socket获取输入流,并从客户端读取数据打印
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))!=-1) {
	System.out.println(new String(buf,0,len));
}
//服务端获取输出流,给客户端返回一句话
OutputStream out = s.getOutputStream();
out.write("ok".getBytes());
//关闭客户端
s.close();
ss.close();//关闭服务端
· 在客户端和服务端的通信中。如果使用到了阻塞式的方法,需要定义一个结束标记。虽然我们可以自定义结束标记,但是这种方法十分的麻烦。在Socket类中,有shutdownInputStream()和shutdownOutputStream()的方法

URL类:

· 在网络中,资源的地址。java提供了URL类,其中提供了大量操作网络协议的方法,例如:

String getFile() :获取URL文件名
String getHost() :获取主机名
String getPath() :获取路径
String getQuery() :获取查询部分
String getPort() :获取端口号
· URL的openConnection()方法返回了一个URLConnection对象,通过这个对象可以获取网页的内容。

代码示例:

//将百度的域名传递URL,创建URL对象
URL url = new URL("https://www.baidu.com");
//获取URLConnection对象
URLConnection conn = url.openConnection();
	
//读取流
BufferedReader bufr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	
//打印从百度网页读取到的内容
String line = null;
while((line=bufr.readLine())!=null) {
	System.out.println(line);
}



你可能感兴趣的:(java,黑马程序员)