程序功能介绍:
服务器: 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);
}