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 }

 

posted @ 2021-04-26 10:01  benon  阅读(60)  评论(0编辑  收藏  举报