Java网络编程

Java网络编程

简单了解一下Java的网络编程,JavaSE的学习我是跳过这部分的,在后来的Web学习中一直用的B/S架构,这部分用的不多,简单回顾一下。

Java中和网络编程有关的包在java.net.*包下,如InetAddress、NetworkInterface、Socket等。

1、网络接口类InetAddress、NetworkInterface

InetAddress、NetworkInterface是Java提供用于获取ip和mac相关的类。

InetAddress用于获取Ip相关。

该类没有构造方法,但提供了一系列静态方法用于获取相关对象。

例:获取本机ip:

public static void main(String[] args) throws UnknownHostException, IOException {
		InetAddress host=InetAddress.getLocalHost();//本机对象
    
		String hostname=host.getHostName();//获取主机名
		System.out.println("主机名:"+hostname);
		
		String hostAdd=host.getHostAddress();//获取主机ip
		System.out.println("主机地址:"+hostAdd);
		
	}
//主机名:DESKTOP-xxxxx
//主机地址:xx.xxx.xx.xxx

NetworkInterface网络接口类,用于获取网络接口相关,如获取mac地址。

	//获取本机硬件地址,返回byte数组
byte[] b= NetworkInterface.getByInetAddress(host).getHardwareAddress();
		
		StringBuilder str=new StringBuilder("");
		for(int i=0;i<b.length;i++) {
			if(i!=0) {
				str.append("-");//分割符
			}
			
			String mac=Integer.toHexString(b[i]&0xff);//转换为16进制
			if(mac.length()==1) {
				str.append("0"+mac);//补0
			}else{
				str.append(mac);
			}
		}
		System.out.println("网卡:"+str);

//网卡:c8-3d-d4-f0-xx-xx

2、套接字Socket编程

Socket,本质上就是一组接口,是对TCP/IP协议的封装和应用.

Socket编程主要涉及到客户端和服务器端两个方面,首先是在服务器端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是0到65536,但是0到1024是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。

客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

Java中提供了Socket、ServerSocket类代表客户端和服务端。

模拟一个简单的通讯:

客户端ServerSocket

public static void main(String[] args) throws Exception {
		
		ServerSocket s=new ServerSocket(8001);//建立服务端,监听8001端口
		
		Socket socket = s.accept();//接收客户端
     	System.out.println("等待连接");
		
		InputStream is = socket.getInputStream();//获取输入流

        byte[] b = new byte[1024];

        int n = is.read(b);//将客户端数据读入b中
    
    
        System.out.println("客户端发送内容为:" + new String(b,0,n));
        
	}

服务端Socket

public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		Socket s=new Socket("127.0.0.1",8001);//建立客户端、连接服务端套接字
		OutputStream o=s.getOutputStream();//获取输出流、发送数据到客户端
		byte[] b=new byte[1024];
		b="hello world".getBytes();
		o.write(b);
		System.out.println("发送完毕");

	}

运行服务端,保证服务端一直运行的情况下开启客户端,客户端和服务端分别打印:

发送完毕

等待连接
客户端发送内容为:hello world

阻塞式

在服务端程序中accept()是阻塞式的,必须等到客户端连接上才会解除阻塞。

posted @ 2020-01-06 00:29  cgl_dong  阅读(156)  评论(0编辑  收藏  举报