文章目录

  • InetAddress类
    • 相关方法
    • 代码举例
  • Socket
    • 基本介绍
    • 基本介绍2
    • 应用案例(TCP字节流)
    • 应用案例2(TCP字节流)
      • 注意(结束标记)
    • 应用案例3(TCP字符流)
      • 注意(结束标记)
    • 应用案例4

InetAddress类

相关方法

  1. 获取本机InetAddress对象 getLocalHost
  2. 根据指定主机名/域名获取ip地址对象 getByName
  3. 获取InetAddress对象的主机名 getHostName
  4. 获取InetAddress对象的地址 getHostAddress

代码举例

package com.tao.api;import java.net.InetAddress;
import java.net.UnknownHostException;/*** Create By 刘鸿涛* 2022/2/6 15:03* 演示INetAddress 类的使用*/
public class API_ {public static void main(String[] args) throws UnknownHostException {//1.获取本机的InetAddress 对象InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost);          //DESKTOP-9SSM1P3/192.168.16.1//2.根据指定主机名,获取 InetAddress对象InetAddress byName = InetAddress.getByName("DESKTOP-9SSM1P3");System.out.println(byName);             //DESKTOP-9SSM1P3/192.168.16.1//3.根据域名返回 InetAddress对象,比如 www.baidu.comInetAddress byName1 = InetAddress.getByName("www.baidu.com");System.out.println(byName1);            //www.baidu.com/220.181.38.150//4.通过 InetAddress 对象,获取对应的地址String hostAddress = byName1.getHostAddress();  //IP 220.181.38.150System.out.println("对应的IP为:" + hostAddress);                //220.181.38.150//5.通过 InetAddress 对象,获取对应的主机名/或者域名String hostName = byName1.getHostName();System.out.println("对应的域名为:" + hostName);                   //www.baidu.com}
}

Socket

基本介绍

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。
  2. 通信的两端都要有Socket,是两台机器间通信的端点
  3. 网络通信其实就是Socket间的通信
  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
  5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

基本介绍2

  1. 基于客户端——服务端的网络通信
  2. 底层使用的是TCP/IP协议
  3. 应用场景举例:客户端发送数据,服务端接受并显示控制台
  4. 基于Socket的TCP编程

应用案例(TCP字节流)

  1. 编写一个服务器端,和一个客户端
  2. 服务器端在 9999端口监听
  3. 客户端连接到服务器端,发送“hello,server”,然后退出
  4. 服务器端接收到 客户端发送的信息,输出,并退出

两个程序:服务端,客户端

package com.tao.socket;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/6 16:36* 客户端,发送“hello,server”给服务端*/
public class SocketTCP01Client {public static void main(String[] args) throws IOException {//        思路
//        1.连接服务端(ip,端口)//解读://连接本机(服务端)的9999端口,如果连接成功,返回Socket对象InetAddress localHost = InetAddress.getLocalHost();//localHost可以直接换成主机名D-9xxxxxxSocket socket = new Socket(localHost, 9999);System.out.println("客户端 socket返回 = " + socket.getClass());//        2.连接上后,生成Socket,通过socket.getOutputStream()//得到 和 socket对象关联的输出流对象OutputStream outputStream = socket.getOutputStream();//        3.通过输出流,写入数据到 数据通道outputStream.write("hello,server".getBytes());//        4.关闭流outputStream.close();socket.close();System.out.println("客户端退出了");}
}
package com.tao.socket;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/6 16:26* 服务端*/
public class SocketTCP01Server {public static void main(String[] args) throws IOException {//        思路
//        1.在本机的9999端口监听,等待连接//在本机9999端口监听,等待连接//细节:要求在本机没有其他服务在监听9999//细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发](多并发)ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端,在监听9999,等待连接...");//        2.当没有客户端连接9999端口时,程序会阻塞,等待连接//如果有客户端连接,则会返回Socket对象,程序继续Socket accept = serverSocket.accept();System.out.println("服务器端 socket = " + serverSocket.getClass());System.out.println("有目标客户端连接,程序继续....");//        3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示InputStream inputStream = accept.getInputStream();//        4.IO读取byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1){System.out.println(new String(buf, 0,readLen)); //根据读取到的实际长度,显示内容}//        5.关闭流和socketinputStream.close();accept.close();     //socketserverSocket.close();}
}

应用案例2(TCP字节流)

  1. 编写一个服务器端,和一个客户端
  2. 服务器端在 5000 端口监听
  3. 客户端连接到服务器端,发送“hello,server”,并接受服务器端回发的“hello,client”,再退出
  4. 服务器端接收到 客户端发送的信息,输出,并发送“hello,client”,再退出

服务器端

package com.tao.test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 7:55*/
public class Server_ {public static void main(String[] args) throws IOException {//生成ServerSoket对象监视端口5000ServerSocket serverSocket = new ServerSocket(5000);//当我们没有连接服务器时,我们阻塞这个程序,acceptSystem.out.println("等待目标客户端连接...");Socket socket = serverSocket.accept();//从数据通道接收数据System.out.println("正在接受数据...");System.out.println("接收到数据:");InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1){System.out.println(new String(buf,0,readLen));}//发送数据到数据通道System.out.println("正在写入数据到数据通道...");OutputStream outputStream = socket.getOutputStream();outputStream.write("hello,client".getBytes());//关闭流serverSocket.close();socket.close();inputStream.close();outputStream.close();System.out.println("服务器端已关闭....");}
}

客户端

package com.tao.test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 7:55*/
public class Client_ {public static void main(String[] args) throws IOException {//Socket连接服务器和端口//获得本机的ip和端口InetAddress localHost = InetAddress.getLocalHost();//socket对象插入端口Socket socket = new Socket(localHost, 5000);System.out.println("服务器已连接...正在监听5000端口");//把数据写入到数据通道OutputStream outputStream = socket.getOutputStream();outputStream.write("hello,server".getBytes());socket.shutdownOutput();//接收服务端数据,并读写//IO读取System.out.print("读取到数据:");InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];    //每次读取1024字节int readLen = 0;    //读取的长度while ((readLen = inputStream.read(buf)) != - 1){//从buf的第0个字节读到readLenSystem.out.println(new String(buf,0,readLen));}System.out.println("客户端已关闭...");//关闭流socket.close();outputStream.close();inputStream.close();}
}

注意(结束标记)

写完数据后shutduwn

socket.shutdownOutput();

应用案例3(TCP字符流)

  1. 编写一个服务端,和一个客户端
  2. 服务端在 9999 端口监听
  3. 客户端连接到服务端,发送“hello,server”,并接受服务端回发的“hello,client”,再退出
  4. 服务端接收到 客户端发送的信息,输出,并发送“hello,client”,再退出

注意(结束标记)

writer.newLine();    //换行符,注意需要使用readLine()

package com.tao.socket;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 7:55*/
public class SocketTCP03Server {public static void main(String[] args) throws IOException {//生成ServerSoket对象监视端口5000ServerSocket serverSocket = new ServerSocket(5000);//当我们没有连接服务器时,我们阻塞这个程序,acceptSystem.out.println("等待目标客户端连接...");Socket socket = serverSocket.accept();//从数据通道接收数据System.out.println("正在接受数据...");System.out.print("接收到数据:");InputStream inputStream = socket.getInputStream();//4.IO读取,字符流//使用InputStreamReader 将 inputStream 转成字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);  //输出//        byte[] buf = new byte[1024];
//        int readLen = 0;
//        while ((readLen = inputStream.read(buf)) != -1){//            System.out.println(new String(buf,0,readLen));
//        }//发送数据到数据通道System.out.println("正在写入数据到数据通道...");OutputStream outputStream = socket.getOutputStream();//使用字符输出流的方式回复信息BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello,client字符流");bufferedWriter.newLine();   //插入一个换行符,表示回复内容的结束bufferedWriter.flush();     //注意,需要手动的flush
//        outputStream.write("hello,client".getBytes());//关闭流serverSocket.close();socket.close();inputStream.close();outputStream.close();System.out.println("服务器端已关闭....");}
}
package com.tao.socket;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 7:55*/
public class SocketTCP03Client {public static void main(String[] args) throws IOException {//Socket连接服务器和端口//获得本机的ip和端口InetAddress localHost = InetAddress.getLocalHost();//socket对象插入端口Socket socket = new Socket(localHost, 5000);System.out.println("服务器已连接...正在监听5000端口");//把数据写入到数据通道OutputStream outputStream = socket.getOutputStream();//使用字符流
//        outputStream.write("hello,server".getBytes());BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello,server字符流");bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,表示写入的内容结束,注意,要求对方使用readLine()!!!!bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道
//        socket.shutdownOutput();//接收服务端数据,并读写//IO读取System.out.print("读取到数据:");InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);
//        byte[] buf = new byte[1024];    //每次读取1024字节
//        int readLen = 0;    //读取的长度
//        while ((readLen = inputStream.read(buf)) != - 1){//            //从buf的第0个字节读到readLen
//            System.out.println(new String(buf,0,readLen));
//        }System.out.println("客户端已关闭...");//关闭流socket.close();outputStream.close();inputStream.close();}
}

应用案例4

  1. 编写一个服务端,和一个客户端
  2. 服务器端在 9999端口监听
  3. 客户端连接到服务端,发送 一张图片 d:\qie.png
  4. 服务器端接收到 客户端发送的图片,保存到 src 下,发送“收到图片”再退出
  5. 客户端接收到服务端发送的“收到图片”,再退出
  6. 该程序要求使用StreamUtils.java

说明:使用BufferedInputStream 和 BufferedOutputStream 字节流

服务器端

package com.tao.upload;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 19:05* 文件上传服务端*/
public class TCPFileUploadServer {public static void main(String[] args) throws Exception {//1.监视端口System.out.println("正在监听9999...");ServerSocket serverSocket = new ServerSocket(9999);//2.等待连接Socket socket = serverSocket.accept();//3.读取客户端发送的数据//通过Socket得到输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamtoByteArray(bis);//4.将得到 bytes 数组,写入到指定的路径,就得到一个文件了String destFilePath = "src\\qie2.png";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));bos.write(bytes);bos.close();//向客户端回复“收到图片”//通过socket 获取到输出流(字符)BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("收到图片...");writer.flush(); //把内容刷新到数据通道socket.shutdownOutput();        //设置写入结束标记//关闭其他资源socket.close();serverSocket.close();bis.close();writer.close();System.out.println("服务端结束");}
}

客户端

package com.tao.upload;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/7 19:05* 文件上传客户端*/
public class TCPFileUploadClient {public static void main(String[] args) throws Exception {//连接服务器和端口
//        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);InetAddress localHost = InetAddress.getLocalHost();Socket socket = new Socket(localHost, 9999);//创建读取磁盘文件的输入流String filePath = "d:\\jing.jpg";BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));//bytes 就是filePath对应的字节数组byte[] bytes = StreamUtils.streamtoByteArray(bis);//通过socket获取到输出流,将bytes数据发送给服务端BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());bos.write(bytes);   //将文件对应的字节数组的内容,写入到数据通道bis.close();socket.shutdownOutput();    //设置写入数据的结束标记//接收从服务端回复的消息InputStream inputStream = socket.getInputStream();//使用StreamUtils的方法,直接将 inputStream 读取到的内容转成字符串String s = StreamUtils.streamToString(inputStream);System.out.println(s);//关闭相关的流bos.close();socket.close();inputStream.close();System.out.println("客户端结束");}
}

Java基础 - 网络编程 - InetAddress类、Socket(TCP)举例使用相关推荐

  1. JAVA基础 网络编程

    JAVA基础 网络编程 网络我们每天都会用到的,在我们生活中占的地位也在不断的提高,我们下面就简单了解下网络编程的内容. 想要学习网络编程,首先就需要了解网络编程包含哪些内容. 网络编程包括 IP节点 ...

  2. Java基础---网络编程

    第一讲     概述 1.网络模型:OSI参考模型和TCP/IP参考模型 图示: 一般来说开发处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP. 通常用 ...

  3. 黑马程序员——java基础---网络编程

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  4. java基础-网络编程

    1.网络模型: OSI参考模型.TCP/IP参考模型 数据传输的过程:向下走:封包    向上走:拆包 向上走一直拆包,直到得到数据. 2.网络通讯要素 ip地址.端口号.传输协议 Ip和端口用来找对 ...

  5. java基础网络编程

    利用网络,实现两台计算机之间的互相联通.交互. 网络编程有两类: UDP 一种无连接的传输层协议.无连接:指不需要知道对方在不在,只负责发数据传输出去,而对方可能不在,数据便会丢失,所以是不稳定的. ...

  6. 黑马程序员——Java基础——网络编程1

    ------- android培训.java培训.期待与您交流! ---------- 网络编程1 一.获取IP     网络编程主要在传输层 :TCP(Transmission Control Pr ...

  7. [网络编程]InetAddress类的实例化

    /*一.网络编程中有两个主要的问题:1.如何准确的定位网络上一台或多台主机;定位主机上的特定的应用2.找到主机后如何可靠高效的进行数据传输二.网络编程中的两个要素:1.IP和端口号2.提供网络通信协议 ...

  8. 学习笔记-java基础-网络编程

    刚在培训机构学习完JAVA基础和WEB,感觉边学边忘.就把这作为记忆的笔记,我也不知道要不要记笔记,写在本子上太耗费时间了. 一.要想实现网络通信,首先要解决两个问题: ①:如何从网络中定位到一台或多 ...

  9. Java基础——网络编程

    一.网路编程知识 意义:过去我们IO流是把本地的文件传递而已,网络编程是把自己电脑的数据传递给另一台电脑,并且回馈信息.这是数据通讯 1.通讯三要素 1.1 IP地址 (1)获取对方主机IP 1.2 ...

最新文章

  1. 归纳推理测试没做完_敷完面膜不要做4件事,不但敷了面膜没效果,皮肤还变差了...
  2. android根据文件路径打开文件_你知道如何在打印的文件上面添加文件的路径吗...
  3. pytorch 笔记: 复现论文 Stochastic Weight Completion for Road Networks using Graph Convolutional Networks
  4. dnf超时空漩涡副本路线流程图_DNF:超时空漩涡开荒全攻略一览,你顺利通关了么?...
  5. python如何进阶提升_Python序列操作之进阶篇
  6. Wireshark网卡抓包工具简明教程
  7. oracle报错-1,[Oracle报错]RMAN-12005: error during channel cleanup/ORA-19550: cannot ...
  8. mysql使用 BETWEEN AND 查询
  9. kerberos 主从安装
  10. 关于Const指针的一点补充
  11. 初探队与广度优先搜索
  12. Windows服务器nginx多个二级域名部署ssl证书超详细步骤(https)
  13. vim安装airline
  14. SQL2008升级SQL2008R2完全教程
  15. WPS上配置使用Endnote软件
  16. pyinstaller(py文件转成exe)
  17. Navicat 压缩包免费下载
  18. Python+selenium实现医院自动挂号
  19. 技术人员帮助电商运营选择最合适的物流快递运输公司的5个切入点
  20. 洛谷P4735 最大异或和

热门文章

  1. Office2003宏病毒——台湾No.1MacroVirus的运行
  2. 北京理工大学计算机调剂非全,北京理工大学自动化学院2019年非全日制考生调剂信息...
  3. MTPuTTy 远程连接阿里云
  4. SSH客户端Putty与多标签的Putty CM(puttycm)/MTPutty的配置使用方法
  5. 无法写入最后一个_5000GB写入测试!影驰擎GA-E评测:只卖19999元的16TB企业级SSD...
  6. 魔兽争霸3冰封王座不能全屏
  7. 3.使用GSYVideoPlayer实现仿抖音视频播放以及点赞飘心效果
  8. 离开北京[By Ivan]
  9. IOS开发教程第一季之01UI基础day7合并IOS学习007----控件(UITableView03微博)
  10. LEETCODE | PYTHON | 724 | 寻找数组的中心下标