Java网络编程

一、网络编程基础

1.在Java中,可以通过InetAddress类的静态方法getLocalHost()来获取本地主机的IP地址

实现代码如下:

       try {
			//获取本地主机的网络地址(InetAddress对象)
			InetAddress netAddr=InetAddress.getLocalHost();
			System.out.println(netAddr);
		
			//获取指定域名主机的网络地址(InetAddress对象)
			InetAddress[] netAddrArray=InetAddress.getAllByName("www.taobao.com");
			for(InetAddress netAddr2:netAddrArray) {
				System.out.println("主机名称:"+netAddr2.getHostName());
				System.out.println("主机IP地址:"+netAddr2.getHostAddress());
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

2.在Java中,如果需要测试网络是否通畅,可以使用Runtime对象的exec()执行ping命令

实现代码如下:

		try {
			 //获取当前应用程序的“运行时”
			Runtime rt=Runtime.getRuntime();
			
			//调用exec()方法,向操作系统发送要执行的命令
			Process process=rt.exec("ping 192.168.199.xxx");
			
			//通过process进程对象的输入流,"读取"执行结果
			InputStream in=process.getInputStream() ;
			BufferedReader reader=new BufferedReader(new InputStreamReader(in));
			
			String line=null;
			while((line=reader.readLine())!=null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

3.如果想检查主机与目标主机之间的网络是否通畅,可以使用ping命令来测试,请求超时代表网络不通畅,有正常答复响应代表网络通畅。在Windows操作系统中,可以通过ipconfig命令查看本地主机的IP地址。

二、TCP编程

1.编写服务器端程序

Java标准库提供了ServerSocket来实现对指定IP和指定端口的监听。

(1).服务端首先启动,等待客户连接

(2).创建服务端Socket对象,监听1011端口

(3).服务端启动,并进入"等待状态"(等待某一个客户端的连接),当如果没有客户端连接时,accept()处于等待阻塞状态;如果发现客户端连接时,accept()返回当前正在连接的客户端Socket

(4).服务端读取来自客户端的一条信息

实现代码如下:

public class Server {
	public static void main(String[] args) {

		try (ServerSocket serverSocket=new ServerSocket(1011);){
			while(true) {

				Socket clientSocket=serverSocket.accept();
				
				InetAddress clientNetAddress=clientSocket.getInetAddress();
				System.out.printf("客户端%s正在连接服务器~~",clientNetAddress.getHostAddress());
				
				BufferedReader reader=new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"utf-8"));
				String message=reader.readLine();
				System.out.printf("客户端%s说:%s\n",clientNetAddress.getHostAddress(),message);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

2.编写客户端程序

(1).客户端:在服务器启动后,向服务端发送一个连接的请求

(2).创建客户端Socket对象,连接指定IP和端口

(3).连接成功后就可以向服务端发送信息了

实现代码如下:

public class Client {
	public static void main(String[] args) { 
			try(Socket clientSocket=new Socket("192.168.199.xxx",1011)) {
			
			//客户端向服务端发送一条信息(输出流)
			BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

			//写入缓冲区(内存)
			writer.write("我中午吃大米饭!!");

			//清空缓冲区,发送至网络
			writer.flush();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 当Socket流连接创建成功后,无论是服务器端还是客户端,我们都使用Socket实例进行网络通信。因为TCP是一种基于流的协议,因此,Java标准库使用InputStream和OutputStream来封装Socket的数据流,这样我们使用Socket的流,和普通io流类似。

实现代码如下:

	//用于读取网络数据
	InputStream in=clientSocket.getInputStream();

	//用于写入网络数据
	OutputStream out=clientSocket.getOutputStream();

三、UDP编程

1.编写服务器端程序

(1).创建Socket,监听端口

(Java提供了DatagramSocket来实现这个功能)

(2).读取来自客户端的“数据包”,创建数据包

(通过DatagramPacket实现接收)

(3).接收数据包

(4).从数据包中,读取数据

(通过recieve()和send()读写数据)

实现代码如下:

        try (DatagramSocket serverSocket = new DatagramSocket(6666)) {
		
			byte[] buff=new byte[64];
			DatagramPacket packet=new DatagramPacket(buff,buff.length);
			
			serverSocket.receive(packet);
			System.out.println("读取完毕");
			
			byte[] data=packet.getData();
			String strFormClient=new String(data).trim();
			System.out.println("来自客户端的信息:"+strFormClient);
			
			if("天王盖地虎".equals(strFormClient)) {
				packet.setData("宝塔镇河妖".getBytes());
			}else {
				packet.setData("error~".getBytes());
			}
			
			//反馈信息给客户端(发送数据包至客户端)
			serverSocket.send(packet);
			 
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

2.编写客户端程序

(1).创建socket

(2).连接指定主机的端口

(客户端使用clientSocket.connect()指定远程地址和端口)

(3).创建数据包

(4).发送数据包

(通过recieve()和send()读写数据)

实现代码如下:

        try (DatagramSocket clientSocket = new DatagramSocket()) {
			
			clientSocket.connect(InetAddress.getByName("192.168.199.xxx"),6666);
			
			DatagramPacket packet=new DatagramPacket(new byte[64],64);
			packet.setData("天王盖地虎".getBytes());//将数据放入数据包
			
			clientSocket.send(packet);
			 
			//等待接收反馈信息(等待接收来自服务端的数据包)
			clientSocket.receive(packet);
			byte[] data=packet.getData();
			String strFromServer=new String(data);
			System.out.println("来自服务端的信息:"+strFromServer);
			
		} catch (SocketException | UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值