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基础教程视频学习笔记的更多相关文章

  1. 多线程--毕向东java基础教程视频学习笔记

    目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...

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

    目录: 01 网络编程概述1 02 网络编程概述2 03网络编程 网络模型 04网络编程 IP地址 05网络编程 TCP和UDP 06网络编程 Socket 07网络编程 UDP发送端 01 网络编程 ...

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

    Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...

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

    Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...

  5. IO流05--毕向东JAVA基础教程视频学习笔记

    Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...

  6. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...

  7. IO流01--毕向东JAVA基础教程视频学习笔记

    提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...

  8. 集合3--毕向东java基础教程视频学习笔记

    Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...

  9. 集合2--毕向东java基础教程视频学习笔记

    Day14 08 LinkedList09 LinkedList练习10 ArrayList练习11 ArrayList练习2 12 HashSet13 HashSet存储自定义对象14 HashSe ...

随机推荐

  1. jQuery使用经验建议

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以复制并粘贴大部分的代码结构,只要专注最主要的逻辑代码就行了. 使用相同的设计模式和架构也 ...

  2. ASP.NET里的Session详细解释

    Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器建立连 ...

  3. Oracle数据库,序列、索引、视图

    一.序列:生成自动增长(或减少)的整数值 Sequences中新建 调取: th_test.nextval 获取下一个值 th_test. currval获取当前值 二.视图:在物理表的基础上定义的虚 ...

  4. genymotion和eclipse连接问题,一直出错

    前两天重装系统,但是在运行android代码的时候遇到了这样的问题 The connection to adb is down,and a server error has occured. You ...

  5. sso demo mysql ( cas )

    基本配置 参考之前得随笔  http://www.cnblogs.com/rocky-fang/p/5354947.html 1. tomcat-cas 修改配置 1.1 在D:\test\sso\t ...

  6. 软件项目发展历史<人月神话>这本书好

    几乎是计算机软件开发的发展历史     人月神话,增加人手并不一定能提高开发速度. 原因在于,有些任务是无法分解的,存在先后顺序.无法同步进行. 增加人手,增加的是沟通成本,相互牵制.可以分解的任务就 ...

  7. C#语言的基础

    一.C#的引入 01..net和C#的区别 1)大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务. 2).net ...

  8. github上比较全的知识

    https://github.com/hawx1993/github-FE-project

  9. jquery原型方法map的使用和源码分析

    原型方法map跟each类似调用的是同名静态方法,只不过返回来的数据必须经过另一个原型方法pushStack方法处理之后才返回,源码如下: map: function( callback ) { re ...

  10. 教你写能被舒服舒服又舒服地调用的iOS库

    目录 前言 脑洞开一开 分析 整容 结语 前言 2014年过的那么快,过年又那么块,2015年又是飞快地节奏,真尼玛感觉上帝是不是无聊使用了变速外挂开启了加速模式~到现在博主都无法接受已经上班的事实… ...