本帖最后由 许大虾 于 2013-6-20 11:34 编辑
源码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;//包含IP,IPAdress,IPEndPoint(ip和端口)类
using System.Net.Sockets;//导入套接字
using System.Threading;
namespace MyCharRoomServer
{
public partial class FChatServer : Form
{
public FChatServer()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//关闭对文本框的跨线程操作检查
}
Thread threadWatch = null;//负责监听客户端连接请求的线程
Socket socketWatch = null;//负责监听的套接字
Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
private void btnBeginListem_Click(object sender, EventArgs e)
{
//创建服务端负责监听的套接字,参数(使用IP4寻址协议,使用流式连接,使用TCP协议传输数据)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获得文本框中的IP地址对象
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
//创建包含ip和port的网络节点对象
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
//将负责监听的套接字 绑定到唯一的IP和端口上
socketWatch.Bind(endpoint);
//设置监听队列的长度
socketWatch.Listen(10);
//创建负责监听的线程,并传入监听方法
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;//设置为后台线程
threadWatch.Start();//开启线程
ShowMsg("服务器启动监听成功!");
//socketWatch.Bind
//IPEndPoint
}
/// <summary>
/// 监听客户端请求的方法
/// </summary>
void WatchConnecting()
{
while (true) //持续不断监听新的客户端的连接请求
{
//开始监听客户端连接请求,注意:Accept方法,会阻断当前的线程!
Socket sokConnetion = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责和该客户端通信的套接字 sokConnetion
//向列表控件中 添加一个客户端的ip端口字符串 作为客户端的唯一标识
lbOnline.Items.Add(sokConnetion.RemoteEndPoint.ToString());
//将与客户端通信的套接字对象 sokConnection添加到键值对集合中,并与客户端IP端口作为键值
dict.Add(sokConnetion.RemoteEndPoint.ToString(),sokConnetion);
ShowMsg("客户端连接成功!");
}
}
//发送消息到客户端
private void btnSend_Click(object sender, EventArgs e)
{
string strMsg = txtMsgSend.Text.Trim();
//将要发送的字符串转成utf8对应的字节数组
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
//获得列表中 选中的Key
string strClientKey = lbOnline.Text;
//通过key,找到字典集合中对应的与某个客户端通信的套接字send方法,发送数据给对方
dict[strClientKey].Send(arrMsg);
//sokConnetion.Send(arrMsg);
ShowMsg("发送了数据出去:" + strMsg);
}
void ShowMsg(string msg)
{
txtMsg.AppendText(msg + "\r\n");
}
}
}
|