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()
是阻塞式的,必须等到客户端连接上才会解除阻塞。
来源:https://www.cnblogs.com/cgl-dong/p/12154466.html