服务器端:
private void StartWatch_Click(object sender, EventArgs e)
{
//创建一个负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建IP地址和端口号对象
IPAddress ip = IPAddress.Any;//IPAddress.Parse(IPaddress.Text)这会使接受的ip地址固定,any会随着IP地址变;
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(PortBox.Text));
//让负责监听的Socket绑定IP地址跟端口号
socketWatch.Bind(point);
ShowMsg("监听成功");
//设置监听队列
socketWatch.Listen(10);//在某一个时间点内,服务器端最大连接的客户端的数量
//创建多线程来监听
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);//Listen函数是带参数的,所以start使用时必须带监听参数
}
//等待客户端的连接,并创建与之通信的Socket
Socket socketsend;
//将远程连接的客户端的IP地址和Socket存入集合中
Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
void Listen(object o)//listen要用多线程来运行,参数必须是object类
{
Socket socketWatch = o as Socket;
while(true)
{
//负责监听的socket来接受客户端的连接 创建跟客户端通信的socket
socketsend = socketWatch.Accept();
//将连接的客户端的IP地址和Socket存起来
dicSocket.Add(socketsend.RemoteEndPoint.ToString(), socketsend);
//将连接的客户端的IP地址和端口号存储到下拉框中
ClientSelect.Items.Add(socketsend.RemoteEndPoint.ToString());
//192.168.3.161:连接成功
ShowMsg(socketsend.RemoteEndPoint.ToString() + ": " + "连接成功" );
//开一个线程,不停接受客户端发送过来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketsend);
}
}
void Receive(object o)
{
string[] str=new string[6];
socketsend = o as Socket;
while (true)
{
for (int i = 0;i< 6; i++)
{
//客户端连接成功之后,服务器应该接受客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接受到的字节数
int r = socketsend.Receive(buffer);
if (r == 0)
{
break;
}
str[i] = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketsend.RemoteEndPoint + ":" + str[i]);
}
}
}
void ShowMsg(string str)//服务器端显示内容
{
servershow.Text=str;
//servershow.AppendText(str + "\r\n");
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
//服务器给客户端发送消息
private void Clicksend_Click(object sender, EventArgs e)
{
string str = Serversend.Text;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
//获得用户在下拉框中选中的IP地址
string ip = ClientSelect.SelectedItem.ToString();
dicSocket[ip].Send(buffer);
// socketsend.Send(buffer);
}
客户端:
Socket socketsend;
private void Link_Click(object sender, EventArgs e)
{
//创建负责通信的socket,连接远程服务器端的ip,和端口号
socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(IPBox2.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(PortBox2.Text));
socketsend.Connect(point);
ShowMsg("连接成功");
//开启一个新线程不停的接受服务端发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
//客户端不停的接受服务端发来的消息
void Receive()
{
while(true)
{
//接受到的信息为二进制信息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接受到的有效字节数
int r = socketsend.Receive(buffer);
if(r==0)
{
break;
}
//将二进制信息转换为字符串
string s = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketsend.RemoteEndPoint + ":" + s);
}
}
void ShowMsg(string str)
{
Clientshow.AppendText(str + "\r\n");
}
//客户端给服务器发送消息
private void send_Click(object sender, EventArgs e)
{
timer1 = new System.Windows.Forms.Timer();
//设置定时器属性
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 100;//时间间隔100毫秒
timer1.Enabled = true;
//开启定时器
timer1.Start();
}
double L1, L2, L3, L4 = 0.555, L5, L6;
private void timer1_Tick(object sender, EventArgs e)
{
L4 = L4 + 1;
Clientsend.Text = L4.ToString();
string str = Clientsend.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketsend.Send(buffer);
if (L4 > 360)
{
timer1.Stop();
}
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}