JavaEE-26-网络编程
网络编程
网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来。
网络编程三要素:IP地址、端口、协议。
网络编程原理:通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO流进行传输。(先开启接收端,再开启发送端)
Socket概述
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据,为了区别不同的应用程序进程和连接,计算机系统为应用程序和TCP/IP协议交互提供了套接字---Socket接口。
这样一来,应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
TCP/IP协议只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
就像操作系统会提供编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。(Socket实际上是对TCP/IP协议的封装,使得程序员更方便的使用TCP/IP协议栈而已)
Socket整体流程
Socket编程主要涉及到客户端和服务器端两个方面,首先是在服务器端创建一个服务器套接字---ServerSocket,并把它附加到一个端口上,服务器从这个端口监听连接。
(端口号的范围是0到65536,但是0到1024是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口)
客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。
当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。
举例:
示例1:客户端键盘录入内容,然后服务器输出到控制台显示出来
服务器端:
1 public class ServerDemo { 2 public static void main(String[] args) throws IOException{ 3 //创建服务器Socket对象 4 ServerSocket ss=new ServerSocket(22222); 5 6 //监听客户端连接 7 Socket s=ss.accept(); 8 9 //包装通道内的流,使用字符流,一次读取一行数据 10 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 11 String line=null; 12 while((line=br.readLine())!=null) { 13 System.out.println(line); 14 } 15 16 //br.close(); 17 s.close(); 18 ss.close(); 19 } 20 }
客户端:
1 public class ClientDemo { 2 public static void main(String[] args) throws IOException { 3 // 创建客户端Socket对象 4 Socket s = new Socket("172.21.2.50", 22222); 5 6 // 键盘录入数据 7 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 8 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 9 String line = null; 10 while ((line = br.readLine()) != null) { 11 //键盘录入数据要自定义结束标记 12 if ("886".equals(line)) { 13 break; 14 } 15 bw.write(line); 16 bw.newLine(); 17 bw.flush(); 18 } 19 20 // 释放资源 21 bw.close(); 22 br.close(); 23 s.close(); 24 } 25 }
示例2:将客户端的文本文件发送到服务器的文本文件中(上传文件操作)
服务器端:
1 public class UploadServer { 2 public static void main(String[] args) throws IOException{ 3 // 创建服务器端的Socket对象 4 ServerSocket ss = new ServerSocket(11111); 5 6 //监听客户端连接 7 Socket s=ss.accept(); 8 9 //包装通道内的流 10 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 11 12 //在服务器端新封装一个文本文件 13 BufferedWriter bw=new BufferedWriter(new FileWriter("Copy.txt")); 14 15 String line=null; 16 while((line=br.readLine())!=null) { 17 bw.write(line); 18 bw.newLine(); 19 bw.flush(); 20 } 21 22 //释放资源 23 br.close(); 24 bw.close(); 25 s.close(); 26 ss.close(); 27 } 28 }
客户端:
1 public class UploadClient { 2 public static void main(String[] args) throws IOException{ 3 //创建客户端Socket对象 4 Socket s=new Socket("172.21.2.50",11111); 5 6 //封装已有的文本文件 7 BufferedReader br=new BufferedReader(new FileReader("a.txt")); 8 9 //封装通道内的流 10 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 11 12 String line=null; 13 while((line=br.readLine())!=null) { 14 bw.write(line); 15 bw.newLine(); 16 bw.flush(); 17 } 18 19 //释放资源 20 br.close(); 21 s.close(); 22 } 23 }