服务端: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();}}

Unity3D读取Socket的二进制图片相关推荐

  1. 用Java或Jsp向数据库存取二进制图片

    2019独角兽企业重金招聘Python工程师标准>>> 前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式 ...

  2. 关于python二进制图片转码求解

    二进制图片 python转码求解 #python 诸位大佬,我用python的二进制格式打开了一个jpg图片 with open("C:\\Users\\Daniel\\Desktop\\大 ...

  3. python读取excel批量下载图片

    需求: 有一个Excel表格,里面存储了很多图片地址,要把这些图片批量下载到本地 # 读取Excel中的图片地址,下载图片 # 导入2个包,导入方法为命令行里执行pip install openpyx ...

  4. Python OpenCV cv2和二进制图片互转

    文章目录 问题描述 代码 参考文献 问题描述 1.png https://img-blog.csdnimg.cn/20200819095325567.png 代码 import cv2 import ...

  5. 读取json格式的图片、文字并保存成图片

    读取json格式的图片.文字并保存成图片 说明 从数据库中获取到图片.中文.英文信息后,将其合成json文件,图片格式为base64格式,需要将其转成二进制形式,然后将其保存成图片,将中文.英文信息保 ...

  6. Unity3d android 通信之 unity3d读取android SD卡文件

    此篇博文解决的问题是: 1.unity3d如何访问android SD卡的文件 2.如果把android端代码以jar包形式由unity3d调用 闲话不多说,现在咱们进入正题. 一.unity3d如何 ...

  7. [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 大型控件的ImageField)...

    [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField) http://www.dotblogs.c ...

  8. js读取剪切板的图片

    <script> function test(evt){ //for chrome var clipboardData = evt.clipboardData; for(var i=0; ...

  9. SparkStreaming读取Socket数据

    SparkStreaming是7*24h不间断运行,底层操作的是DStream. 读取Socket数据过程 1.SparkStreaming启动后,首先启动一个job,这个job有一个task一直接收 ...

最新文章

  1. Go 分布式学习利器(12)-- Go语言的扩展和复用
  2. WSDL、SOAP、UDDI
  3. C#(WinForm)实现软件注册
  4. python冒号错误-python冒号错误语法无效
  5. 树莓派(Raspberry Pi)修改时区
  6. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM,事件高级)
  7. 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)
  8. C#线程使用(二)全面总结
  9. [archlinux][hardware] 查看SSD的使用寿命
  10. CS231n课程笔记5.4:超参数的选择交叉验证
  11. 18b20温度检测及其lcd显示_单片机使用DS18B20测量温度的程序
  12. [Robot Framework] Jenkins上调用Rebot命令时执行报错不往下执行其他命令
  13. matlab怎么复制相同的列,怎样将数组中某一列数据相同的行提取出来?
  14. React-flux杂记
  15. SQL server 2005的备份与还原
  16. Win10 PSCAD4.5安装心路历程Mark
  17. GPS原始信号数据解析
  18. Debug调试报错解决方案
  19. 工商服务代理行业解决方案
  20. deepin linux连接不上网络,把Deepin升级到15.8桌面版后无线上不了网的解决方法

热门文章

  1. HDU--1871--细节处理--记忆化暴力查找
  2. 《把时间当朋友》摘录
  3. 用股票交易量查询接口是怎么查询a股全天总成交量的?
  4. 机房收费系统—软件需求说明书
  5. 求助!PIP安装出问题
  6. 这一篇让你彻底弄明白 Flutter 的 InheritedWidget 局部刷新机制
  7. H5互动小游戏如何提升用户留存
  8. 贴片Y1电容和贴片Y2电容简介!
  9. python 实现用ISBN从豆瓣获取图书信息
  10. Web前端中的MVVM