Java-网络编程(第一天)

什么是网络?

网络就像是虚拟的运输网,将单独的pc连接进行信息的交互与传输。因此它包含的知识点与规范很多。国际组织将网络分解成多层进行结构划分,功能明确。

 网络模型

●OSI(Open System interconnection)开放系统互联 

●TCP/IP


OSI七层简介:

物理层:就是网线、光纤、无线、蓝牙将两个pc连接。(传输形式:0、1比特位)

数据链路层:将物理层接收到的数据进行MAC地址(网卡成产是带的地址,唯一)的封装或解封装。设备:交换机:传输数据

网络层:ip地址(192.168.1.1)的封装或解封装。设备:路由器(告诉数据路径通过那个路径②到①)

传输层:在网络层数据知道去哪了,那么怎么去?传输层制订了一些传输数据的协议和端口号。TCP(传输控制协议):传输效率低,可靠性高。UDP(用户数据报协议):传输可靠性低

⑤ 会话层:通过传输层给的端口号(传输端口与接收端口)建立数据传输通路。开始会话,也就是你的pc发起会话或者接受会话。(就是两个pc通过ip或则MAC或者主机名进行相互认识的过程)

表示层:对接收数据的数据进行解释,加密或解密、压缩或解压缩的过程。把二进制数据转换成人类识别的文字图片的过程

应用层:就是指的浏览器、qq之类的应用软件。

我们以传输图片为例:


OSI七层在实际操作过程中太过于繁琐,所以将一些过程进行整合出现TCP/IP协议(四层)


网络通讯(三要素)

IP地址、端口号、传输协议。


DNS(域名系统):

建立连接必需通过ip地址,但是ip地址又不太好记,因此给每个ip地址一个域名,我们通过访问域名,通过域名解析得到对应的ip地址,进行连接通讯。


Socket(通讯端点【专业术语:套接字】):

任何要进行数据传输的(源pc与目的pc)都要有Socket才能进行数据的传输。


通过上面的传输流程与规则,JAVA封装了一些对象用于完成网络传输。

IP对象:InetAddress 

UDP传输:

DatagramSocket类:创建通讯端点,为数据传输提供前提。

DatagramPacket类:将数据打包,抛出数据包进行传输。

聊天室小demo

 
 
public class Send implements Runnable {
	private DatagramSocket ds;
	public Send(DatagramSocket ds){
		this.ds=ds;
	}
	@Override
	public void run() {
		try{
			String line=null;
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			while((line=br.readLine())!=null){
				byte[]buf=line.getBytes();
				DatagramPacket packet=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8800);
				ds.send(packet);
				if("886".equals(line)){
					break;
				}
			}
			ds.close();
		}catch (Exception e) {
		}
		
	}
}

public class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
try{
while(true){
byte[]buf=new byte[1024];
DatagramPacket packet=new DatagramPacket(buf, buf.length);
ds.receive(packet);
String date=new String(packet.getData(),0,packet.getLength());
System.out.println(date);
if(date.equals("886")){
System.out.println(packet.getAddress().getHostAddress()+"....退出聊天室");
}
}
}catch (Exception e) {
}
}
}
public class TackHose {
	public static void main(String[]args) throws SocketException{
		DatagramSocket send = new DatagramSocket();
		DatagramSocket rece = new DatagramSocket(8800);
		Send s=new Send(send);
		Rece r=new Rece(rece);
		Thread t1=new Thread(s);
		Thread t2=new Thread(r);
		t1.start();
		t2.start();
	}
}
TCP传输

Socket:客户端通讯端点

ServerSocket:服务端通讯端点

案例:

public static void main(String[] args) throws UnknownHostException, IOException {

		/*
		 * 思路:
		 * 客户端:
		 * 1,需要先有socket端点。
		 * 2,客户端的数据源:键盘。
		 * 3,客户端的目的:socket.
		 * 4,接收服务端的数据,源:socket。
		 * 5,将数据显示在打印出来:目的:控制台.
		 * 6,在这些流中操作的数据,都是文本数据。
		 * 
		 * 
		 * 转换客户端:
		 * 1,创建socket客户端对象。
		 * 2,获取键盘录入。
		 * 3,将录入的信息发送给socket输出流。
		 */
		//1,创建socket客户端对象。
		Socket s = new Socket("192.168.1.100",10004);	
		//2,获取键盘录入。
		BufferedReader bufr  =
				new BufferedReader(new InputStreamReader(System.in));	
		//3,socket输出流。
//		new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);	
		//4,socket输入流,读取服务端返回的大写数据
		BufferedReader bufIn  = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		String line = null;
		
		while((line=bufr.readLine())!=null){
			
			if("over".equals(line))
				break;
			out.println(line);			
			//读取服务端发回的一行大写数。
			String upperStr = bufIn.readLine();
			System.out.println(upperStr);
		}	
		s.close();
		
	}

}
public static void main(String[] args) throws IOException {
		/*
		 * 
		 * 转换服务端。
		 * 分析:
		 * 1,serversocket服务。
		 * 2,获取socket对象。
		 * 3,源:socket,读取客户端发过来的需要转换的数据。
		 * 4,目的:显示在控制台上。
		 * 5,将数据转成大写发给客户端。 
		 */
		//1,
		ServerSocket ss = new ServerSocket(10004);
		//2,获取socket对象。
		Socket s = ss.accept();
		//获取ip.
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"......connected");
		//3,获取socket读取流,并装饰。 
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
		//4,获取socket的输出流,并装饰。
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);	
		String line = null;
		while((line=bufIn.readLine())!=null){		
			System.out.println(line);
			out.println(line.toUpperCase());
		}	
		s.close();
		ss.close();		
	}

}



猜你喜欢

转载自blog.csdn.net/s337946745/article/details/79432961