黑马程序员-简单网络编程总结


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

题外话:其实原本感觉网络编程和IO流结合,有些小迷糊.但是再在硬着头皮装B给别人答疑时,自己把自己给捋顺了...所以,装B也是一种高效学习法...

1.网络编程概述

1.1.概念:

通过编程语言实现计算机键的数据通信。

1.2.网络编程的三要素:

A:Ip地址:

是计算机的唯一标识点分十进制。IP地址的分类。IP地址的组成。ipconfig  ping

B:端口
物理端口:网线插口,亲...

逻辑端口:用于标识进程的逻辑地址,不同进程的标识;有效端口:0~65535,其中0~1024系统使用或保留端口.

范围:0-65535(0-1024之间一般系统被占用.)
C:协议:是定义的通信规则

UDP(面向无连接):将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快.

TCP(面向连接): 建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

注:关于InetAddress类的使用:(最需要记的就下面这个代码:)

import java.net.*;
class IPDemo{
       publicstatic void main(String[] args) throws UnknownHostException{
              //通过名称(ip字符串or主机名)来获取一个ip对象。
              InetAddressip = InetAddress.getByName("www.baidu.com");//java.net.UnknownHostException
              System.out.println("addr:"+ip.getHostAddress());
              System.out.println("name:"+ip.getHostName());
       }
}

2.UDP协议传输

2.1.DatagramSocket和DatagramPacket:

只要是网络传输,必须有socket .数据一定要封装到数据包中,数据包中包括目的地址,端口,数据等信息.
DatagramSocket:
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
DatagramPacket:
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。

2.2.代码体现,学习过程:

发送端:
import java.net.*;
import java.io.*;
/*
操作步骤:
1. 创建udp socket ,建立端点.(指定监视的端点)
2.	定义数据包(字节数组),并通过receive方法接收数据包.
3.通过数据包的方法,获取其中的数据.
4.将信息反馈给控制台.
5.读到结束符,886则读取结束.关闭资源.
*/

//创建接收端类
class ReceiveDemo{
	public static void main(String[] args) throws IOException{
		//创建发送端Socket服务对象,这里指定了端口,要监视特定端口传递来的数据
		DatagramSocket ds = new DatagramSocket(19999);
		//定义用于接收数据包的字节数组
		byte[] rec = new byte[1024];
		DatagramPacket dp = new DatagramPacket(rec,rec.length);//创建数据包.
		while(true){
			ds.receive(dp);
			InetAddress address = dp.getAddress();
			String ip = address.getHostAddress();
			byte[] rec2 = dp.getData();
			int length = dp.getLength();
			String s = new String(rec2,0,length);//这里之所以要强调数据的长度,是因为传递是一个完整的1024字节的包.没有信息的用空格补齐了.
			if(s.equals("886")){
				break;
			}
			System.out.println(address +"---"+ ip +"---"+ s);
		}
		ds.close();
	}
}
接收端:
import java.net.*;
import java.io.*;
/*
步骤:
1.创建udp服务,通过DatagramSocket对象.
2.确定数据源,并进行封装,封装成数据包.
3.通过socket服务,将已有的数据包发送出去,通过send方法.
4.关闭已经打开的资源.
*/
//创建接收端类:
class SendDemo{
	public static  void main(String[] args){
		try
		{
			DatagramSocket ds = new DatagramSocket();
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while((line=br.readLine())!=null&&!line.equals("over")){
				byte[] arr = line.getBytes();	
				DatagramPacket dp = new DatagramPacket(arr,arr.length,InetAddress.getByName("192.168.3.255"),19999);
				ds.send(dp);
			}
			ds.close();
		}
		catch (Exception e)
		{
		}
	}
}

3.TCP传输

3.1.概述:

两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket

3.2.代码体现,学习过程

服务器端:

/*
需求:
练习使用TCP传输方法传输数据
TCP服务器步骤:
	1.创建服务器端的Socket对象.
	2.设置一个监听,用来监听连接.(保证客户端可以进行连接)
	3.Socket流中获取输入流,输出流,进行数据传输.
	4.释放资源.
TCP客户端步骤:
	1.创建客户端的Socket对象.
	2.建立与服务器连接,
	3.从Socket流中获取输入输出流,进行数据传输.
	4.释放资源.
*/


import java.io.*;
import java.net.*;


//建立TCP服务器端
class TCPServer{
	public static void main(String[] args)throws Exception{
		//建立服务器端的socket服务.
		ServerSocket ss = new ServerSocket(19999);
		
		//此时为阻塞状态,等待获取客户端的连接.
		Socket s = ss.accept();
		
		//只有上一步得到了该客户端的连接对象才能进下一步.
		InetAddress address = s.getInetAddress();
		String ip = address.getHostAddress();
		System.out.println(address+"---"+ip+"连接中---");
		
		//通过从Socket流中获取输入输出流,可以进行数据传输.
		//读取流中的客户端的socket对象的输入输出流.
		BufferedInputStream br = new BufferedInputStream(s.getInputStream());
		BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("abcCopy.jpg"));
		BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));


		//拿到输入输出流进行数据操作.
		byte[] arr = new byte[1024];
		int len = 0;
		while((len=br.read(arr))!=-1){
			bw.write(arr,0,len);
			bw.flush();
		}
		bw.close();


		//发送反馈信息
		bw2.write("数据成功接收");
		bw2.newLine();
		bw2.flush();
		//br.close();
		//s.close();
	}
}

客户端:

/*
需求:
练习TCP客户端的搭建使用
*/

import java.io.*;
import java.net.*;

//搭建TCP数据传输的客户端
class TCPClient{
	public static void main(String[] args)throws Exception{
		//建立客户端的Socket对象.
		Socket s = new Socket("127.0.0.1",19999);
		
		//为Socket套接字中投入一个输入流(要不然不是一个源都没有,他怎么形成流?可以是键盘输入,可以是读取问文件等等)
		 BufferedInputStream br = new BufferedInputStream(new FileInputStream("abc.gif"));
		
		//获得该Socket套接字的输入输出流(两边的互通交流in对应out,out对应in)
		BufferedOutputStream bw = new BufferedOutputStream(s.getOutputStream());
		BufferedReader brServer = new BufferedReader(new InputStreamReader(	s.getInputStream()));
		
		获得流对象,进行数据操作.
		//int ch = 0;
		//while((ch=bis.read())!=-1){
			//bos.write(ch);
		//}
		byte[] arr = new byte[1024];
		int len = 0;
		while((len=br.read(arr))!=-1){
			bw.write(arr,0,len);
			bw.flush();
		}
		br.close();
		s.shutdownOutput();

		//获得服务器的反馈信息.
		String server = brServer.readLine();//阻塞
		System.out.println("server:" + server);
		s.close();
	}
}

4.关于套接字

一直以为套接字,套接流就是一种管道流.

后来才发现两个是两码事.但我还是觉得,套接字的表现形式很像管道流:

Socket服务器的连接动作,就像是封装了管道流的in,out对接的两个动作.

Socket中的getINput(Output)就像是管道流中的Input(Output).

彼端的in,对应此端的out;此端的in,对应笔端的out...

相当的神似...可能就是一种互通思想的多态表现形式吧......




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

详情请查看:http://edu.csdn.net/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值