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 }
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 }
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 }
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 }
不过用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: omcatwebapps路径下新建文件夹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>
在浏览器中输入http://127.0.0.1:8080/myWeb/Demo.html,显示如下: