程序功能介紹:
服務器: PC
語言 C#
按鈕開啓serverSocket
private void btnStartServer_Click(object sender, EventArgs e)
{
string strip = tbIP.Text; //手動填寫IP地址
string strport = tbPort.Text; //端口號
IPAddress IP;
int Port;
try
{
if (strip != "" && strport != "")
{
IP = IPAddress.Parse(strip);
Port = Convert.ToInt32(strport);
this.lIP.Text = IP.ToString();
this.lport.Text = strport;
}
else //如果沒有填寫任何信息,則默認是本地地址和1234端口號
{
IP = GetIP(); //獲得本地IP地址
Port = 1234;
this.lIP.Text = IP.ToString();
this.lport.Text = Port.ToString();
}
if (IP != null)
serverFullAddr = new IPEndPoint(IP, Port);
else
{
MessageBox.Show("沒有得到正確IP地址!!");
return;
}
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(serverFullAddr);
lbserverState.Text = "服務器已經啓動!!";
}
catch(Exception el)
{
MessageBox.Show(el.Message);
return;
}
//開啓帶有參數的監聽線程,並把服務器socket傳遞給線程
ParameterizedThreadStart parstart = new ParameterizedThreadStart(ConnectListen);
Thread thListen = new Thread(parstart);
threadList.Add(thListen);
thListen.Start((object)server);
}
獲得 本地IP地址 此段代碼直接從網上找到的
public IPAddress GetIP()
{
// string strAddr = "";
IPAddress IP=null;
try
{
string strHostName = System.Net.Dns.GetHostName();
System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
foreach (IPAddress _ipaddress in ipEntry.AddressList)
{
if (_ipaddress.AddressFamily.ToString().ToLower() == "internetwork")
{
//strAddr = _ipaddress.ToString();
IP = _ipaddress;
break;
}
}
// Log.Debug(" IP:" + strAddr);
}
catch (System.Exception e)
{
//Log.Error(" Get IP Address Error:" + e.Message);
MessageBox.Show("沒有獲得主機的IP!!!");
}
return IP;
}
監聽客戶端連接線程 private void ConnectListen(object server)
{
Socket serverSocket = (Socket)server;
while (true) //循環接聽連接
{
serverSocket.Listen(20);
Socket acceptSock = serverSocket.Accept();
byte[] byteArray = new byte[50];
acceptSock.Receive(byteArray);//接收數據 //接收客戶端發送過來的用戶名 默認50個字節,處理得到字符串
//將字節數組轉成字符串
string strRec = System.Text.Encoding.Default.GetString(byteArray); //C# byte[] 轉換爲 string
string socketName = strRec.Substring(0, strRec.IndexOf("\n"));
IPAddress clientIp = ((System.Net.IPEndPoint)acceptSock.RemoteEndPoint).Address; 獲得客戶端IP地址
string strip = clientIp.ToString();
socketNameList.Add(socketName);
socketIpList.Add(strip);
UpdatePersonListBox(); //更新用戶列表
clientSocketList.Add(acceptSock);
ParameterizedThreadStart parstart = new ParameterizedThreadStart(RecvFile); 爲每個客戶端添加接收信息監聽線程
Thread th = new Thread(parstart);
threadList.Add(th);
th.Start((object)acceptSock);
}
}
接收文件線程 private void RecvFile(object acceptSock)
{
bool flag = false;
Socket recvSocket = (Socket)acceptSock;
byte[] byteArry = new byte[256];
string path = "recvVoice"; //創建接收文件文件夾
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string strnow = DateTime.Now.ToString("yyyyMMdd-hh-mm-ss"); //根據系統時間命名接收文件
string strpath = "recvVoice\\" + strnow + ".wav";
byte[] buffLen = new byte[50];
int count=recvSocket.Receive(buffLen); //接收文件的字節長度用於判斷接收文件結束 默認50字節發送
string strRec = System.Text.Encoding.Default.GetString(buffLen);
string fLen = strRec.Substring(0, strRec.IndexOf("\n"));
int fileLen = 0;
try
{
fileLen = Convert.ToInt32(fLen);
}
catch(Exception el)
{
MessageBox.Show(el.Message);
}
int recCount = 0;
int readLen = 0;
MemoryStream memStream = new MemoryStream();
try
{
while ((recCount = recvSocket.Receive(byteArry)) > 0) // 循環接收文件 字節發送
{
readLen = readLen + recCount;
if (readLen >= fileLen) //跳出循環標誌
{
memStream.Write(byteArry, 0, recCount);
flag = true;
break;
}
memStream.Write(byteArry, 0, recCount); //把網絡流寫進文件流
flag = true; //接收文件標誌
}
}
catch (Exception el)
{
flag = false;
memStream.Close();
// fs.Close();
memStream = null;
// fs = null;
MessageBox.Show(el.Message);
RecvFile(acceptSock); //使用遞歸 繼續監聽文件接收來信
return;
}
if (flag)
{
FileStream fs = new FileStream(strpath, FileMode.OpenOrCreate);
memStream.WriteTo(fs);
fs.Close();
fs = null;
UpdateLabel(flag);
IPAddress clientIp = ((System.Net.IPEndPoint)recvSocket.RemoteEndPoint).Address;
string strip = clientIp.ToString();
int index = socketIpList.IndexOf(strip);
AddVoiceToListBox(socketNameList[index] + "****" + socketIpList[index], strpath, flag); //把客戶端用戶名地址,接收文件的保存路徑
//添加到聲音列表
}
flag = false;
memStream.Close();
memStream = null;
RecvFile(acceptSock); //使用遞歸 繼續監聽文件接收來信
}
本地聲音發送函數
private void SendFile(Socket acceptSock,string vpath)
{
Socket sendSocket = (Socket)acceptSock;
byte[] byteArray = new byte[100];
Stream st = File.OpenRead(vpath);
Byte[] b = new Byte[1024];
string strlen = st.Length.ToString();
byte[] bytes = System.Text.Encoding.Default.GetBytes(strlen + "\r\n"); //string 轉換byte[]
sendSocket.Send(bytes); //發送文件長度 用於判斷文件接收結束
int count = 0;
int sent = 0;
int offset = 0;
int left = 0;
Thread.Sleep(1000); //重點哦
while (offset < st.Length)
{
//buffer.CopyTo(b, 1024);
count = st.Read(b, 0, 1024);
offset = offset + count;
left = Convert.ToInt32(st.Length) - offset;
if (left <= 1024)
{
byte[] temp = new byte[left];
sent = sendSocket.Send(b);
// Thread.Sleep(10);
count = st.Read(b, 0, left);
sent = sendSocket.Send(temp);
break;
}
sent = sendSocket.Send(b);
}
IPAddress clientIp = ((System.Net.IPEndPoint)sendSocket.RemoteEndPoint).Address;
string strip = clientIp.ToString();
int index = socketIpList.IndexOf(strip);
AddVoiceToListBox("Server Send To ****" + socketNameList[index], vpath, true);
}