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七层

posted @ 2019-08-25 21:57  斐波那切  阅读(98)  评论(0)    收藏  举报