废话不多说,我们先去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 + \公众&\"大众; parameter += \"大众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的字符串怎么分割Unity3D与Java后台TomCat办事器传递数据和文件2传递文件 React

然后我们去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<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;}}}

做完这些后,开启我们的做事器。
然后开启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(\公众picture\"大众, 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(); }