Java基础之网络编程

网络编程

网络编程:用Java语言实现计算机间数据的信息传递和资源共享

网络模型:OSI(Open System Interconnection)开放互连参考模型,TCP/IP 参考模型

网络通信的三要素:

  • IP地址:网络中计算机的唯一标识。
    • DOS命令:ipconfig
  • 端口:正在运行的程序的标识。
  • 协议:通信的规则。

127.0.0.1回环地址(表示本机)

IP以及端口号

package com.wenhua.javaNetWork.inetaddress;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 通过java.net.InetAddress类获取得到服务器的信息
 * 
 * @author ASUS
 *
 */
public class addressGetByName {
	public static void main(String[] args) throws UnknownHostException {
		// 通过DNS服务器解析域名对应的ip 注意:连网
		InetAddress inet = InetAddress.getByName("www.baidu.com");
		System.out.println(inet);
		System.out.println(inet.getHostAddress());
		System.out.println(inet.getHostName());
		System.out.println(inet.getAddress());
		System.out.println(inet.getClass());
	}
}

运行结果

www.baidu.com/36.152.44.95
36.152.44.95
www.baidu.com
[B@7852e922
class java.net.Inet4Address

UDP协议

服务端

package com.wenhua.javaNetWork.UDPsocket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.DSAGenParameterSpec;

/**
 * 	服务端
 * 
 * @author ASUS
 *
 */
public class Server {
		/*
		 * UDP协议接收数据:
		 * 	A:创建接收端Socket对象
		 * 	B:创建一个数据包(接收容器)
		 *  C:调用socket对象的接收方法接收
		 *  D:解析数据包,并显示在控制台
		 *  E:释放资源
		 */
	public static void main(String[] args) throws IOException {

		// 创建接收端Socket对象
		// public class DatagramSocket 此类表示用于发送和接收数据报数据包的套接字。
		// DatagramSocket(int port)
		DatagramSocket datagramSocket = new DatagramSocket(9999);
		
		// 创建一个数据包(接收容器)
		byte[] bs = new byte[1024];
		int length = bs.length;
		// DatagramPacket(byte[] buf, int length) 
		// 构造一个 DatagramPacket用于接收长度的数据包 length 。 
		DatagramPacket datagramPacket = new DatagramPacket(bs,length);
		
		// 接收数据包
		// void receive(DatagramPacket p)  阻塞式
		datagramSocket.receive(datagramPacket);
		
		// 解析搜数据包,
		// byte[] getData() 返回数据缓冲区。 
		byte[] bs2 = datagramPacket.getData();
		// int getLength()  返回要发送的数据的长度或接收到的数据的长度。 
		int len = datagramPacket.getLength();
		String string = new String(bs2,0,len,"utf-8");
		
		// 显示在控制台
		System.out.println(string);
		
		// 释放资源
		datagramSocket.close();
	}
}

客户端

package com.wenhua.javaNetWork.UDPsocket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
 * 	客户端
 * 
 * @author ASUS
 *
 */
public class Client {
	/*
	 * UDP协议发送数据:
	 * 		A:创建发送端Socket对象
	 * 		B:创建数据,并把数据打包
	 * 		C:调用Socket对象的发送方法发送数据包
	 * 		D:释放资源
	 */
	public static void main(String[] args) throws Exception {

		// 创建UDP协议socket,无需建立连接,创建发送端Socket对象
		DatagramSocket datagramSocket = new DatagramSocket();
		
		// 创建数据报(封装数据和目标地址),并把数据打包
		byte[] bs = "你好".getBytes("utf-8");
		// 长度
		int length = bs.length;
		// IP地址
		InetAddress address = InetAddress.getByName("127.0.0.1");
		// 端口号
		int port = 9999;
		// public final class DatagramPacket 该类表示数据报包。
		// DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。 
		DatagramPacket packet = new DatagramPacket(bs,length,address,port);
		
		// 调用Socket对象的发送方法发送数据包
		// public void send(DatagramPacket p)  
		datagramSocket.send(packet);
		
		// 释放资源
		datagramSocket.close();
	}
}

运行结果

你好

TCP协议

服务端

package com.wenhua.javaNetWork.TCPsocket.finish;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 *		 服务端
 * 
 * @author ASUS
 *
 */
public class Server {
	public static void main(String[] args) throws IOException {

		// 创建服务器端Socket对象ServerSocket(int port)
		ServerSocket serverSocket = new ServerSocket(9999);

		// 在服务器监听,有没有客户端访问服务器,阻塞式(程序运行这就停止,等待)
		Socket socket = serverSocket.accept();
		
		InetAddress  intet = null;
		
		InputStream in = null;
		
		OutputStream out = null;
				
		byte[] b = new byte[1024];
		
		Scanner input = new Scanner(System.in);
		try {
			while(serverSocket != null) {
				
				// 获取输入流,接收客户端发送的消息
				in = socket.getInputStream();
				
				int length = in.read(b);
				// byte数组转换为字符串
				String string = new String(b, 0, length, "utf-8");
				System.out.println(serverSocket.getLocalPort()+":"+string);
				
				// 获得输出流对象
				out = socket.getOutputStream();
				System.out.println("请给客户端回复消息:");
				out.write(input.next().getBytes("utf-8"));
			}	
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(out != null) {
				out.close();
			}
			if(in != null) {
				in.close();
			}
			if(socket != null) {
				socket.close();
			}
			serverSocket.close();
		}	
	}
}

客户端

package com.wenhua.javaNetWork.TCPsocket.finish;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 *  客户端
 * 
 * @author ASUS
 *
 */
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {

		// 在客户端创建socket对象,向服务器发送数据
		Socket socket = new Socket("127.0.0.1", 9999);
		
		OutputStream out = null;
		
		InputStream in = null;
		
		byte[] b = new byte[1024];
		
		Scanner input = new Scanner(System.in);
		try {
			while(socket != null) {
				
				// 获得输出流对象
				out = socket.getOutputStream();
				System.out.println("客户端发送请求:");
				out.write(input.next().getBytes("utf-8"));
				
				// 获取输入流,接收客户端发送的消息
				in = socket.getInputStream();
				
				int length = in.read(b);
				// byte数组转换为字符串
				String string = new String(b, 0, length, "utf-8");
				System.out.println(socket.getInetAddress()+":"+string);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			
			if(out != null) {
				out.close();
			}
			socket.close();
		}
					
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值