找回密码
 注册帐号

扫一扫,访问微社区

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

4
回复
351
查看
[ 复制链接 ]
6蛮牛粉丝
1049/1500
排名
14743
昨日变化

80

主题

394

帖子

1049

积分

Rank: 6Rank: 6Rank: 6

UID
15706
好友
3
蛮牛币
1147
威望
0
注册时间
2014-2-26
在线时间
518 小时
最后登录
2020-6-4
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



接收到的图片

接收到的图片
回复

使用道具 举报

6蛮牛粉丝
1049/1500
排名
14743
昨日变化

80

主题

394

帖子

1049

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

排名
416
昨日变化

21

主题

239

帖子

4453

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5700
威望
0
注册时间
2013-7-4
在线时间
2084 小时
最后登录
2020-6-4

专栏作家

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

使用道具 举报

6蛮牛粉丝
1049/1500
排名
14743
昨日变化

80

主题

394

帖子

1049

积分

Rank: 6Rank: 6Rank: 6

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

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

使用道具 举报

排名
416
昨日变化

21

主题

239

帖子

4453

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5700
威望
0
注册时间
2013-7-4
在线时间
2084 小时
最后登录
2020-6-4

专栏作家

QQ
2019-11-15 17:12:14 显示全部楼层
594915947 发表于 2019-11-14 18:18
意思是我只接收了第一段?

应该是,不完整
回复

使用道具 举报

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

本版积分规则