1.网络编程中有两个主要的问题
1.如何准确定位到网络上的一台主机或者多台主机
2.找到主机之后如何进行通信
2.网络编程中的要素
3.IP
ip 在java中有个 类:InetAddress
123.0.0.1是本机的ip地址
ip地址的分类
ipv4 和 ipv6
ipv4: 127.0.0.1 0~255 共40亿个
ipv6:128位,8个无符号整数
4.TCP/IP
1.TCP/IP简介
TCP:场景:打电话
面向连接的可靠的传输协议
三次握手。四次挥手
客户端服务端
传输完成,释放连接 ,效率低
UDP场景:发短信
不连接,不稳定的
客户端。服务端没有明确的界限
不管有没有准备好,都可以发给你
2.案例1TCP实现的聊天
基于TCP实现的网络编程
总结来说就是
客户端:1.需要得到服务端的ip地址和端口号,通过套接字,创建连接
2.通过套接字创建输出流将自己想传输的数据传输给指定的服务端
服务端:1.需要创建一个指定端口号的serverSocket,
2.等待客户端连接。使用accpt监听连接的客户端,返回值是一个socket
3.通过这个socket读入客户端发送过来的数据。
客户端
/*** @Author Rookie Coder* @Description 客户端* @Date**/public class ClientSocket {public static void main(String[] args) {OutputStream outputStream = null;Socket socket = null;// 获取服务端ip地址try {InetAddress in1 = InetAddress.getByName("127.0.0.1");// 获取服务端端口号int port = 8080;// 创建一个socketsocket = new Socket(in1,port);outputStream = socket.getOutputStream();for (int i = 0; i < 50; i++) {outputStream.write("你好客户端,我是小柒".getBytes());}} catch (Exception e) {e.printStackTrace();}finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
服务端:
/*** @Author Rookie Coder* @Description 服务端* @Date**/public class MyServerSocket {public static void main(String[] args) {ServerSocket serverSocket = null;InputStream inputStream = null;ByteArrayOutputStream bos = null;Socket socket = null;try{// 创建一个服务端 端口号为8080serverSocket = new ServerSocket(8080) ;while (true){// 持续监听接收到的客户端socket = serverSocket.accept();// 获取客户端发来的消息inputStream = socket.getInputStream();// 建立一个管道流bos = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len;while ((len=inputStream.read(bytes))!=-1){bos.write(bytes,0,len);}System.out.println(bos);}} catch (Exception e) {e.printStackTrace();}finally {if (bos!=null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
3.案例2:TCP实现文件上传
客户端:
*** @Author Rookie Coder* @Description 文件上传客户端* @Date**/public class MyClientSocket {public static void main(String[] args) {// 1.创建一个socket,传入服务端ip 和服务端 端口号Socket socket = null;OutputStream outputStream = null;FileInputStream fi1 = null;try {socket = new Socket(InetAddress.getByName("127.0.0.1"),8081);// 2.创建输入流,读取要上传的文件fi1 = new FileInputStream(new File("D:/JAVAStudy/IDEAWorkSpace/javaSECode/JavaSEReview/java_9netword/src/2.jpg"));// 3.创建输出流,输出给服务端outputStream = socket.getOutputStream();byte[] bytes = new byte[1024];int len;while ((len=fi1.read(bytes))!=-1){outputStream.write(bytes,0,len);}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (fi1!=null){try {fi1.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}*** @Author Rookie Coder* @Description 文件上传客户端* @Date**/public class MyClientSocket {public static void main(String[] args) {// 1.创建一个socket,传入服务端ip 和服务端 端口号Socket socket = null;OutputStream outputStream = null;FileInputStream fi1 = null;try {socket = new Socket(InetAddress.getByName("127.0.0.1"),8081);// 2.创建输入流,读取要上传的文件fi1 = new FileInputStream(new File("D:/JAVAStudy/IDEAWorkSpace/javaSECode/JavaSEReview/java_9netword/src/2.jpg"));// 3.创建输出流,输出给服务端outputStream = socket.getOutputStream();byte[] bytes = new byte[1024];int len;while ((len=fi1.read(bytes))!=-1){outputStream.write(bytes,0,len);}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (fi1!=null){try {fi1.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
服务端:
/*** @Author Rookie Coder* @Description 文件上传服务端* @Date**/public class MyServerSocket {public static void main(String[] args) {// 1. 创建一个ServersocketSocket accept = null;InputStream inputStream = null;FileOutputStream f1 = null;ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(8081);// 监听发送数据的客户端accept = serverSocket.accept();// 输出客户端所传输过来的数据inputStream = accept.getInputStream();// 创建一个管道流f1 = new FileOutputStream(new File("revice.jpg"));byte[] bytes = new byte[1024];int len;while ((len=inputStream.read(bytes))!=-1){f1.write(bytes,0,len);}System.out.println(f1);} catch (IOException e) {e.printStackTrace();}finally {if (f1 !=null){try {f1.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (accept!=null){try {accept.close();} catch (IOException e) {e.printStackTrace();}}if (serverSocket!=null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}}
