网络编程3--毕向东java基础教程视频学习笔记

Day24

01 TCP上传图片
02 客户端并发上传图片
03 客户端并发登录
04 浏览器客户端-自定义服务端
05 浏览器客户端-Tomcat服务端

 

01 TCP上传图片

 1 import java.net.*;  2 import java.io.*;  3 class PicClient  4 {  5     public static void main(String[] args) throws Exception  6  {  7         Socket s=new Socket("127.0.0.1",10007);  8         FileInputStream fis=new FileInputStream("E:\\图\\素材\\头像.jpg");  9         OutputStream os=s.getOutputStream(); 10         byte[] buf=new byte[1024*16]; 11         int len; 12         while((len=fis.read(buf))!=-1) 13  { 14             os.write(buf,0,len); 15  } 16         //告诉服务器数据写入完毕
17  s.shutdownOutput(); 18         InputStream is=s.getInputStream(); 19         byte[] bufIn=new byte[1024]; 20         int num=is.read(bufIn); 21         System.out.println(new String(bufIn,0,num)); 22         
23  fis.close(); 24  s.close(); 25     
26  } 27 } 28 class PicServer 29 { 30     public static void main(String[] args) throws Exception 31  { 32         ServerSocket ss=new ServerSocket(10007); 33         Socket s=ss.accept(); 34         System.out.println(s.getInetAddress().getHostAddress()+"......connected"); 35         InputStream in=s.getInputStream(); 36         byte[] buf=new byte[1024*16]; 37         FileOutputStream fos=new FileOutputStream("touxiang.jpg"); 38         int len; 39         while((len=in.read())!=-1) 40  { 41             fos.write(buf,0,len); 42  } 43         PrintWriter out=new PrintWriter(s.getOutputStream(),true); 44         out.println("图片上传成功!"); 45 
46  fos.close(); 47  s.close(); 48  ss.close(); 49         
50  } 51 }
View Code

 


02 客户端并发上传图片

服务端如果只有当为一个客户端服务完成后,才能为别的客户端服务,效率就太低了,所以服务端需要采用多线程。

一个客户端请求连接,服务端就开启一个线程为他服务。这样可以实现客户端并发上传图片。

实现代码如下:

 1 /*
 2 
 3 */
 4 import java.net.*;  5 import java.io.*;  6 class PicClient  7 {  8     public static void main(String[] args) throws Exception  9  {  10         //判断要上传的文件是否符合要求,不符合则结束运行
 11         File file=new File(args[0]);  12         if(args.length!=1)  13  {  14             System.out.println("请上传一个文件,而不是多个!");  15             return;  16  }  17         if(!(file.exists() && file.isFile()))  18  {  19             System.out.println("文件不存在,或者文件有问题。");  20             return;  21  }  22         if(!(file.getName().endsWith(".png")))  23  {  24             System.out.println("请上传一个png格式的文件。");  25             return;  26  }  27         if(file.length()>1024*9)  28  {  29             System.out.println("上传文件大小超过允许范围!");  30             return;  31  }  32 
 33         //建立Socket服务
 34         Socket s=new Socket("172.29.115.1",10008);  35         //读取一个图片文件
 36         FileInputStream fis=new FileInputStream(file);  37         byte[] buf=new byte[1024*9];  38         OutputStream out=s.getOutputStream();  39         int len=0;  40         //写入socket输出流中
 41         while((len=fis.read(buf))!=-1)  42  {  43             out.write(buf,0,len);  44 
 45  }  46         //给服务端一个信号,客户端输出结束
 47  s.shutdownOutput();  48         
 49         //接受服务端的回馈信息
 50         InputStream in=s.getInputStream();  51         byte[] b=new byte[1024];  52         int num=in.read(b);  53         System.out.println("server:"+new String(b,0,num));  54 
 55         //关闭资源
 56  fis.close();  57  s.close();  58 
 59         
 60  }  61 }  62 class  PicServerThread implements Runnable  63 {  64     private Socket s;  65     public PicServerThread(Socket s)  66  {  67         this.s=s;  68  }  69     public void run()  70  {  71         try
 72  {  73             int count=1;  74         String ip=new String(s.getInetAddress().getHostAddress()+"");  75         System.out.println(ip+"......connected");  76         File file=new File(ip+"("+count+")");  77         //如果文件名已经存在,通过增加序号,定义新名字  78         //循环进行判断,直到找到没用过的文件名
 79         while(file.exists())  80             file=new File(ip+"("+(count++)+")"+".png");  81 
 82         InputStream in=s.getInputStream();  83         FileOutputStream fos=new FileOutputStream(file);  84         
 85         byte[] buf=new byte[1024*9];  86         int len;  87         //读取数据并写入到文件中
 88         while((len=in.read(buf))!=-1)  89  {  90             fos.write(buf,0,len);  91  }  92 
 93         //向客户端发送提示信息
 94         PrintWriter pw=new PrintWriter(s.getOutputStream(),true);  95         pw.println("上传成功!");  96 
 97         //关闭资源
 98  fos.close();  99  s.close(); 100         
101 
102             
103  } 104         catch (Exception e) 105  { 106             throw new RuntimeException("服务建立失败!"); 107  } 108         
109  } 110 
111     
112 } 113 class PicServer 114 { 115     public static void main(String[] args) throws Exception 116  { 117     
118         //建立服务
119         ServerSocket ss=new ServerSocket(10008); 120         while(true) 121  { 122             //接收客户端端口
123         Socket s=ss.accept(); 124         new Thread(new PicServerThread(s)).start(); 125 
126  } 127     
128  } 129 }
View Code

 


03 客户端并发登录

客户端通过键盘录入用户名,服务端对这个用户名进行校验。
如果该用户存在,在服务端显示XXX,已登录。
并在客户端显示,XXX欢迎登陆。

如果该用户不存在,在服务端显示XXX,尝试登陆。
并在客户端显示,XXX,该用户不存在。

最多只能尝试登陆三次。

 1 import java.net.*;  2 import java.io.*;  3 class LoginClient  4 {  5     public static void main(String[] args)throws Exception  6  {  7         //建立服务
 8         Socket s=new Socket("127.0.0.1",10008);  9         //获得键盘录入
 10         BufferedReader bufr=
 11             new BufferedReader(new InputStreamReader(System.in));  12         //获得socket对应的输出流,设置为自动刷新
 13         PrintWriter out=new PrintWriter(s.getOutputStream(),true);  14 
 15         //获得socket对应的输入流
 16         BufferedReader in=
 17             new BufferedReader(new InputStreamReader(s.getInputStream()));  18         //最多只能尝试登陆三次
 19         for(int x=0;x<3;x++)  20  {  21             String name=bufr.readLine();  22             //如果键盘录入为空(按下CTRL+C),循环结束
 23             if(name==null)  24                 break;  25  out.println(name);  26             String info=in.readLine();  27             System.out.println("server:"+info);  28             //如果验证成功,循环结束
 29             if(info.contains("欢迎"))  30                 break;  31  }  32         //关闭资源
 33  bufr.close();  34  s.close();  35         
 36  }  37 }  38 class  UserThread implements Runnable  39 {  40     private Socket s;  41     public UserThread(Socket s)  42  {  43         this.s=s;  44  }  45     public void run()  46  {  47         try
 48  {  49             //获取客户端ip
 50             String ip=s.getInetAddress().getHostAddress();  51             System.out.println(ip+"......connected.");  52             //服务器最多提供三次验证服务
 53             for(int i=0;i<3;i++)  54  {  55                 BufferedReader in=
 56                     new BufferedReader(new InputStreamReader(s.getInputStream()));  57                 //为读取服务器端的用户文件,建立输入流
 58                 BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));  59                 PrintWriter out=new PrintWriter(s.getOutputStream(),true);  60                 //设置标志位,以便确定服务器需做出什么样的的动作
 61                 boolean flag=false;  62                 String line=null;  63                 String name=in.readLine();  64                 if(name==null)  65                     break;  66                 while((line=bufr.readLine())!=null)  67  {  68                     if(name.equals(line))  69  {  70                         //如果在服务器的用户文件中找到客户输入的登录名  71                         //改变标志位,结束循环
 72                         flag=true;  73                         break;  74  }  75  }  76                 //根据标志位不同,服务器做出不同动作
 77                 if(flag)  78  {  79                     System.out.println(name+"已经登录");  80                     out.println(name+"欢迎登陆!");  81                     break;  82  }  83                 else
 84  {  85                     System.out.println(name+"尝试登录");  86                     out.println(name+",抱歉,用户名不存在!");  87  }  88                 
 89 
 90  }  91             //关闭资源
 92  s.close();  93  }  94         catch (Exception e)  95  {  96  e.printStackTrace();  97  }  98  }  99 
100     
101 } 102 class LoginServer 103 { 104     public static void main(String[] args)throws Exception 105  { 106         //建立服务器端
107         ServerSocket ss=new ServerSocket(10008); 108         while(true) 109  { 110             //循环接收客户请求
111             Socket s=ss.accept(); 112             //为客户开启一个线程
113             new Thread(new UserThread(s)).start(); 114  } 115         
116  } 117 }
View Code

 


04 浏览器客户端-自定义服务端

 

演示客户端和服务端
客户端:浏览器
服务器:自定义

 

 1 import java.net.*;  2 import java.io.*;  3 class ServerDemo  4 {  5     public static void main(String[] args) throws Exception  6  {  7         ServerSocket ss=new ServerSocket(11000);  8         Socket s=ss.accept();  9  System.out.println(s.getInetAddress().getHostAddress()); 10         PrintWriter out=new PrintWriter(s.getOutputStream(),true); 11         out.println("<font color='blue' size=8>客户端你好!</font>"); 12  s.close(); 13  ss.close(); 14  } 15 }
View Code

不过用telnet当做客户端实验时,我计算机可能没用这个应用,就没有成功。

运行显示:
D:\abc>telnet 127.0.0.1 11000
'telnet' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

 


05 浏览器客户端-Tomcat服务端

客户端:浏览器

服务端:Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,

在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,

可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。

实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,

所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

 

简要介绍我安装Tomcat的过程。

1.下载。

官方下载网址为:http://tomcat.apache.org/
选择DownLoad--Tomcat6.0-32-bit/64-bit Windows Service Installer(pgp,md5)

这个版本直接点击就可以安装。如果不需要改变安装路径,直接选择下一步就可以了。

2.环境设置。

变量名:JAVA-HOME

变量值:SDK路径。

3.启动

启动Tomcat我们可以直接运行bin目录下的 Tomcat6.exe 可执行文件。

在启动完成以后在浏览器中输入:http://127.0.0.1:8080 .显示如下

网络编程3--毕向东java基础教程视频学习笔记_第1张图片

 

在D:\tomcat\webapps路径下新建文件夹myWeb,再在此文件夹中新建文件Demo.html.

文件内容:

 1 <html>
 2   <body>
 3       <h1>这是我的主页</h1>
 4       <font size=8 color=blue>欢迎登陆</font>
 5       <div>
 6           锦瑟无端五十弦,</br>
 7           一弦一柱思华年。</br>
 8           庄生晓梦迷蝴蝶,</br>
 9           望帝春心托杜鹃。</br>
10           沧海月明珠有泪。</br>
11           蓝田日暖玉生烟,</br>
12           此情可待成追忆。</br>
13           只是当时已惘然。</br>
14     
15         
16       </div>
17   </body>
18 </html>
View Code

 

在浏览器中输入http://127.0.0.1:8080/myWeb/Demo.html,显示如下:

网络编程3--毕向东java基础教程视频学习笔记_第2张图片

 

你可能感兴趣的:(网络编程3--毕向东java基础教程视频学习笔记)