IP地址和端口号
端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用,
用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。
InetAddress
常用方法
代码演示:
1 public static void main(String[] args) throws UnknownHostException { 2 //InetAddress inet=InetAddress.getLocalHost(); 3 //主机名+ip地址 4 InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34"); 5 System.out.println(inet); 6 String host=inet.getHostName(); 7 String ip=inet.getHostAddress(); 8 System.out.println(host+"..."+ip); 9 }
UDP通信
DatagramPacket
DatagramSocket
UDP网络程序
代码演示:
1 //发送端 2 public class UDPSend { 3 public static void main(String[] args) throws IOException { 4 //1.打包 5 //明确数据 6 byte[] bytes="你好吗".getBytes(); 7 //明确目的地的IP地址 8 InetAddress inet=InetAddress.getByName("127.0.0.1"); 9 //装包 10 DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888); 11 //2.创建快递公司 12 DatagramSocket ds=new DatagramSocket(); 13 //3.发送 14 ds.send(dp); 15 //4.释放资源 16 ds.close(); 17 } 18 19 }
1 //接收端 2 public class UDPReceive { 3 public static void main(String[] args) throws IOException { 4 //明确端口号 5 DatagramSocket ds=new DatagramSocket(8888); 6 //创建接收数据的字节数组 7 byte[] bytes=new byte[1024]; 8 //创建接收的数据包 9 DatagramPacket dp=new DatagramPacket(bytes, bytes.length); 10 //接收 11 ds.receive(dp); 12 //获取接收包上的数据 13 int length=dp.getLength(); 14 String ip=dp.getAddress().getHostAddress(); 15 int port=dp.getPort(); 16 System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,length)); 17 //释放资源 18 ds.close(); 19 } 20 21 }
TCP通信
一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。
ServerSocket
Socket
方法声明 |
功能描述 |
int getPort() |
该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号 |
InetAddress getLocalAddress() |
该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回 |
void close() |
该方法用于关闭Socket连接,结束本次通信。在关闭socket之前,应将与socket相关的所有的输入/输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源 |
InputStream getInputStream() |
该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据 |
OutputStream getOutputStream() |
该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据 |
图解:
代码演示:
1 //发送端 2 public class UDPSend { 3 public static void main(String[] args) throws IOException { 4 //1.打包 5 //明确数据 6 Scanner sc=new Scanner(System.in); 7 //明确目的地的IP地址 8 InetAddress inet=InetAddress.getByName("192.168.1.171"); 9 //2.创建快递公司 10 DatagramSocket ds=new DatagramSocket(); 11 while(true){ 12 String mes=sc.next(); 13 byte[] bytes=mes.getBytes(); 14 //装包 15 DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666); 16 //3.发送 17 ds.send(dp); 18 } 19 //4.释放资源 20 //ds.close(); 21 22 }
1 //接收端 2 public class UDPReceive { 3 public static void main(String[] args) throws IOException { 4 //明确端口号 5 DatagramSocket ds=new DatagramSocket(8888); 6 //创建接收数据的字节数组 7 byte[] bytes=new byte[1024]; 8 //创建接收的数据包 9 while(true){ 10 DatagramPacket dp=new DatagramPacket(bytes, bytes.length); 11 //接收 12 ds.receive(dp); 13 //获取接收包上的数据 14 int length=dp.getLength();//明确发送的字节长度 15 String ip=dp.getAddress().getHostAddress(); 16 int port=dp.getPort(); 17 System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:" 18 +new String(bytes,0,length)); 19 } 20 }
1 //服务器端 2 public class TCPServer { 3 public static void main(String[] args) throws IOException { 4 //创建服务器套接字 5 ServerSocket server=new ServerSocket(7777); 6 //调用accept方法与客户端创建链接 7 Socket socket=server.accept(); 8 InputStream in=socket.getInputStream(); 9 byte[] bytes=new byte[1024]; 10 int len=in.read(bytes); 11 System.out.println(new String(bytes,0,len)); 12 //服务器给客户端回复 13 OutputStream out=socket.getOutputStream(); 14 out.write("收到!over!".getBytes()); 15 16 server.close(); 17 }
1 //客户端 2 public class TCPCLient { 3 public static void main(String[] args) throws IOException { 4 //1.创建Socket对象,连接服务器 5 Socket socket=new Socket("127.0.0.1",7777); 6 //2.通过客户端套接字对象Socket对象中的获取字节输出流的方法 7 OutputStream out=socket.getOutputStream(); 8 //3.将数据写向服务器 9 out.write("服务器你好".getBytes()); 10 //接收服务器端的回复 11 InputStream in=socket.getInputStream(); 12 byte[] bytes=new byte[1024]; 13 int len=in.read(bytes); 14 System.out.println(new String(bytes, 0, len)); 15 //释放资源 16 socket.close(); 17 }