• 【用socket传图只传一点,不知道错误在哪】-问答求助-【游戏蛮牛】-游戏出海,ar增强现实,虚拟现实,unity3d,unity3d教程下载首选u3d,unity3d官网 - Powered by Discuz!
     找回密码
     注册帐号

    扫一扫,访问微社区

    脚本 用socket传图只传一点,不知道错误在哪

    3
    回复
    131
    查看
    [ 复制链接 ]
    5熟悉之中
    994/1000
    排名
    14745
    昨日变化

    74

    主题

    379

    帖子

    994

    积分

    Rank: 5Rank: 5

    UID
    15706
    好友
    3
    蛮牛币
    1175
    威望
    0
    注册时间
    2014-2-26
    在线时间
    483 小时
    最后登录
    2019-11-14
    2019-10-15 18:05:38 显示全部楼层 阅读模式
    50蛮牛币
    本帖最后由 594915947 于 2019-10-22 17:49 编辑

    [C#] 纯文本查看 复制代码
    using UnityEngine;
    using System.Collections;
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Drawing.Imaging;
    using System.Drawing;
    using System.Net;
    using System.IO;
    using System.Threading;
     
     
    //单例类
    public class ser  {
     
    	private static ser serInstance = null;
     
    	private ser()
    	{
     
    	}
     
    	public static ser GetInstance()
    	{
    		lock(lockHelper)
    		{
    			if( serInstance == null )
    			{
    				serInstance = new ser();
    			}
    			return serInstance;
    		}
    	}
     
    	private Socket Soc_Temp;
    	private TcpListener tcpLister;
    	private bool live = true;
    	private bool abort_Start=false;
    	private bool abort_Get=false;
    	private bool abort_Send=false;
    	
    	public string send_Mes = "send_Mes";
    	public string get_Mes = "get_Mes";
    	
    	Thread Thread_Start;
    	Thread Thread_getData;
    	Thread Thread_sendData;
     
    	private static object lockHelper = new object();
     
    	//图片保存的地址与名字
    	private string desPathName = Application.dataPath + "/Resources/girl.jpg";
     
    	public bool beSave = false;
    	
    	public void Server_Start()
    	{
    		begin();
    	}
    	
    	void begin()
    	{
    		//把/转换为\ 这是因为 Image保存时的路径需要的是\
    		//而Application.dataPath的路径中是/
    		desPathName.Replace("/","\\");
    		Debug.Log(desPathName);
     
    		abort_Start = true;
    		tcpLister = new TcpListener(IPAddress.Any,8080);
    		tcpLister.Start();
    		Thread_Start = new Thread(Start);
    		Thread_Start.IsBackground = true;
    		Thread_Start.Start();
    		Debug.Log("线程开启状态Thread_Start="+Thread_Start.ThreadState);
    		Debug.Log("线程开启状态Thread_Start="+Thread_Start.IsAlive);
    	}
     
    	//TCP连接  并且 开启一个函数线程专门用于接收数据
    	void Start()
    	{
    		while(live)
    		{
    			try
    			{
    				if(tcpLister.Pending())
    				{
    					abort_Get = true;
    					Soc_Temp = tcpLister.AcceptSocket();
    					Thread_getData = new Thread(getData);
    					Thread_getData.IsBackground = true;
    					Thread_getData.Start();
    					Debug.Log("线程接收状态Thread_getData="+Thread_getData.ThreadState);
    					Debug.Log("线程接收状态Thread_getData="+Thread_getData.IsAlive);
    				}
    			}
    			catch(Exception e)
    			{
    				Debug.Log(e.Data.ToString());
     
    				Soc_Temp.Close();
    				Soc_Temp = null;
    				live = false;
    				tcpLister.Stop();
    				Thread_getData.Abort();
    			}
    		}
    	}
     
    	//接收数据线程函数
    	void getData()
    	{
    		while(live)
    		{
    			try
    			{
    				//避免在多线程下数据接收错误
    				lock(lockHelper)
    				{
     
    					//这里开辟了1M的字节空间 也就是一次图片的传输最大是1M大小
    					byte[] bytes = new byte[1024*1024];
    					int got = Soc_Temp.Receive(bytes);
    					// 将接受到的数据写入内存
    					MemoryStream fs = new MemoryStream();
    					fs.Write(bytes,0,got);
     
    					//从内存中再次将数据读出来并保存为jpg图片
    					//注意 这里 无法保存在C盘
    					Image Img = Image.FromStream(fs);
    					Img.Save(desPathName,ImageFormat.Jpeg);
    					Debug.Log("保存完毕!!!");
    					beSave = true;
    					fs.Close();
     
    				}
    				
    			}
    			catch(Exception e)
    			{
    				Debug.Log(e.Data.ToString());
     
    				live = false;
    				Soc_Temp.Close();
    				Soc_Temp = null;
    				Thread_getData.Abort();
    			}
    		}
    	}
     
    	//发送数据 线程函数
    	public void SendM()
    	{
    		abort_Send = true;
    		Thread_sendData = new Thread(sendData);
    		Thread_sendData.IsBackground = true;
    		Thread_sendData.Start();
    		
    		Debug.Log("线程发送状态Thread_Start="+Thread_sendData.ThreadState);
    		Debug.Log("线程发送状态Thread_Start="+Thread_sendData.IsAlive);
    	}
     
    	//发送数据
    	void sendData()
    	{
    		try
    		{
    			byte[] send_bytes = Encoding.UTF8.GetBytes(send_Mes);
    			Soc_Temp.Send(send_bytes);
    		}
    		catch(Exception e)
    		{
    			Debug.Log(e.Data.ToString());
     
    			live = false;
    			Soc_Temp.Close();
    			Soc_Temp = null;
    			Thread_getData.Abort();
    		}
    	}
    	
    	//终止线程
    	public void setAbort()
    	{
    		if( abort_Start )
    		{
    			Thread_Start.Abort();
    			Debug.Log("开启状态Thread_Start="+Thread_Start.ThreadState);
    			Debug.Log("开启状态Thread_Start="+Thread_Start.IsAlive);
    			abort_Start = false;
    		}
    		if( abort_Get )
    		{
    			Thread_getData.Abort();
    			Debug.Log("接受状态Thread_getData="+Thread_getData.ThreadState);
    			Debug.Log("接受状态Thread_getData="+Thread_getData.IsAlive);
    			abort_Get = false;
    		}
    		if( abort_Send )
    		{
    			Thread_sendData.Abort();
    			Debug.Log("发送状态Thread_sendData="+Thread_sendData.ThreadState);
    			Debug.Log("发送状态State:Thread_sendData="+Thread_sendData.IsAlive);
    			abort_Send = false;
    		}
    	}
    	
    }


    [AppleScript] 纯文本查看 复制代码
    using UnityEngine;
    using System.Collections;
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Drawing.Imaging;
    using System.Drawing;
    using System.Net;
    using System.IO;
     
    public class setServer : MonoBehaviour {
     
    	ser m_ser;
     
    	Texture2D m_Texure;
     
    	void Start()
    	{
    		m_ser = ser.GetInstance();
    	}
     
    	void OnDestroy()
    	{
    		print(" 脚本以关闭");
     
    		m_ser.setAbort();
    	}
     
    	void OnGUI()
    	{
    		//开启服务器
    		if( GUI.Button(new Rect((Screen.width/2)-50,(Screen.height/2),100,30),"开启服务器") )
    		{
    			m_ser.Server_Start();
    		}
     
    		//图过图片已经传输过来并且保存在了指定的位置
    		if( m_ser.beSave )
    		{
    			//Load方法加载Resource文件夹下的资源girl不用写成girl.jpg
    			m_Texure = Resources.Load("girl") as Texture2D;
    			if(m_Texure != null)	
    			{
    				GUI.DrawTexture(new Rect(0,0,m_Texure.width,m_Texure.height),m_Texure);
    			}
    		}
     
    	}
    }


    [AppleScript] 纯文本查看 复制代码
    using UnityEngine;
    using System.Collections;
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    using System.IO;
     
    public class client : MonoBehaviour {
     
     
    	private Socket clientMsg;
     
    	struct sendDate
    	{
    		public byte[] fssize;
    	};
    	private sendDate Msg;
     
    	// Use this for initialization
    	void Start ()
    	{
    		IPEndPoint ipendpiont = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080); 
    		clientMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    		clientMsg.Connect(ipendpiont);
    	}
    	
    	void OnGUI()
    	{
    		if(GUI.Button(new Rect(Screen.width/2,0,100,50),"发送图片"))
    		{
    			//声明一个文件流对象fs,并实例化该对象
    			FileStream fs = new FileStream("D:/girl.jpg",FileMode.OpenOrCreate,FileAccess.Read);
    			//为了防止socket连接出现异常,所以使用try...catch语句 
    			try
    			{
    				//下边三行代码是 将fs对象所操作的图片转换为字节数据,并保存在Msg.fssize数组中
    				Msg.fssize = new byte[fs.Length];
    				BinaryReader strread = new BinaryReader(fs);
    				strread.Read(Msg.fssize,0,Msg.fssize.Length);
    				//发送数据
    				clientMsg.Send(Msg.fssize);
    			}
    			catch(SocketException e)
    			{
    				Debug.Log(e.Data.ToString());
     
    				fs.Close();
    				clientMsg.Shutdown(System.Net.Sockets.SocketShutdown.Send);
    				clientMsg.Close();
    				clientMsg = null;
    				
    			}
     
    		}
    	}
     
    	void OnDestroy()
    	{
    		clientMsg.Close();
    	}
    	
    }


    原图片大小328K 分辨率784x956



    接收到的图片

    接收到的图片
    回复

    使用道具 举报

    5熟悉之中
    994/1000
    排名
    14745
    昨日变化

    74

    主题

    379

    帖子

    994

    积分

    Rank: 5Rank: 5

    UID
    15706
    好友
    3
    蛮牛币
    1175
    威望
    0
    注册时间
    2014-2-26
    在线时间
    483 小时
    最后登录
    2019-11-14
    楼主 2019-10-28 11:04:55 显示全部楼层
    有人吗???
    回复

    使用道具 举报

    排名
    417
    昨日变化

    21

    主题

    227

    帖子

    4223

    积分

    Rank: 9Rank: 9Rank: 9

    UID
    686
    好友
    18
    蛮牛币
    5431
    威望
    0
    注册时间
    2013-7-4
    在线时间
    1868 小时
    最后登录
    2019-11-14

    专栏作家

    QQ
    2019-10-29 18:49:47 显示全部楼层
    数据分段,传输,校验,合并
    回复

    使用道具 举报

    5熟悉之中
    994/1000
    排名
    14745
    昨日变化

    74

    主题

    379

    帖子

    994

    积分

    Rank: 5Rank: 5

    UID
    15706
    好友
    3
    蛮牛币
    1175
    威望
    0
    注册时间
    2014-2-26
    在线时间
    483 小时
    最后登录
    2019-11-14
    楼主 4 小时前 显示全部楼层
    AWNUXCVBN 发表于 2019-10-29 18:49
    数据分段,传输,校验,合并

    意思是我只接收了第一段?
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则