Java知识总结-网络编程


说明:网络编程的核心还是通过流来进行数据传输


一,InetAddress类

InetAddress类表示互联网协议(IP)地址.

本类没有构造函数来直接实例化对象,但是可以通过该类的静态方法获取本类对象。同时我们也可以通过该对象获取其IP地址与主机名。

注:IP地址每段数值范围在0-255之间,占一个字节。

端口:有效端口值为0-65535,其中0-1024为系统使用或作为紫铜保留端口。

示例1:获取本地主机IP信息

import java.net.*;
public class Test {
	
	public static void main(String[] args) throws Exception{
		//获取本地主机IP对象
		InetAddress i=InetAddress.getLocalHost();
		//获取本机IP地址
		System.out.println(i.getHostAddress());
		//获取本机名
		System.out.println(i.getHostName());
	}
}

运行结果;

192.168.1.106
huaer-PC

示例2:获取指定主机名的IP信息

import java.net.*;
public class Test {
	
	public static void main(String[] args) throws Exception{
		//根据主机名获取IP对象
		InetAddress i=InetAddress.getByName("www.baidu.com");
		//获取IP地址
		System.out.println(i.getHostAddress());
		//获取主机名
		System.out.println(i.getHostName());
	}
}

运行结果:

61.135.169.105
www.baidu.com

二,UPD协议数据传输

UPD协议特点:

传输速度快,容易丢包,是不可靠协议。

面向无连接(不需要连接,发送方只负责发送数据,不负责数据一定被接收)

数据被封包,每个数据包的大小限制子64K以内。

UPD的运用:

UPD数据发送:

思路:

1.建立UPDSocket服务,

2.提供数据,并将数据封装到数据包中,

3.通过Socket服务的发送功能,将数据发送出去,

4.关闭资源。

import java.net.*;
public class Test {
	
	public static void main(String[] args) throws Exception{
		//建立UPDSocket数据服务
		DatagramSocket ds=new DatagramSocket();
		//获取要发送的数据
		byte[] data="UDP数据传输".getBytes();
		//将数据封装到数据包中
		DatagramPacket dp
			=new DatagramPacket(data,data.length,InetAddress.getByName("192.168.1.106"),10000);
		//发送数据
		ds.send(dp);
		//关闭资源
		ds.close();
	}
}

UPD数据接收:

思路:

1.定义UPDSocket服务,通常会监听一个端口,即这个程序思念高一数字标识,便于明确哪些数据被该程序接收,如不指定端口,系统会默认自动分配。

2.定义一个数据包,用于要存储接收到的数据。并且数据包对象有更多功能可以用来提取数据中的不同数据信息。

3.通过Socket服务的receive方法将收到的数据存入已经定义好的数据包中。

4.通过数据包对象的特有功能处理数据,如:将这些不同的数据取出。

5.关闭资源。

import java.net.*;
public class Test {
	
	public static void main(String[] args) throws Exception{
		//建立UPDSocket数据服务
		DatagramSocket ds=new DatagramSocket(10000);
		//获取要发送的数据
		byte[] buf=new byte[1024];
		//将数据封装到数据包中
		DatagramPacket dp
			=new DatagramPacket(buf,buf.length);
		//发送数据
		ds.receive(dp);
		//获取数据包中发送端主机IP对象
		InetAddress i=dp.getAddress();
		//获取发送端IP地址
		String ip=i.getHostAddress();
		//获取端口
		int port=dp.getPort();
		//获取数据长度
		int len=dp.getLength();
		//获取数据包中的数据
		byte[] data=dp.getData();
		//关闭资源
		ds.close();
	}

示例3:UPD通信

获取键盘录入的数据,并用发送端发送至接收端。

import java.io.*;
import java.net.*;
//UDP发送端
class UDPSend{
	public static void main(String[] args) throws Exception{	
		//创建Socket服务
		DatagramSocket ds = new DatagramSocket();		
		//创建键盘输入流
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//读取键盘录入数据
		String line = null;
		while((line=br.readLine())!=null){
			//如果遇到"byebye",就跳出循环
			if("byebye".equals(line))						
				break;
			//定义缓冲区
			byte[] buf = line.getBytes();
			//创建数据包,
			DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.106"),10001);
			//发送数据包
			ds.send(dp);
		}
		ds.close();//关闭资源
	}
}
//UDP接收端
class UDPRece2{
	public static void main(String[] args) throws Exception{
		//创建Socket服务
		DatagramSocket ds = new DatagramSocket(10001);
		while(true){
			//创建缓冲区
			byte[] buf = new byte[1024];
			//创建数据包,
			DatagramPacket dp = new DatagramPacket(buf,buf.length);
			//用数据报包接收数据
			ds.receive(dp);
			//获取数据包中的信息IP和数据
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(),0,dp.getLength());
			System.out.println(ip+":"+data);
		}
	}
}

示例4:

建立一个简单的聊天程序,为了持续发送和接收数据,并且发送端和接收端需要同时进行,所以需要用到多线程功能。

 import java.io.*;
import java.net.*;
//建立发送端
class SendSocket implements Runnable{
	private DatagramSocket ds;
	//在构造函数中加入Socket服务
	SendSocket(DatagramSocket ds){
		this.ds = ds;
	}
	//重写发送端线程run方法
	public void run(){
		try{
			//创建键盘录入的输入流
			BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			//读取键盘沮洳数据
			while((line=bufr.readLine())!=null){
				//设置跳出循环标记
				if("886".equals(line))
					break;
				byte[] buf = line.getBytes();
				//将数据封装到数据包中
				DatagramPacket dp =
					new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.106"),10001);
				//发送数据包
				ds.send(dp);
			}
			//关闭资源
			ds.close();
		}
		catch (Exception e){
			throw new RuntimeException("发送失败");
		}
	}
}
//定义接收端
class ReceSocket implements Runnable{
	private DatagramSocket ds;
	//在构造函数中加入Socket服务
	public ReceSocket(DatagramSocket ds){
		this.ds = ds;
	}
	//重写接收端线程的run方法
	public void run(){
		try{
			while(true){
				byte[] by = new byte[1024];	
				//创建数据包
				DatagramPacket dp = new DatagramPacket(by,by.length);
				//接收数据
				ds.receive(dp);
				//获取数据包中的ip地址
				String ip = dp.getAddress().getHostAddress();
				//获取数据包中数据
				String data = new String(dp.getData(),0,dp.getLength());
				System.out.println(ip+":"+data);
				//ds.close();为了持续接收数据,一般接收端不关闭
			}
		}
		catch (Exception e){
			throw new RuntimeException("接收失败");
		}
	}
}
class SocketDemo {
	public static void main(String[] args) throws Exception{
		//创建发送端和接收端的对象
		DatagramSocket sendSocket = new DatagramSocket();
		DatagramSocket receiveSocket = new DatagramSocket(10001);
		//创建两个线程,
		Thread tsend=new Thread(new SendSocket(sendSocket));
		Thread treceive=new Thread(new SendSocket(receiveSocket));
		//开始线程
		tsend.start();
		treceive.start();
	}
}


三,TCP协议数据传输

TCP协议特点:

1.面向连接,建立连接,形成传输数据的通道。

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

3.通过三次握手(判断)完成连接。

4.必须建立连接,效率稍低。

示例1:建立简易TCP客户端和服务端

import java.net.*;
import java.io.*;
class TestSocket{
	//创建客户端
	Socket s=new Socket("192.168.1.106",10086);
	//获取客户端的输出流
	OutputStream os=s.getOutputStream();
	 //通过输出流发送数据
	os.write("发送客户端信息".getBytes());
	//关闭客户端
	s.close();
}
class TestServerSocket{
	//建立服务端
	ServerSocket ss=new ServerSocket(10086);
	//获取连接过来的客户端
	Socket s=ss.accept();
	//获取客户端的输入流
	InputStream in=s.getInputStream();
	//创建缓冲区
	byte[] buf=new byte[1024];
	//接收客户端发送的数据
	int len=in.read(buf);
	System.out.println(new String(buf,0,len));
	//获取客户端IP
	String ip=s.getInetAddress().getHostAddress();
	System.out.println("ip="+ip);
	//关闭资源
	s.close();
	ss.close();
}

示例2:

由客户端向服务端发送文件,若发送成功,服务端提示发送成功。

import java.io.*;
import java.net.*;
//客户端
class TextSocket{
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("192.168.1.106",10010);
		//读取文件
		BufferedReader br = new BufferedReader(new FileReader("123.txt"));
		//创建客户端输出路
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		//发送信息
		String line = null;
		while((line=br.readLine())!=null){
			out.println(line);
		}
		//关闭客户端输出流
		s.shutdownOutput();
		
		//建立客户端输入流
		BufferedReader bufr 
		= new BufferedReader(new InputStreamReader(s.getInputStream()));
		//接收信息
		String str = bufr.readLine();
		System.out.println(str);
		//关闭资源
		br.close();
		s.close();
	}
}
//服务端
class TextServerSocket{
	public static void main(String[] args) throws Exception {
		//创建服务端
		ServerSocket ss = new ServerSocket(10010);
		//获取连接至服务端的客户端
		Socket s = ss.accept();
		//获取客户端主机信息
		String ip = s.getInetAddress().getHostAddress();
		System.out.println("来自IP:"+ip);
		
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
		//创建用于接收文件的目的
		PrintWriter out = new PrintWriter(new FileWriter("333.txt"),true);
		
		String line = null;
		//接收客户端发送至服务端的信息
		while((line=bufIn.readLine())!=null){
			if("over".equals(line))
				break;
			out.println(line);
		}
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		//给客户端反馈信息
		pw.println("上传成功");
		//关闭资源
		out.close();
		s.close();
		ss.close();
	}

四,URl类

该类为封装网页地址所指向资源的类,通过本类可以获取该网站的各种信息。

import java.net.*;
public class Test {
	
	public static void main(String[] args) throws Exception{
		//根据网址获取URL对象
		URL url=new URL("http://www.baidu.com"); 
		//获取对象各种信息
        sop("URL的协议:"+url.getProtocol());  
        sop("URL的IP地址:"+url.getHost());  
        sop("URL端口号:"+url.getPort());  
        sop("URL文件路径:"+url.getPath());  
        sop("URL文件名称:"+url.getFile());    
        sop("URL查询部分:"+url.getQuery());  
	}
	public static void sop(String s){
		System.out.println(s);
	}
}


运行结果:

URL的IP地址:www.baidu.com
URL端口号:-1
URL文件路径:
URL文件名称:
URL查询部分:null


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值