聊天室程序
设置服务端监听过程:
//设置全局套接接口
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获得端口地址
IPAddressipAddress = IPAddress.Parse(txbIp.Text);
//获得接口地址
IPEndPointipEndPoint = new IPEndPoint(ipAddress,int.Parse(txbSocket.Text));
socketWatch.Bind(ipEndPoint);
//设置监听队列
socketWatch.Listen(10);//设置监听队列的长度
//开始监听
//全局变量,单独开启一个线程负责接收信息
watchThread = new Thread(socketConnection);
watchThread.IsBackground=true;
watchThread.Start();
//定义一个方法,循环接收客户信息
privatevoid socketConnection()
{
while(true)
{
//全局变量,用于接收监听队列得到的用户信息,并与用户创建连接
socketConnect = socketWatch.Accept();
}
}
设置客户连接:
socketConnection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPointipEndPoint = new IPEndPoint(IPAddress.Parse(txbIp.Text), int.Parse(txbSocket.Text));
//连接端口
socketConnection.Connect(ipEndPoint);
threadReceive = new Thread(receiveMsg);
threadReceive.Start();
发送消息语句:
//通过套接字发送消息必须将格式转换为byte[]
byte[]sendMsg = System.Text.Encoding.UTF8.GetBytes((txbSend.Text.Trim()));
socketConnect.Send(sendMsg);
showMessage("send:"+txbSend.Text);
接收消息语句:
//因为消息的不定时性,所以要用循环语句时刻监听
while(true)
{
//创建好容器,存放接收到的数据
byte[]receiveMsg = new byte[1024* 1024 * 2];
//得到接收数据的长度
intlength=socketConnection.Receive(receiveMsg);
stringreceiveMesg = System.Text.Encoding.UTF8.GetString(receiveMsg,0,length);
showMsg(receiveMesg);
}
要点:
1.聊天室的整体程序涉及到套接字端口的信息,所以在多人聊天时为了保存客户的信息,对多人发送消息,可以建立一个dictionary泛型。
2.而为了保持每个聊天的独立性,则需要创建多个线程和套接字,在此过程中会用上一些循环以及判断语句,使用的时候需要多加梳理。
3.发送非文本格式的文件时,需要对数据进行一些处理,在数据转换为byte[]后可以将让数据加上前缀,以方便接受信息者判断文件格式