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;
using System.Net.Sockets;
using System.Threading;
namespace SocketServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button_Monitor_Click(object sender, EventArgs e)
{
try
{
//点击开始监听时,在服务器端创建一个负责监听IP和端口号的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox_Port.Text));
socketWatch.Bind(point); //绑定端口号
ShowMsg("监听成功");
socketWatch.Listen(10);
//创建监听线程
Thread thread = new Thread(Listen);
thread.IsBackground = true;
thread.Start(socketWatch);
}
catch { }
}
void ShowMsg(string strRecords)
{
listBox_Recv.Items.Add(strRecords + "\r\n");
}
/// <summary>
/// 等待客户端的连接,并且创建与之通信的Socket
/// </summary>
/// <param name="o"></param>
Socket socketSend;
void Listen(Object o)
{
try
{
Socket socketWatch = o as Socket;
while (true)
{
socketSend = socketWatch.Accept();
ShowMsg(socketSend.RemoteEndPoint.ToString() + ": 连接成功!");
Thread r_thread = new Thread(Received);
r_thread.IsBackground = true;
r_thread.Start(socketSend);
}
}
catch { }
}
/// <summary>
/// 服务器端不停的接受来自客户端的消息
/// </summary>
/// <param name="o"></param>
void Received(object o)
{
try
{
Socket socketSend = o as Socket;
while (true)
{
//客户端连接服务器端成功后,服务器端接受客户端发出的消息
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收到的有效字节数
int Len = socketSend.Receive(buffer);
if (Len == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, Len);
ShowMsg(DateTime.Now.ToString() + "(客户端):" + str);
}
}
catch { }
}
/// <summary>
/// 服务器向客户端发送消息
/// </summary>
/// <param name="str"></param>
void Send(string str)
{
try
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}
catch { }
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Send(textBox1.Text.Trim());
ShowMsg(DateTime.Now.ToString() + "(服务器):" + textBox1.Text);
textBox1.Clear();
}
}
}
}