找回密碼
 注冊帳號

掃一掃,訪問微社區

腳本 用socket傳圖只傳一點,不知道錯誤在哪

4
回復
190
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
5熟悉之中
996/1000
排名
14745
昨日變化

74

主題

380

帖子

996

積分

Rank: 5Rank: 5

UID
15706
好友
3
蠻牛幣
1180
威望
0
注冊時間
2014-2-26
在線時間
485 小時
最后登錄
2019-11-28
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



girl.jpg (38.02 KB, 下載次數: 9)

接收到的圖片

接收到的圖片
回復

使用道具 舉報

5熟悉之中
996/1000
排名
14745
昨日變化

74

主題

380

帖子

996

積分

Rank: 5Rank: 5

UID
15706
好友
3
蠻牛幣
1180
威望
0
注冊時間
2014-2-26
在線時間
485 小時
最后登錄
2019-11-28
沙發
樓主 2019-10-28 11:04:55 只看該作者
有人嗎???
回復

使用道具 舉報

排名
417
昨日變化

21

主題

231

帖子

4270

積分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蠻牛幣
5470
威望
0
注冊時間
2013-7-4
在線時間
1910 小時
最后登錄
2019-12-13

專欄作家

QQ
板凳
2019-10-29 18:49:47 只看該作者
數據分段,傳輸,校驗,合并
回復

使用道具 舉報

5熟悉之中
996/1000
排名
14745
昨日變化

74

主題

380

帖子

996

積分

Rank: 5Rank: 5

UID
15706
好友
3
蠻牛幣
1180
威望
0
注冊時間
2014-2-26
在線時間
485 小時
最后登錄
2019-11-28
地板
樓主 2019-11-14 18:18:01 只看該作者
AWNUXCVBN 發表于 2019-10-29 18:49
數據分段,傳輸,校驗,合并

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

使用道具 舉報

排名
417
昨日變化

21

主題

231

帖子

4270

積分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蠻牛幣
5470
威望
0
注冊時間
2013-7-4
在線時間
1910 小時
最后登錄
2019-12-13

專欄作家

QQ
5#
2019-11-15 17:12:14 只看該作者
594915947 發表于 2019-11-14 18:18
意思是我只接收了第一段?

應該是,不完整
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

法甲球队主场名称