你的位置:首页 > Java教程

[Java教程]网络编程3


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 Exception31   {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 PicServer114 {115   public static void main(String[] args) throws Exception116   {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 LoginServer103 {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 .显示如下

 

在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,显示如下: