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. 关于jq ajax封装以及error的报错参数

    jq的ajax完整版本 $.ajax({ url: "GetCityByPId.ashx", data: {pId:pid}, dataType: "JSON" ...

  2. 检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    Resvr32 .net中引用控件的名称 如果注册成功,问题不在出现 但是如果是在x64位的系统中,即使控件注册成功,错误依照提示,是因为大多数第三方写的COM控件,只支持32位的系统, 在VS中找到 ...

  3. C# 重载的几种实现

    算法重用是非常普遍的需求,在C#中可以使用如下手段实现,非常简单,自己记录一下,方便查询. 以一个小功能为例来说明一下:打印1-5这5个数,和A-E这5个字符. 重载方式 static void Ma ...

  4. iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )

    iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...

  5. 【Java每日一题】20161017

    20161014问题解析请点击今日问题下方的"[Java每日一题]20161017"查看 package Oct2016; import java.util.ArrayList; ...

  6. springmvc(2)Controller源码简单解析

    前面简单的分析了一下DispatcherServlet,接下来分析一下Controller,在web的MVC中,Controller就是其中的C,启动的一些页面逻辑处理,页面映射的功能: 首先看看超类 ...

  7. Global和Globals

    $a= '1234'; $a = 'abc'; $GLOBAS['b']='123'; function showVar(){ echo $a;//什么也输不出来 echo $b;//123(全局变量 ...

  8. C++/C互相调用

    C调用C++: 在C++程序中使用extern "C"{}来明确要求C++编译器不要对被调用的C++函数进行换名处理, 当然,这会导致函数无法重载 C++调用C: 在C++程序中使 ...

  9. 接口测试之webservice

    什么是Webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配 ...

  10. java枚举与.net中的枚举区别

    通过一段时间的项目实践,发现java中的枚举与.net中的枚举有很大的差别,初期造成了我对java中的枚举一些错误理解及部分有缺陷的应用,其实追其原因还是因为我会习惯性的认为java的枚举在作用以及定 ...