加入收藏 | 设为首页 |

美丽的尴尬-Unity3D与Java后台TomCat服务器传递数据和文件(2)传递文件

海外新闻 时间: 浏览:329 次

原章创立与2016-03-26 作者 Aries.H


废话不多说,咱们先去Unity里创立一个能够输入用户名和暗码的登录窗口

然后给登录按钮增加代码

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Login : MonoBehaviour
{
//持有用户名和暗码这两个输入框的目标
public InputField Username;
public InputField Password;
//界说拜访JSP登录表单的get方法拜访途径
private string Url = "http://192.168.31.38:8080/MyUnityToJSPTest/StringContentServlet.do?";
//当按钮被点击
public void LoginButtonOnClick()
{
//向服务器传递的参数
string parameter = "";
parameter += "UserName=" + Username.text + "&";
pa道德的火焰rameter += "PassWord=" + Password.text;

//开端传递
StartCoroutine(login(Url + parameter));
}
//拜访JSP服务器
IEnumerator login(string path)
{
WWW www = new WWW(path);
yield return www;
//假如发作过错,打印这个过错
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//假如服务器回来的是true
if (www.text.Equals("true"))
{
//登陆成功
print("Login Success!!!");
Application.LoadLevel("UpLoadFile");
}
else
{
//不然登录失利
print("Login Fail...");
}
}
}
}

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

然后咱们去JSP服务器接纳Unity传过来的值

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

然后回到Unity,注册按钮点击事情。。。其实是我自己忘了-------

接着便是运转Unity。

别忘了运转之前把JSP的服务器翻开,不然提交不过去会报错的。

点击登录后,去JSP服务器看看控制台,是否现已把咱们的用户名和暗码输出出来了呢?

我的代码省掉的那部分咱们能够进行什么注册啊,验证数据库什么的都能够,我个人感觉比Socket有用一些。

好了,注册和登录什么的都是传递字符串,这个咱们现已做完了,其实并没有什么难点,那么咱们持续回到Unity,开端上传文件的共享。

方才点击登录按钮后,是否成功进入了上传文件的场景呢?

下面咱们来修改一下上传的场景

修改形式下,给上传文件的按钮增加代码,注册点击事情

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";
//点击上传按钮
public void OnUpFileButtonClick()
{
//设置上传文件中面板为显现状况
upFileing.SetActive(true);
//上传本地文件
StartCoroutine(UpFileToJSP(Url, Application.dataPath + "\\midi.txt"));
}
//拜访JSP服务器
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
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.Byte美丽的尴尬-Unity3D与Java后台TomCat服务器传递数据和文件(2)传递文件ArrayOutputStream;
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[] buf美丽的尴尬-Unity3D与Java后台TomCat服务器传递数据和文件(2)传递文件fer = 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;
}
}
}

做完这些后,敞开咱们的服务器。然后敞开Unity,在保证上传文件在Unity的Assets目录下的时分,咱们就运转Unity,点击上传文件按钮。

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

然后是JSP的控制台

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

点击布置文件的那个按钮,下面有一个Browse

点开之后会看到咱们服务器上的文件夹

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

好了。Unity向服务器上传文件现已成功,下面咱们还差最终一步,也便是我在网上找不到的东西,用Unity恳求服务器,服务器给Unity反应一个文件,那么咱们现在回到unity,修改上传成功那个面板,当咱们上传文件成功后弹出的那个面板下方会有播映的那个按钮。修改这个按钮,增加点击事情,然后挂上脚本。

代码如下:

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";
//当按钮点击
public void OnPlayButtonClick()
{
//向服务器传递指令
StartCoroutine(UpFileToJSP(url));
}
//拜访JSP服务器
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");
}
}
}

在这个脚本之前,咱们应该先到服务器的index.jsp增加一个表单,再去servlets包下注册一个Servlet供咱们恳求服务器所用。操作我就不具体介绍了,上一个文章里边有介绍,,一会我在下面附个链接。那么我直接上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要下载服务器上的文件,那咱们要给服务器上放一个咱们预备上传的文件,便是这个midi.mid,这是个音频。

然后咱们就布置一下工程

敞开服务器,正常发动后,翻开Unity,开端运转。。。

点击那个小播映按钮后,咱们能够去JSP的控制台检查

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

然后咱们去Unity的工程目录下播映这个midi文件,看看是否能正常播映呢。

横竖我的是正常播映了。

好了,关于Unity与JSP的通讯我就共享到这儿吧,再说一次我不是什么大神,仅仅喜爱研讨与学习,如有不足之处,欢迎纠正,谢谢!

转载请注明出处,谢谢 。

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

弥补一下。我把工程文件整理了一下。

下面是地址:

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

暗码:

aym5


2019 - 4 - 24 更新

最近有好多人找我说上传图片不可,发现图片格局不对。

在这儿我贴一下上传图片代码哈。。。

IEnumerator uploadImage(Sprite image)
{
dispatcher.Dispatch(IOCMediator_MoneyMoreEvent.ChangeLoadingPanel, true);
byte[] bs = image.texture.EncodeToJPG(); //将该texture转成jpg格局图片,回来byte[]数据
WWWForm form = new WWWForm();
form.AddBinaryData("picture", bs, "image.jpg", "image/jpg");
//form.AddBinaryData("p美丽的尴尬-Unity3D与Java后台TomCat服务器传递数据和文件(2)传递文件icture", FileContent(imagePath), "image.png", "image/png");
UnityWebRequest uwr = UnityWebRequest.Post(" (你的恳求地址) ", form);
uwr.SetRequestHeader("enctype", "multipart/form-data");
yield return uwr.Send();
if (uwr.isDone && uwr.error == null)
{
}
else if (uwr.error != null)
{
Debug.Log(uwr.error);
}
uwr.Dispose();
}