Java网络入门
网络入门
OSI七层模型、TCP/IP四层模型
参考博文 https://www.cnblogs.com/linhaifeng/articles/5937962.html OSI七层
获取IP和端口
IP:电脑地址的唯一标识
端口号:电脑中服务(大一点就是程序)的唯一标识
Java中可以通过InetAddress和InetSocketAddress两个类来获取ip地址,端口号等信息。
package com.boe.network;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class IpDemo {
public static void main(String[] args) throws UnknownHostException {
//第一种方式
System.out.println("------------第一种方式------------");
InetAddress ia=InetAddress.getByName("www.baidu.com");
System.out.println(ia);
System.out.println(ia.getHostName());
System.out.println(ia.getLocalHost());
InetAddress myIa=InetAddress.getByName("localhost");
System.out.println(myIa);
System.out.println(myIa.getHostName());
//第二种方式
System.out.println("------------第二种方式------------");
InetSocketAddress isa=new InetSocketAddress("localhost",9999);
System.out.println(isa.getHostName());
System.out.println(isa.getPort());
System.out.println(isa.getHostString());
}
}
测试结果

UDP协议
UDP是无连接通信协议,发送方发送数据不会确定接收方是否有收到,接收方接收到数据后也不会发消息给发送方表明它收到。一般用于视频通话,即使丢一个两个包也不会影响使用,优点是效率高,节省资源,缺点是不安全,易丢包。UDP在传输数据时会对数据进行分包处理,每一个包的大小不能超过64K。有两个类用来实现,DatagramSocket(类似港口)和DatagramPacket(类似集装箱)
定义一个发送类
package com.boe.udpdemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* 发送端,类似港口码头
* @author clyang
*
*/
public class Sender {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,类似码头
DatagramSocket ds=new DatagramSocket();
//创建DatagramPacket对象,类似集装箱
String str="I am Sender";
//发送主机
//buf:the packet data.
//length:the packet length.
//address:the destination address.
//port the:destination port number.
DatagramPacket dp=new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(),8088);
//发送
ds.send(dp);
//关闭流
ds.close();
}
}
定义一个接受类
package com.boe.udpdemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Reciver {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,类似码头
DatagramSocket ds=new DatagramSocket(8088);
//创建DatagramPacket对象,类似集装箱
byte[] buff=new byte[1024];
DatagramPacket dp=new DatagramPacket(buff,buff.length);
//接受收据,接受到后数据会填充到buff里
ds.receive(dp);
//打印接收到的长度
System.out.println(dp.getLength());
//打印接收到的信息
System.out.println(new String(dp.getData(),0,dp.getLength()));
//打印端口号
System.out.println(dp.getPort());
//打印发送方ip
System.out.println(dp.getSocketAddress());
//关闭流
ds.close();
}
}
测试

TCP协议
面向连接的协议,有"三次握手"和"四次挥手",每次客户端向服务端发送数据,都会有三次握手来确保数据的安全性,传输效率低,安全性高,对大小没有限制。Java中,可以用Socket套接字来实现TCP通信,参考下面案例。
Server端
package com.boe.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//获取套接字Socket
ServerSocket serverSocket=new ServerSocket(12345);
//监听客户端连接,如果连接成功返回客户端socket,否则处于阻塞状态
Socket socket=serverSocket.accept();
//获取客户端的数据
InputStream is=socket.getInputStream();
/*int length;
byte[] buff=new byte[20];
while((length=is.read(buff))!=-1){
System.out.println(new String(buff,0,length));
}*/
byte[] buff=new byte[20];
int length=is.read(buff);
System.out.println(new String(buff,0,length));
//System.out.println("测试");
//向客户端发送数据
OutputStream os=socket.getOutputStream();
os.write("你好,我是服务器".getBytes());
//关闭serverSocket
serverSocket.close();
}
}
客户端
package com.boe.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//创建套接字对象socket
Socket socket=new Socket("localhost",12345);
//向服务端发送数据,从套接字中获取字节输出流
OutputStream os=socket.getOutputStream();
//向字节输出流中写信息
os.write("你好,我是客户端".getBytes());
//从套接字中获取输入流
InputStream is=socket.getInputStream();
/*int length;
byte[] buff=new byte[20];
while((length=is.read(buff))!=-1){
System.out.println(new String(buff,0,length));
}*/
byte[] buff=new byte[100];
int length=is.read(buff);
System.out.println(new String(buff,0,length));
//关闭socket
socket.close();
}
}
测试结果


参考博客
(1)https://www.cnblogs.com/linhaifeng/articles/5937962.html OSI七层
浙公网安备 33010602011771号