扫码关注微信公众号,获取最新资源


经历了一天的工作。我又来更新啦。。。白天手欠,把上一个给删了。明天重写吧。。

废话不多说。我们先去Unity里创建一个能够输入username和password的登录窗体

然后给登录button加入代码

using UnityEngine;
using System.Collections;
using UnityEngine.UI; public class Login : MonoBehaviour
{
//持实username和password这两个输入框的对象
public InputField Username;
public InputField Password; //定义訪问JSP登录表单的get方式訪问路径
private string Url = "http://192.168.31.38:8080/MyUnityToJSPTest/StringContentServlet.do? "; //当button被点击
public void LoginButtonOnClick()
{
//向server传递的參数
string parameter = "";
parameter += "UserName=" + Username.text + "&";
parameter += "PassWord=" + Password.text; //開始传递
StartCoroutine(login(Url + parameter)); } //訪问JSPserver
IEnumerator login(string path)
{
WWW www = new WWW(path);
yield return www;
//假设错误发生。打印这个错误
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//假设server返回的是true
if (www.text.Equals("true"))
{
//登陆成功
print("Login Success!!!");
Application.LoadLevel("UpLoadFile");
}
else
{
//否则登录失败
print("Login Fail...");
}
}
} }

将两个面板拖拽给脚本生成实例

然后我们去JSPserver接收Unity传过来的值

JSP的代码我就不复制过来了,自己打一遍。印象深刻,最好是看懂了背着打。这样才有意义。

然后回到Unity。注冊button点击事件。

。。事实上是我自己忘了——-

接着就是执行Unity。

别忘了执行之前把JSP的server打开。否则提交只是去会报错的。

点击登录后。去JSPserver看看控制台。是否已经把我们的username和password输出出来了呢?

我的代码省略的那部分大家能够进行什么注冊啊,验证数据库什么的都能够,我个人感觉比Socket实用一些。

好了,注冊和登录什么的都是传递字符串,这个我们已经做完了,事实上并没有什么难点,那么我们继续回到Unity,開始上传文件的分享。

刚才点击登录button后。是否成功进入了上传文件的场景呢?

以下我们来编辑一下上传的场景

编辑模式下,给上传文件的button加入代码。注冊点击事件

using System;
using System.IO;
using UnityEngine;
using System.Collections; public class UpFile : MonoBehaviour
{
//持有三个状态面板的对象
public GameObject upFileing;
public GameObject successPanel;
public GameObject failPanel; //定义訪问JSP登录表单的post方式訪问路径
private string Url = "http://192.168.31.39:8080/MyUnityToJSPTest/ByteFileContentServlet.do"; //点击上传button
public void OnUpFileButtonClick()
{
//设置上传文件里面板为显示状态
upFileing.SetActive(true);
//上传本地文件
StartCoroutine(UpFileToJSP(Url, Application.dataPath + "\\midi.txt"));
} //訪问JSPserver
private IEnumerator UpFileToJSP(string url, string filePath)
{
WWWForm form=new WWWForm();
form.AddBinaryData("midiFile",FileContent(filePath),"midi.txt"); WWW upLoad=new WWW(url,form);
yield return upLoad;
//假设失败
if (!string.IsNullOrEmpty(upLoad.error)||upLoad.text.Equals("false"))
{
//在控制台输出错误信息
print(upLoad.error);
//将失败面板显示 上传中不显示
upFileing.SetActive(false);
failPanel.SetActive(true);
}
else
{
//假设成功
print("Finished Uploading Screenshot");
//将成功面板显示 上传中不显示
upFileing.SetActive(false);
successPanel.SetActive(true);
} } //将文件转换为字节流
private byte[] FileContent(string filePath)
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
try
{
byte[] buffur = new byte[fs.Length];
fs.Read(buffur, 0, (int)fs.Length); return buffur;
}
catch (Exception ex)
{
Debug.Log(ex.Message);
return null;
}
finally
{
if (fs != null)
{ //关闭资源
fs.Close();
}
}
}
}

创建三个面板





将三个面板拖拽给脚本后,打开JSP中的ByteFileContentServlet.java

编写代码

package com.Aries.Servlets;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Writer; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.Aries.Tools.Tool; public class ByteFileContentServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
{
//向控制台输出文件的内容长度
System.out.println(request.getContentLength());
//假设有内容
if (request.getContentLength() > 297) { //==================開始处理文件=================== //接收上传文件内容中暂时文件的文件名称
String tempFileName = new String("tempFileName.txt");
//tempfile 对象指向暂时文件
File tempFile = new File(request.getRealPath("/")+tempFileName);
//outputfile 文件输出流指向这个暂时文件
FileOutputStream outputStream = new FileOutputStream(tempFile);
//得到客服端提交的全部数据
InputStream fileSourcel = request.getInputStream();
//将得到的客服端数据写入暂时文件
byte b[] = new byte[1000];
int n ;
while ((n=fileSourcel.read(b))!=-1){
outputStream.write(b,0,n);
} //关闭输出流和输入流
outputStream.close();
fileSourcel.close(); //randomFile对象指向暂时文件
RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
//读取暂时文件的前三行数据
randomFile.readLine();
randomFile.readLine();
randomFile.readLine();
//读取暂时文件的第四行数据,这行数据中包括了文件的路径和文件名称
String filePath = randomFile.readLine();
//得到文件名称
System.out.println(filePath);
int position = filePath.lastIndexOf("filename");
String filename =Tool.codeString(filePath.substring(position+10,filePath.length()-1));
//又一次定位读取文件指针到文件头
randomFile.seek(0);
//得到第四行回车符的位置,这是上传文件数据的開始位置
long forthEnterPosition = 0;
int forth = 1;
while((n=randomFile.readByte())!=-1&&(forth<=4)){
if(n=='\n'){
forthEnterPosition = randomFile.getFilePointer();
forth++;
}
} //生成上传文件的文件夹
File fileupLoad = new File(request.getRealPath("/"),"upLoad");
fileupLoad.mkdir();
//saveFile 对象指向要保存的文件
File saveFile = new File(request.getRealPath("/")+"\\upLoad",filename);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
//找到上传文件数据的结束位置。即倒数第四行
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while((endPosition>=0)&&(j<=4)){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte()=='\n'){
j++;
}
} //从上传文件数据的開始位置到结束位置。把数据写入到要保存的文件里
randomFile.seek(forthEnterPosition);
long startPoint = randomFile.getFilePointer();
while(startPoint<endPosition){
randomAccessFile.write(randomFile.readByte());
startPoint = randomFile.getFilePointer();
}
//关闭文件输入、输出
randomAccessFile.close();
randomFile.close();
tempFile.delete(); //==================处理文件结束=================== //向控制台输出文件上传成功
System.out.println("File upload success!");
}
else
{
//否则显示失败,
System.out.println("No file!"); //向Unity返回一个Fasle字符串
Writer out=response.getWriter();
out.write("false");
out.close();
}
} }

在写这个代码之前,我们要新建一个包

com.Aries.Tools

在里面新建一个工具类Tool.java

代码例如以下

注:这里包括以下要用到的处理工具,我就一起附上来了

package com.Aries.Tools;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException; public class Tool { /** 文件字节流 */
public static byte[] getBytes(String filePath) {
byte[] buffer = null;
try {
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
} /** 处理中文字符串的函数 */
public static String codeString(String str) {
String s = str;
try {
byte[] temp = s.getBytes("UTF-8");
s = new String(temp);
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
} }

做完这些后。开启我们的server。然后开启Unity,在确保上传文件在Unity的Assets文件夹下的时候。我们就执行Unity。点击上传文件button。

能够看到Unity的控制台是这种

然后是JSP的控制台

这些都证明不了什么,我们要看到文件才证明我们上传成功

点击部署文件的那个button。以下有一个Browse

点开之后会看到我们server上的文件夹

那么就能够看到我们用代码生成的upload的文件夹可里面的midi.txt文件了

好了。

Unity向server上传文件已经成功,以下我们还差最后一步,也就是我在网上找不到的东西,用Unity请求server,server给Unity反馈一个文件,那么我们如今回到unity。编辑上传成功那个面板。当我们上传文件成功后弹出的那个面板下方会有播放的那个button。编辑这个button,加入点击事件。然后挂上脚本。

代码例如以下:

using System.IO;
using System.Xml.Serialization;
using UnityEngine;
using System.Collections; public class DownLoadFile : MonoBehaviour
{
//定义訪问JSP登录表单的get方式訪问路径
private string url = "http://192.168.31.39:8080/MyUnityToJSPTest/DownloadMidi.do?Download=Midi"; //当button点击
public void OnPlayButtonClick()
{
//向server传递指令
StartCoroutine(UpFileToJSP(url));
} //訪问JSPserver
private IEnumerator UpFileToJSP(string url)
{
WWW downLoad = new WWW(url);
yield return downLoad;
//假设失败
if (!string.IsNullOrEmpty(downLoad.error) || downLoad.text.Equals("false"))
{
//在控制台输出错误信息
print(downLoad.error);
}
else
{
//假设成功
//定义一个字节数组保存文件
byte[] myByte = downLoad.bytes;
//新建一个文件接收字节流
FileStream fs = new FileStream(Application.dataPath + "/midi.mid",FileMode.Create, FileAccess.Write, FileShare.None);
//開始转换
fs.Write(myByte,0,myByte.Length);
//刷新流
fs.Flush();
//关闭流
fs.Close();
//子啊控制台输出完毕信息
print("Finished Uploading Screenshot");
}
}
}

在这个脚本之前,我们应该先到server的index.jsp加入一个表单。再去servlets包下注冊一个Servlet供我们请求server所用。操作我就不具体介绍了。上一个文章里面有介绍,,一会我在以下附个链接。那么我直接上JSP上这个Servlet的代码和index.jsp的表单怎样加入。

Servlet:DownloadMidi.java

package com.Aries.Servlets;

import java.io.IOException;

import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.Aries.Tools.Tool; public class DownloadMidi extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //假设訪问參数符合条件
if(request.getParameter("Download").equals("Midi"))
{
//获取输出流
OutputStream out=response.getOutputStream();
//把文件变成byte字节流传入输出流
out.write(Tool.getBytes(request.getRealPath("/")+"\\upLoad\\midi.mid"));
//刷新流
out.flush();
//关闭流
out.close();
//向控制台提示成功
System.out.println("success!");
} } }

index.jsp

unity要下载server上的文件,那我们要给server上放一个我们准备上传的文件,就是这个midi.mid,这是个音频。

然后我们就部署一下project

开启server,正常启动后。打开Unity,開始执行。。。

点击那个小播放button后,我们能够去JSP的控制台查看

然后是Unity的控制台,等控制台出现成功以后,等一小会Unity引擎就会把文件解析并显示出来。

然后我们去Unity的project文件夹下播放这个midi文件,看看能否正常播放呢。

反正我的是正常播放了。

好了,关于Unity与JSP的通信我就分享到这里吧。再说一次我不是什么大神,仅仅是喜欢研究与学习,如有不足之处,欢迎指正,谢谢。

联系方式

 查看Aries的个人资料

QQ:531193915

E_Mail:15210411296@163.com

转载请注明出处。谢谢 。

本文永久链接:http://blog.csdn.net/aries_h/article/details/50971981

补充一下。我把project文件整理了一下。

以下是地址:

http://pan.baidu.com/s/1bTLkbs

password:

aym5

Unity3D与JSP TomCatserver传递数据和文件( 二 ) Unity3D向java传输表单的更多相关文章

  1. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  2. Java模拟表单POST上传文件

    JAVA模拟表单POST上传文件 import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.io ...

  3. jsp文件放在webcontent子目录下提交表单给servlet报404错误解决办法

    新版的web项目已经不需要配置web.xml了,并且eclipse neon版本里面新建web项目时候,默认不会生成web.xml文件.我们也不需要手动添加该文件,因为内部为我们提供了最新的处理方式, ...

  4. HTML或者JSP页面--执行完某事件后刷新页面,重置表单,清空数据

    在提交表单或者执行某个事件之后,如果需要重置表单(即清空表单里的数据) 可以执行下面代码来完成 方式一: self.location.href="userController.do?goAd ...

  5. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. js文件上传原理(form表单 ,FormData + XHR2 + FileReader + canvas)

    目录 form表单上传 FormData + XHR2 + FileReader + canvas 无刷新本地预览压缩上传实例 目前实现上传的方式 浏览器小于等于IE9(低版本浏览器)使用下面的方式实 ...

  7. Spring MVC 文件上传、Restful、表单校验框架

    目录 文件上传 Restful Restful 简介 Rest 行为常用约定方式 Restful开发入门 表单校验框架 表单校验框架介绍 快速入门 多规则校验 嵌套校验 分组校验 综合案例 实用校验范 ...

  8. Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交

    今天博客中就来聊一下Perfect框架的静态文件的添加与访问,路由的配置以及表单的提交.虽然官网上有聊静态文件的访问的部分,但是在使用Perfect框架来访问静态文件时还是有些点需要注意的,这些关键点 ...

  9. 框架学习之Struts2(二)---基本配置和封装表单数据

    一.结果页面配置 1.局部结果页面配置 <!-- 局部结果页面配置--> <package name = "demo" extends = "strut ...

随机推荐

  1. hdu4405Aeroplane chess(概率与期望dp)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. Winform 异步调用2 时间

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. 【Python】循环语句

    while循环 当条件成立时,循环体的内容可以一直执行,但是避免死循环,需要有一个跳出循环的条件才行. for循环 遍历任何序列(列表和字符串)中的每一个元素 >>> a = [&q ...

  4. im4java+GraphicsMagick

    package com.jeeplus.modules.isp.utils; import java.io.ByteArrayInputStream; import java.io.ByteArray ...

  5. Cracking the Coding Interview 8.5

    Implement an algorithm to print all valid combinations of n-pairs of parentheses #include<stdio.h ...

  6. Python迭代器(斐波拉切数列实例)

    将一个容器通过iter()函数处理后,就变成了迭代器.迭代器有2个魔法方法__iter__.__next__,一个迭代器必须实现__iter__,这个方法实际上是返回迭代器本身(return self ...

  7. Java基础学习(二)——对象

    类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法): 对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象. 对象=实例 对象 ...

  8. java编程基础篇-------> 从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度。如果是 12 月、1 月、2 月,就属于冬季。

    从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度.如果是 12月.1 月.2 月,就属于冬季:如果是 3 月.4 月.5 月,就属于春季:如果是 6 月.7 月.8 月,就属于夏季: ...

  9. php加密方法有哪些

    1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串. raw_output -- 如果可 ...

  10. C# 连接 access2010数据库

    //定义一个新的OleDb连接 System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); // ...