网络编程3--毕向东java基础教程视频学习笔记
Day24
01 TCP上传图片
02 客户端并发上传图片
03 客户端并发登录
04 浏览器客户端-自定义服务端
05 浏览器客户端-Tomcat服务端
01 TCP上传图片
import java.net.*;
import java.io.*;
class PicClient
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("127.0.0.1",10007);
FileInputStream fis=new FileInputStream("E:\\图\\素材\\头像.jpg");
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024*16];
int len;
while((len=fis.read(buf))!=-1)
{
os.write(buf,0,len);
}
//告诉服务器数据写入完毕
s.shutdownOutput();
InputStream is=s.getInputStream();
byte[] bufIn=new byte[1024];
int num=is.read(bufIn);
System.out.println(new String(bufIn,0,num)); fis.close();
s.close(); }
}
class PicServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10007);
Socket s=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"......connected");
InputStream in=s.getInputStream();
byte[] buf=new byte[1024*16];
FileOutputStream fos=new FileOutputStream("touxiang.jpg");
int len;
while((len=in.read())!=-1)
{
fos.write(buf,0,len);
}
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("图片上传成功!"); fos.close();
s.close();
ss.close(); }
}
02 客户端并发上传图片
服务端如果只有当为一个客户端服务完成后,才能为别的客户端服务,效率就太低了,所以服务端需要采用多线程。
一个客户端请求连接,服务端就开启一个线程为他服务。这样可以实现客户端并发上传图片。
实现代码如下:
/* */
import java.net.*;
import java.io.*;
class PicClient
{
public static void main(String[] args) throws Exception
{
//判断要上传的文件是否符合要求,不符合则结束运行
File file=new File(args[0]);
if(args.length!=1)
{
System.out.println("请上传一个文件,而不是多个!");
return;
}
if(!(file.exists() && file.isFile()))
{
System.out.println("文件不存在,或者文件有问题。");
return;
}
if(!(file.getName().endsWith(".png")))
{
System.out.println("请上传一个png格式的文件。");
return;
}
if(file.length()>1024*9)
{
System.out.println("上传文件大小超过允许范围!");
return;
} //建立Socket服务
Socket s=new Socket("172.29.115.1",10008);
//读取一个图片文件
FileInputStream fis=new FileInputStream(file);
byte[] buf=new byte[1024*9];
OutputStream out=s.getOutputStream();
int len=0;
//写入socket输出流中
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len); }
//给服务端一个信号,客户端输出结束
s.shutdownOutput(); //接受服务端的回馈信息
InputStream in=s.getInputStream();
byte[] b=new byte[1024];
int num=in.read(b);
System.out.println("server:"+new String(b,0,num)); //关闭资源
fis.close();
s.close(); }
}
class PicServerThread implements Runnable
{
private Socket s;
public PicServerThread(Socket s)
{
this.s=s;
}
public void run()
{
try
{
int count=1;
String ip=new String(s.getInetAddress().getHostAddress()+"");
System.out.println(ip+"......connected");
File file=new File(ip+"("+count+")");
//如果文件名已经存在,通过增加序号,定义新名字
//循环进行判断,直到找到没用过的文件名
while(file.exists())
file=new File(ip+"("+(count++)+")"+".png"); InputStream in=s.getInputStream();
FileOutputStream fos=new FileOutputStream(file); byte[] buf=new byte[1024*9];
int len;
//读取数据并写入到文件中
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
} //向客户端发送提示信息
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功!"); //关闭资源
fos.close();
s.close(); }
catch (Exception e)
{
throw new RuntimeException("服务建立失败!");
} } }
class PicServer
{
public static void main(String[] args) throws Exception
{ //建立服务
ServerSocket ss=new ServerSocket(10008);
while(true)
{
//接收客户端端口
Socket s=ss.accept();
new Thread(new PicServerThread(s)).start(); } }
}
03 客户端并发登录
客户端通过键盘录入用户名,服务端对这个用户名进行校验。
如果该用户存在,在服务端显示XXX,已登录。
并在客户端显示,XXX欢迎登陆。
如果该用户不存在,在服务端显示XXX,尝试登陆。
并在客户端显示,XXX,该用户不存在。
最多只能尝试登陆三次。
import java.net.*;
import java.io.*;
class LoginClient
{
public static void main(String[] args)throws Exception
{
//建立服务
Socket s=new Socket("127.0.0.1",10008);
//获得键盘录入
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//获得socket对应的输出流,设置为自动刷新
PrintWriter out=new PrintWriter(s.getOutputStream(),true); //获得socket对应的输入流
BufferedReader in=
new BufferedReader(new InputStreamReader(s.getInputStream()));
//最多只能尝试登陆三次
for(int x=0;x<3;x++)
{
String name=bufr.readLine();
//如果键盘录入为空(按下CTRL+C),循环结束
if(name==null)
break;
out.println(name);
String info=in.readLine();
System.out.println("server:"+info);
//如果验证成功,循环结束
if(info.contains("欢迎"))
break;
}
//关闭资源
bufr.close();
s.close(); }
}
class UserThread implements Runnable
{
private Socket s;
public UserThread(Socket s)
{
this.s=s;
}
public void run()
{
try
{
//获取客户端ip
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected.");
//服务器最多提供三次验证服务
for(int i=0;i<3;i++)
{
BufferedReader in=
new BufferedReader(new InputStreamReader(s.getInputStream()));
//为读取服务器端的用户文件,建立输入流
BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
//设置标志位,以便确定服务器需做出什么样的的动作
boolean flag=false;
String line=null;
String name=in.readLine();
if(name==null)
break;
while((line=bufr.readLine())!=null)
{
if(name.equals(line))
{
//如果在服务器的用户文件中找到客户输入的登录名
//改变标志位,结束循环
flag=true;
break;
}
}
//根据标志位不同,服务器做出不同动作
if(flag)
{
System.out.println(name+"已经登录");
out.println(name+"欢迎登陆!");
break;
}
else
{
System.out.println(name+"尝试登录");
out.println(name+",抱歉,用户名不存在!");
} }
//关闭资源
s.close();
}
catch (Exception e)
{
e.printStackTrace();
}
} }
class LoginServer
{
public static void main(String[] args)throws Exception
{
//建立服务器端
ServerSocket ss=new ServerSocket(10008);
while(true)
{
//循环接收客户请求
Socket s=ss.accept();
//为客户开启一个线程
new Thread(new UserThread(s)).start();
} }
}
04 浏览器客户端-自定义服务端
演示客户端和服务端
客户端:浏览器
服务器:自定义
import java.net.*;
import java.io.*;
class ServerDemo
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(11000);
Socket s=ss.accept();
System.out.println(s.getInetAddress().getHostAddress());
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("<font color='blue' size=8>客户端你好!</font>");
s.close();
ss.close();
}
}
不过用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.
文件内容:
<html>
<body>
<h1>这是我的主页</h1>
<font size=8 color=blue>欢迎登陆</font>
<div>
锦瑟无端五十弦,</br>
一弦一柱思华年。</br>
庄生晓梦迷蝴蝶,</br>
望帝春心托杜鹃。</br>
沧海月明珠有泪。</br>
蓝田日暖玉生烟,</br>
此情可待成追忆。</br>
只是当时已惘然。</br> </div>
</body>
</html>
在浏览器中输入http://127.0.0.1:8080/myWeb/Demo.html,显示如下:
网络编程3--毕向东java基础教程视频学习笔记的更多相关文章
- 多线程--毕向东java基础教程视频学习笔记
目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...
- 网络编程1--毕向东java基础教程视频学习笔记
目录: 01 网络编程概述1 02 网络编程概述2 03网络编程 网络模型 04网络编程 IP地址 05网络编程 TCP和UDP 06网络编程 Socket 07网络编程 UDP发送端 01 网络编程 ...
- 网络编程2--毕向东java基础教程视频学习笔记
Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...
- 网络编程4--毕向东java基础教程视频学习笔记
Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...
- IO流05--毕向东JAVA基础教程视频学习笔记
Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...
- IO流04--毕向东JAVA基础教程视频学习笔记
Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...
- IO流01--毕向东JAVA基础教程视频学习笔记
提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...
- 集合3--毕向东java基础教程视频学习笔记
Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...
- 集合2--毕向东java基础教程视频学习笔记
Day14 08 LinkedList09 LinkedList练习10 ArrayList练习11 ArrayList练习2 12 HashSet13 HashSet存储自定义对象14 HashSe ...
随机推荐
- RabbitMQ框架学写笔记-20161130
- 【Java每日一题】20161111
package Nov2016; import java.io.Serializable; public class Ques1111 implements Serializable{ private ...
- 【Java每日一题】20161021
20161020问题解析请点击今日问题下方的"[Java每日一题]20161021"查看 package Oct2016; public class Ques1021 { publ ...
- 设置surfaceView的背景为透明
1. [代码][Java]代码 下面三句话加上就好了. surfaceView.setZOrderOnTop(true); surfaceView.setEGLConfigChooser(, , ...
- marquee标签滚动效果
<marquee></marquee>标签,默认从最右侧往左滚动: direction:设置滚动的方向: height:设置标签高度, width:设置标签宽度: behavi ...
- 最小生成二叉树-prim算法
1.prim算法:一种计算生成最小生成树的方法,它的每一步都会为一棵生长中的树添加一条边. 2.时间复杂度:
- 第 1 章 Bootstrap 介绍
学习要点:1.Bootstrap 概述2.Bootstrap 特点3.Bootstrap 结构4.创建第一个页面5.学习的各项准备 主讲教师:李炎恢 本节课我们主要了解一下 Boostrap 历史.特 ...
- 说说web 2.0生态圈的那些事
先来说一道面试题吧,“说一下,web 2.0 和web 1.0的区别?” 官方的解释是这样的: Web1.0 的主要特点在于用户通过浏览器获取信息,Web2.0 则更注重用户的交互作用,用户既是网站内 ...
- 实用的Scala泛函编程
既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台P ...
- 《高可用MySQL》2 – 单机版MySQL主从配置
这里搭建的主从是最简单的单一主从复制(即一个Master和一个slave,没有任何的热机备份和多slave),该主从结构的基本拓扑图如下所示: 建立基本的主从复制可以总结为以下三个基本步骤: 配置ma ...