简单了解一下Java的网络编程,JavaSE的学习我是跳过这部分的,在后来的Web学习中一直用的B/S架构,这部分用的不多,简单回顾一下。
Java中和网络编程有关的包在java.net.*包下,如InetAddress、NetworkInterface、Socket等。
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
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