java网络编程
在网络成层中TCP对应于四层
链路层(物理通道)
通常是对网络连接设备的驱动协议,例如对光纤和都对网线的驱动不一样网络层(核心层)
TCP/IP协议的核心,他用于将数据分组发送
传输层(主要是程序间通信)
包括TCP,UDP应用层
主要是负责应用程序的协议。如HTTP,FTP
IP地址和端口号
用来区分计算机的唯一标识(IP地址)
- 手动写的
- 分配的
采用八个二进制位表示一个段(所以最大只有255),用四个字节标识一个电脑
192.168.105.222
==192.168==:是局域的IP地址,以内的电脑都是联通的
==本机地址== :127.0.0.1,表示自己的地址
==ping操作==:ping也属于一个通信协议,是TCP/IP协议的一部分,用于检查网络通路是否可用
计算机之间的数据通讯
端口:通讯是为了避免不同程序之间的数据发错,导致丢失等等,操作系统实现的逻辑编号
,每个应用程序都有被分配的端口号。
UDP协议
UDP是无连接通信协议,既在传输数据时。数据的发送端和接受端不建立逻辑连接,不确认接受端是否存在,也不会接受反馈。
- UDP协议消耗资源小,通信效率高,一般用于音频,视频和普通护具的传输
- 使用UDP不能确保数据的完整,可能会丢失
- 数据大小被限制在64K内
InetAddress
java.net
中的类都与互联网有关系
public static InetAddress getLocalHost()
//localhost本地主机,会抛出异常
//主机名和IP地址
public String getHostName()
public String getHostAddress()
public static InetAddress getByName(String name)
//传输别人的主机名,拿到对方的IP地址
DatagramPacket and DatagramSocket
DategramPacket是UDP对传输数据对象的封装,接受端的IP,端口号的封装
DatagramSocket是对封装好的数据包的传输对象,是绑定IP和端口号的套接字
//客户端
//创建DatagramPacket对象
//DatagramPacket(byte[] buf,int length,InetAddress address,int port);
byte[] data = "你好UDP".getBytes();
InetAddress inet = InetAddress.getByName("192.168.1.101");
//封装数据对象
DategramPacket datagramPacket = new DatagramPacket(data,date.length,inet,1000)
//创建Socket对象
DatagramSocket datagramSocket = new datagramSocket();
//发送数据包
datagramSocket.send(datagramSocket);
//关闭资源
datagramSocket.close()
//服务端
//创建DatagramSocket对象,必须绑定端口号DatagramSocket(int port);
DatagramSocket datagramSocket = new DatagramSocket(1000);
//创建一个字节数组用来接收数据
byte[] data = new byte[1024];
//创建一个DatagramPacket数据包对象
DatagramPacket dp = new DatagramPacket(data,data.length)
//调用DatagramSocket对象的receive(DatagramPacekt dp)接收数据
datagramSocket.receive(dp);
//拆包
/*
需要知道发送者的IP
DatagramPacket中的public InetAddress getAddress()
需要发送端的端口号
DatagramPacket中的public int getPort()
知道数据的字节个数,避免资源浪费
DatagramPacket中的public int getLength()
*/
int length = dp.getLength();
int port = dp.getPort();
String address = dp.getAddress().getHostAddress();
//关闭资源
datagramSocket.close()
改进
将发送端的getDatagraPacket的传输数据转换到键盘输入,在接收端DatagramSocket不关闭资源就可以了。
String sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
InetAddress inet = InetAddress.getByName(192.168.1.101);
while(true){
String message = sc.nextLine();
byte[] bytes = message.getBytes();
DatagramPacket dp = new DatagramPacekt(bytes,bytes.length,inet,1000);
}
byte[] data = new byte[1024];
DatagramSocket ds = new DatagramSocket(1000)
while(true){
DatagramPacket dp = new DatagramPacket(date,data.length);
ds.receive(dp);
int port = dp.getPort();
String address = dp.getAddress().getHostAddress();
int length = dp.getLength();
}
TCP协议
TCP协议是面向连接呃通信协议。必须建立发送与接收端的逻辑连接。
-
客户端想服务端发出
连接请求
-
服务端向客户端发送一个
响应
-
客服端想服务端发送
确认信息
-
刻意确保传输数据的安全性
==TCP与UDP的区分:==UDP只区分发送和接受,但是TCP严格区分客服端和服务器,服务器不会主动连接客户端。在连接通路完成后悔自动建立一个字节流对象(OutputStream,InputStream)
Socket
//传入服务器的IP和端口号,一运行就会去连接
public Socket(String host,int port);
//一但连接就会创建对应的输入输出流
public OutputStream getOutputStream();
public InputStream getInputStream();
Socket socket = new Socket(127.0.0.1,1000);
OutputStream out = socket.getOutputStream();
out.write("");
//网络上的流对象可以不用关闭流对象
ServerSocet
//服务器为了区分到底是那个客户端连接了,需要拿到客户端的套接字
public ServiceSocket(int port);
public Socket accept();
//这个套接字对象是通过IO传过来的
public InputStream getInpurStream();
//向客户端回写数据的方法
public OutputStream getOutputStream();
ServerceSocket server = new ServerSocket(1000);
Socket socket = server.accept();
InputStream in = socket.getInpuStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
OutputStream out = socket.getOutputStream();
server.write(xxxx);
socket.close();
server.close();
来源:oschina
链接:https://my.oschina.net/u/3483440/blog/1556184