Unity3D读取Socket的二进制图片
来源:互联网 发布:ps淘宝图片制作教程 编辑:程序博客网 时间:2024/04/27 20:14
服务端:C#的Winfrom开发服务器,数据库是Accessusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Data.OleDb;using System.IO;using System.NET;using System.Net.Sockets;using System.Threading;namespace WindowsForms_Server{ public partial class Form1 : Form { OleDbConnection conn; //Jet OLEDB:Database Password= OleDbCommand cmd; OleDbDataReader dr; DataTable dt; string str = null; public Form1() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; //数据库的地址 conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\DataSQL\\DB.mdb"); //Jet OLEDB:Database Password= //conn.Open(); //SaveImage("C:\\Users\\123\\Desktop\\timg.jpg",conn); // 两个 \\ 代表一个 / 字符串 (以下两种也都可以用) //SaveImage(@"C:\Users\123\Desktop\timg.jpg", conn); //SaveImage("C:/Users/123/Desktop/timg.jpg", conn); } private void button1_Click(object sender, EventArgs e) { conn.Open(); cmd = conn.CreateCommand(); cmd.CommandText = "select * from user_DB"; //表名 dr = cmd.ExecuteReader(); dt = new DataTable(); //文件名 if (dr.HasRows) { for (int i = 0; i < dr.FieldCount; i++) { dt.Columns.Add(dr.GetName(i)); } dt.Rows.Clear(); } while (dr.Read()) { DataRow row = dt.NewRow(); for (int i = 0; i < dr.FieldCount; i++) { row[i] = dr[i]; } dt.Rows.Add(row); } cmd.Dispose(); conn.Close(); dataGridView1.DataSource = dt; } private void button2_Click(object sender, EventArgs e) { conn.Open(); cmd = conn.CreateCommand(); cmd.CommandText = "select * from user_DB where ID=2"; dr = cmd.ExecuteReader(); dt = new DataTable(); if (dr.HasRows) { for (int i = 0; i < dr.FieldCount; i++) { dt.Columns.Add(dr.GetName(i)); } dt.Rows.Clear(); } while (dr.Read()) { DataRow row = dt.NewRow(); for (int i = 0; i < dr.FieldCount; i++) { row[i] = dr[i]; } dt.Rows.Add(row); } cmd.Dispose(); conn.Close(); dataGridView1.DataSource = dt; } private void button3_Click(object sender, EventArgs e) //读取图片 { byte[] buff = null; Image image = null; conn.Open(); cmd = conn.CreateCommand(); cmd.CommandText = "select img from user_DB where ID=5"; OleDbParameter p = new OleDbParameter(); p.Value = buff; cmd.Parameters.Add(p); cmd.ExecuteNonQuery(); dr = cmd.ExecuteReader(); dr.Read(); buff = (byte[])dr[0]; //while (dr.Read()) //{ // buff = (byte[])dr.GetValue(0); //} dr.Close(); cmd.Dispose(); conn.Close(); MemoryStream ms = new MemoryStream(buff); //ms.Position = 0; image = System.Drawing.Image.FromStream(ms); //Image image = Image.FromStream(ms); Bitmap bmpt = new Bitmap(image); pictureBox1.Image = bmpt; } private void SaveImage(string filepath, OleDbConnection con) //将图片以长二进制的形式存入数据库(只有如此才能读取图片 { con.Open(); FileStream fs = new FileStream(filepath, FileMode.Open); BinaryReader br = new BinaryReader(fs); byte[] buff = br.ReadBytes((int)fs.Length); OleDbCommand com = new OleDbCommand("update user_DB set img=@pic where ID=5", con); com.Parameters.AddWithValue("@pic", buff); com.ExecuteNonQuery(); con.Close(); com.Dispose(); br.Close(); fs.Close(); } private void button4_Click(object sender, EventArgs e) //浏览文件 { OpenFileDialog ofd = new OpenFileDialog(); ofd.InitialDirectory = "D:\\"; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtSelectFile.Text = ofd.FileName; //这里显示的文件路径会自动转义成 \\双斜杠 } if (txtSelectFile.Text == "" || txtSelectFile.Text == null) { str = null; } else { str = txtSelectFile.Text; } ofd.FileName = null; // 置空,不然点击此处时不选定,取消的话会报错 ofd = null; // 置空,不然点击此处时不选定,取消的话会报错 } private void button5_Click(object sender, EventArgs e) //上传保存文件 { if (str != null) { SaveImage(str, conn); txtSelectFile.Text = null; str = null; } } Thread threadWatch = null; // 负责监听客户端连接请求的 线程; Socket socketWatch = null; Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); //存储客户端对象池 Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>(); private void button6_Click(object sender, EventArgs e) { socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ad = IPAddress.Parse("127.0.0.1"); IPEndPoint end = new IPEndPoint(ad, 8080); try { socketWatch.Bind(end); } catch (SocketException se) { MessageBox.Show("异常:" + se.Message); return; } socketWatch.Listen(10); //创建负责监听的线程; threadWatch = new Thread(WatchConnecting); threadWatch.IsBackground = true; threadWatch.Start(); textBox1.Text = "服务器启动成功!" + "\r\n"; } void WatchConnecting() { while (true) // 持续不断的监听客户端的连接请求; { // 开始监听客户端连接请求,Accept方法会阻断当前的线程; Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字; lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString()); // 将与客户端连接的 套接字 对象添加到集合中; dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection); Thread thr = new Thread(RecMsg); thr.IsBackground = true; thr.Start(sokConnection); textBox1.Text = "客户端连接成功!" + "\r\n"; dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); // 将新建的线程 添加 到线程的集合中去。 } } void RecMsg(object sokConnectionparn) { Socket sokClient = sokConnectionparn as Socket; while (true) { // 定义一个2M的缓存区; byte[] arrMsgRec = new byte[1024 * 1024 * 2]; // 将接受到的数据存入到输入 arrMsgRec中; int length = -1; try { length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; } catch (SocketException se) { textBox1.Text = "异常:" + se.Message; // 从 通信套接字 集合中删除被中断连接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString()); // 从通信线程集合中删除被中断连接的通信线程对象; dictThread.Remove(sokClient.RemoteEndPoint.ToString()); // 从列表中移除被中断的连接IP lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString()); break; } catch (Exception e) { textBox1.Text = "异常:" + e.Message; // 从 通信套接字 集合中删除被中断连接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString()); // 从通信线程集合中删除被中断连接的通信线程对象; dictThread.Remove(sokClient.RemoteEndPoint.ToString()); // 从列表中移除被中断的连接IP lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString()); break; } if (arrMsgRec[0] == 0) // 表示接收到的是数据; { string strMsg = System.Text.Encoding.Default.GetString(arrMsgRec, 1, length - 1);// 将接受到的字节数据转化成字符串; } if (arrMsgRec[0] == 1) // 表示接收到的是文件; { SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) {// 在上边的 sfd.ShowDialog() 的括号里边一定要加上 this 否则就不会弹出 另存为 的对话框,而弹出的是本类的其他窗口,,这个一定要注意!!!【解释:加了this的sfd.ShowDialog(this),“另存为”窗口的指针才能被SaveFileDialog的对象调用,若不加thisSaveFileDialog 的对象调用的是本类的其他窗口了,当然不弹出“另存为”窗口。】 string fileSavePath = sfd.FileName;// 获得文件保存的路径; // 创建文件流,然后根据路径创建文件; using (FileStream fs = new FileStream(fileSavePath, FileMode.Create)) { fs.Write(arrMsgRec, 1, length - 1); //ShowMsg("文件保存成功:" + fileSavePath); } } } } } private void button7_Click(object sender, EventArgs e) { byte[] buff = new byte[1024 * 1024 * 2]; conn.Open(); cmd = conn.CreateCommand(); cmd.CommandText = "select img from user_DB where ID=5"; OleDbParameter p = new OleDbParameter(); p.Value = buff; cmd.Parameters.Add(p); cmd.ExecuteNonQuery(); dr = cmd.ExecuteReader(); dr.Read(); buff = (byte[])dr[0]; byte[] buff1 = new byte[buff.Length + 1]; buff1[0] = 1; Buffer.BlockCopy(buff, 0, buff1, 1, buff.Length); dr.Close(); cmd.Dispose(); conn.Close(); string strKey = ""; strKey = lbOnline.Text.Trim(); if (string.IsNullOrEmpty(strKey)) // 判断是不是选择了发送的对象; { MessageBox.Show("请选择你要发送的好友!!!"); } else { dict[strKey].Send(buff1);// 解决了 sokConnection是局部变量,不能再本函数中引用的问题; textBox1.Text = "发送消息成功!" + "\r\n"; } //string strMsg = "服务器" + "\r\n" + " -->" + "\r\n"; //byte[] arrMsg = System.Text.Encoding.Default.GetBytes(strMsg); // 将要发送的字符串转换成Utf-8字节数组; //byte[] arrSendMsg = new byte[arrMsg.Length + 1]; //arrSendMsg[0] = 0; // 表示发送的是消息数据 //Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); //string strKey = ""; //strKey = lbOnline.Text.Trim(); //if (string.IsNullOrEmpty(strKey)) // 判断是不是选择了发送的对象; //{ // MessageBox.Show("请选择你要发送的好友!!!"); //} //else //{ // dict[strKey].Send(arrSendMsg);// 解决了 sokConnection是局部变量,不能再本函数中引用的问题; // textBox1.Text = "发送消息成功!" + "\r\n"; //} } }}Unity3D客户端:using UnityEngine;using System.Collections;using System;using System.Collections.Generic;using System.ComponentModel;using System.Text;using System.Net.Sockets;using System.IO;using UnityEngine.UI;using System.Net;using System.Threading;using System.Linq;public class KeHuDuan : MonoBehaviour{ [SerializeField] private Image image0; Socket socketClient = null; Thread threadClient = null; void Start() { IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint endPoint = new IPEndPoint(ip, 8080); socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { Debug.Log("与服务器连接中......"); socketClient.Connect(endPoint); } catch(SocketException e) { Debug.Log(e.Message); return; } Debug.Log("与服务器连接成功!"); threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); } byte[] buff = null; private bool chuan = false; void Update() { if (chuan) { Texture2D texture = new Texture2D(100, 100); texture.LoadImage(buff); Sprite spr = null; spr = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); image0.sprite = spr; Debug.Log(buff.Length); chuan = false; } } void RecMsg() { while (true) { byte[] arrMsg = new byte[1024 * 1024 * 2]; int length = -1; try { length = socketClient.Receive(arrMsg);//接收到数据,并返回长度 } catch (SocketException e) { Debug.Log(e.Message); return; } if (arrMsg[0] == 0)//表示接收到的是消息数据 { string strMsg = System.Text.Encoding.Default.GetString(arrMsg, 1, length - 1);// Debug.Log("从服务端接收到的数据:" + strMsg); } if (arrMsg[0] == 1) //表示接收到的是文件数据 { try { buff = new byte[length -1]; Buffer.BlockCopy(arrMsg, 1, buff, 0, length - 1); chuan = true; } catch (Exception e) { Debug.Log(e.Message); } } } } void OnApplicationQuit() { socketClient.Close(); }}
1 0
- Unity3D读取Socket的二进制图片
- 图片二进制数据库的存取和读取...
- 读取远程图片的二进制流
- Unity3D开发之不同平台二进制资源文件的读取
- 二进制读取保存图片
- 二进制流读取图片
- python 读取二进制 显示图片
- python 内存二进制读取图片
- NET二进制图片存储与读取的常见方法
- .NET中二进制图片的存储与读取
- Form2.Image 控件显示ADO 读取的二进制图片
- 图片以二进制的形式存储到数据库并读取
- .NET二进制图片存储与读取的常见方法
- NET二进制图片存储与读取的常见方法
- .NET中二进制图片的存储与读取
- 【黑马程序员】二进制图片的读取(学习笔记)
- .NET二进制图片存储与读取的常见方法
- .NET中二进制图片的存储与读取
- 你应该知道的9篇深度学习论文(CNNs 理解)
- 9 远程连接ssh 加密.
- Pycharm中使用Ipython编写交互式notebook
- 【转】【问底】李平:大型网站的灵魂——性能
- PKU_1007 DNA sorting
- Unity3D读取Socket的二进制图片
- 二叉树的后序遍历
- git学习
- ORA-01950: 表空间'USERS'中无权限的2种解决办法
- 【转】大型网站系统架构的演化
- 通过公网ip访问云服务器
- UIApplicationShortcutIconType
- application 19事件
- caffe安装 Ubuntu14.04 cuda 8.0 cudnn 5.1