DAY21--java中的网络编程TCP/IP常用知识点总结



中的网络编程TCP/IP常用知识点总结


1 首先什么是网络编程

网络编程的本质是两个设备之间的数据交换。就是把一个数据发送给另一个数据,然后接收数据的设备

反馈数据信息的过程。基于 请求/响应方式 在网络编程中,发起连接的程序也就是第一次请求的程序,被称为客户端,

等待其它程序连接的程序被称作服务器。客户端可以需要时启动,服务端必须一致启动以便于接收客户端的请求。


网络模型 参考 

OSI 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 简单的来说就是“物数网传会表应”

TCP/IP TCP/IP参考模型共有五层:应用层、传输层、互联网层和主机至网络层。 与OSI参考模型相比,TCP/IP参考模型没有表示层和会话层

2 网络通讯要素

IP地址 

InetAddress 网络中设备的标识 不易记忆 可以用主机名

    本地会换地址 127.0.0.1 主机名:localhost


端口号 

用于表示进程的逻辑地址 不同进程的标识

有效端口 0--65535其中0-1024为系统保留端口(不是所谓的物理端口号)


传输协议

  通讯的规则

常见有 TCP UDP


3 TCP和UDP的联系和用途

一、区别

二者都是常用的传输协议,一般从功能上进行区分。

在功能上这两种传输协议也就适合不同的业务和不同的硬件终端

在使用中,类似于图像、声音等对可靠性要求没有那么高的业务可以使用UDP

需要准确的存储对准确性无要求但要求速度快。

对系统资源的要求:cp较多UDP少

程序结构:UDP程序结构简单,TCP复杂

流模式与数据报模式:TCP保证数据的正确性,UDP可能会丢失包,TCP保证数据的传输顺序,UDP不保证

注:

(1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;
(2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;
(4)UDP段结构比TCP的段结构简单,因此网络开销也小。

二 用途:

TCP 是面向连接的有比较高的可靠性 如FTP TELENT SMTP POP3 HTTP

UDP 是面向无连接的,使用这个协议常见的有NDS SNMP QQ(2003之前后续也是用TCP) 

UDP是一种面向无连接的通信协议,该协议是的数据传输的速度得到大幅度的

提高。视频聊天语音聊天基于UDP协议

UDP:

1 将数据源和目的封装到数据包中,不需要建立连接

2 每个数据包的大小限制在64K以内

3 因无连接,是不可靠协议

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

TCP:

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

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

3 通过三次握手完成连接、是可靠协议

4 必须建立连接 效率会稍低

如电话通话 必须建立连接对方同意才可以发送数据不然就等待


4、InetAddress 与Socket

InetAddress 构造方法私有,不能直接创造对象

InetAddress getByName(String host):在给定主机名的情况下确定主机的IP地址

InetAddress getLocalHost():返回本地主机

InterAddress[] getAllByName(String host)

ip.getHostAddress()

ip.getHostName()


package com.itheima;
import java.net.InetAddress;
public class Demo {
	public static void main(String[] args ) throws Exception
	{
		//获取本地的IP地址
		InetAddress i =InetAddress.getLocalHost();
		System.out.println(i);
		//获取域名百度的IP
		i=InetAddress.getByName("www.baidu.com");
		System.out.println(i);
		System.out.println(i.getHostAddress());//域名地址
		
		System.out.println(i.getHostName());//主机名
	}
}

Socket

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

通信的两端都有Socket

网络通信其实就是Socket间的通信

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

5 UDP传输

1 只要是网络传输,必须有socket

2 数据一定要封装到数据包中,数据包中包括目的地址 端口 数据等

直接操作UDP不可能,对于java语言应该将udp封装成对象,利于我们使用

这个对象就是DatagramSocket 封装了UDP传输协议的socket对象

数据包中信息较多也将其封装为对象:DatagramPacket.通过这个对象中的

方法就可以获取数据包中的信息


DatagramSocket具备发送和接收的功能,在进行udp传输时,需要明确一个是发送端一个是接收端


udp的发送端:

1 建立udp的socket服务,创建对象时如果没有明确端口系统会自动分配

2 明确要发送的具体数据

3 将数据封装成了数据包

4 用socket服务的send方法将数据包发送出去

5 关闭资源

udp的接收端

1 创建udp的socket服务 必须要明确一个端口,作用在于只有发送到

这个端口的数据才是这个接收端可以处理的数据

2 定义数据包,用于存储接收到的数据

3 通过socket服务的接收方法将收到的数据存储到数据包中

4通过数据包的方法获取数据包中的具体数据内容,比如IP 端口 数据等等

5 关闭资源


package com.itheima;
import java.net.*;
public class Demo {
	public static void main(String[] args ) throws Exception
	{
/*		//获取本地的IP地址
		InetAddress i =InetAddress.getLocalHost();
		System.out.println(i);
		//获取域名百度的IP
		i=InetAddress.getByName("www.baidu.com");
		System.out.println(i);
		System.out.println(i.getHostAddress());//域名地址
		
		System.out.println(i.getHostName());//主机名
*/	
		
/*	//1 建立一个udp的socket服务
		DatagramSocket ds=new DatagramSocket(8888);//定义一个发送端 可以不写系统会自动分配
		//2 明确要发送的具体数据
		String text="udp传输演示";
		byte[] buf=text.getBytes();
		//3 将数据封装成数据包
		DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
		//用socket服务的send方法将数据报发送出去
		ds.send(dp);
		//关闭资源
		ds.close();*/
		
		
		//1 建立一个socket的udp服务 必须指定端口并和服务发送端口号一样
		DatagramSocket ds =new DatagramSocket(10000);
		// 2 定义数据包,用于存储接收到的数据 方法是定义一个字节数组
		//数据包会把数据存储到字节数组中
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);
		//3 通过socket服务的接收方法将收到的数据存储到数据包中
		ds.receive(dp);
		//4 通过数据包的方法获取数据包中的具体数据内容 如ip 端口 数据等
		String ip=dp.getAddress().getHostAddress();
		int port=dp.getPort();
		//将字节数组中的有效部分转成字符串
		String text=new String(dp.getData(),0,dp.getLength());
		System.out.print(ip+":"+port+":"+text);
		//5 关闭资源
		ds.close();
	}
}


一个聊天java小程序源码

package com.itheima;
import java.io.*;
import java.net.*;

//客户端,发送端
class Send implements Runnable{
	private DatagramSocket ds;
	public Send(DatagramSocket ds){
		super();
		this.ds=ds;
	} 
	public void run(){
		try{
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			String line;
			while((line=br.readLine())!=null){
				byte[] buf=line.getBytes();
				DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localHost"),1025);
				ds.send(dp);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

//服务端 接收端
class Rece implements Runnable{
	private DatagramSocket ds;
	public Rece(DatagramSocket ds){
		super();
		this.ds=ds;
	}
	public void run(){
		try{
			while(true){
				byte[] buf=new byte[1024];
				
				DatagramPacket dp=new DatagramPacket(buf,buf.length);
				ds.receive(dp);
				String ip=dp.getAddress().getHostAddress();
				@SuppressWarnings("deprecation")
				String data=new String(dp.getData(),dp.getLength());
				System.out.println(ip+"	"+data);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class LiaoTian {
	public static void main(String[] args) throws SocketException{
		DatagramSocket sendDs=new DatagramSocket();
		DatagramSocket receDs=new DatagramSocket(10225);
		new Thread(new Send(sendDs)).start();
		new Thread(new Rece(receDs)).start();
		
	}

}

6 TCP 传输

两个端点建立连接后的通道称之为流;建立在网络基础上的流称之为sorcket流

该流中既有读取,也有写入


tcp的两个端点:一个是客户端,一个是服务端

客户端:对应的对象是Socket

服务端:对应的对象是ServerSocket


TCP客户端:

1 建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时就已经

可以对指定的ip和端口进行连接(三次握手)

2 如果连接成功,就以为着建立了通信通道,socket流就已经产生了。

只要获取到socket流中的读取流和写入即可,只要通过getInputStream和OutputStream

就可以获取两个流的对象

3 关闭资源

package com.itheima;

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

class TcpClient{
	public static void mian(String[] args) throws Exception
	{
		Socket s=new Socket("10.1.31.69",10002);
		java.io.OutputStream out =s.getOutputStream();
		out.write("tcp演示".getBytes());
		s.close();
		
	}
}

TCP服务端:

1 创建服务端 socket服务,并监听一个端口

2 服务器端为了给客户端提供服务,获取客户端的内容,可以通过accept方式

获取连接过来的客户端对象

3 可以通过获取到的socket对象中的socket流和具体的客户端进行通讯

4 如果通讯技术,关闭资源,注意要先关闭客户端再关闭服务端


小结:对于UDP和TCP 既可以定义输出流也可以创建输入流,具体情况根据需要

构建;比如:我们需要客户端给服务器端发送数据,服务器端在给客户端反馈数据

那么就要在客户端和服务器端分别多加一个输入流和输出流!否则发送不出去,收不到!





---------------------- 拖走FM----期待与您交流! --------

收音机,电台,网上电台,广播,在线广播,网络广播,广播电台,网络电台,在线电台,电台在线收听,广播电台在线收听,网络电台在线收听,在线收听电台,fm收音机,网络收音机,广播下载,在线收音机,收音机软件下载,电台软件下载,网络收音机下载--------------

---------------------- 拖走FM----期待与您交流! --------







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值