设计思路
主要问题是:服务器socket和客户端socket的建立、Socket的基本动作(Accept、Connect、Send、Receive)等
1、服务器和客户端分为两个类,两个类中的主要方法如下:
SocketServer:
1)public ServerForm();//构造函数
2) private void Run();//建立并运行服务器
3)private void ListenConnect();//启动服务器socket监听
4)private void ReceiveMessage(object clientSocket);//接收客户端socket数据事件
5)private void sendMessage(Socket serverSocket,string message);//向客户端socket发送数据
6)private void setReceiveRichTextBox(string message);//在richTextBox1设置显示消息
7) private void setListBox(int flag, string message);//在listBox1设置显示客户端信息
8) private void button1_Click(object sender, EventArgs e);//点击按钮事件,向客户端发送消息
9) private void richTextBox1_TextChanged(object sender, EventArgs e);//
SocketClient:
1)public ClientForm();//构造函数
2)private void Run();//建立并运行客户端
3)private void ReceiveMessage(object socket);//接收服务器socket数据事件
4)private void SendMessage(string message);//向服务器socket发送
5)private void setReceiveRichTextBox(string message);//在richTextBox1设置显示消息
6)private void button1_Click(object sender, EventArgs e);/点击按钮事件,向服务器发送消息
7)private void richTextBox2_TextChanged(object sender, EventArgs e);//
三、程序代码及运行结果:
1、ServerSocket程序代码如下:
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.Sockets;
using System.Net;
using System.Threading;
namespace SocketExample
{
public partial class ServerForm : Form
{
private IPAddress ip = IPAddress.Parse("127.0.0.1");
private int port = 9191;
private byte[] result = new byte[1024];
private Socket serverSocket;
private int user = 0;//客í户§端?个?数簓
private Dictionary<String,Socket> socketList=new Dictionary<string,Socket>();
private delegate void SetRichTextBoxMessagedelegate(string message);
SetRichTextBoxMessagedelegate setReceiveRichBoxMessage;
// SetRichTextBoxMessagedelegate setSendRichBoxMessage;
private delegate void SetListBoxMessagedelegate(int flag,string message);
SetListBoxMessagedelegate setListBoxMessage;
public ServerForm()
{
InitializeComponent();
Run();
}
private void Run()
{
//建¨立ⅰ?服务?器÷socket,?启?动ˉ监à听瑈线?程ì
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip,port));
serverSocket.Listen(10);
setReceiveRichBoxMessage = new SetRichTextBoxMessagedelegate(setReceiveRichTextBox);
setListBoxMessage = new SetListBoxMessagedelegate(setListBox);
Thread thread = new Thread(ListenConnect);
thread.IsBackground = true;
thread.Start();
}
private void ListenConnect() {
while (true)
{
Socket clientSocket = serverSocket.Accept();
++user;
socketList.Add(clientSocket.RemoteEndPoint.ToString(),clientSocket);
clientSocket.Send(Encoding.UTF8.GetBytes("Hi!"));
if (InvokeRequired)
{
this.Invoke(setReceiveRichBoxMessage, "客í户§端? " + clientSocket.RemoteEndPoint.ToString() +
" 已?连?接ó!" + Environment.NewLine);
this.Invoke(setReceiveRichBoxMessage, "已?经-有瓺" + user + "个?用?户§连?接ó到?服务?器÷" + Environment.NewLine + Environment.NewLine);
this.Invoke(setListBoxMessage, 1, clientSocket.RemoteEndPoint.ToString());
}
else
{
richTextBox1.Text += "客í户§端? " + clientSocket.RemoteEndPoint.ToString() +
" 已?连?接ó!" + Environment.NewLine;
richTextBox1.Text += "已?经-有瓺" + user + "个?用?户§连?接ó到?服务?器÷" + Environment.NewLine + Environment.NewLine;
listBox1.Items.Add(clientSocket.RemoteEndPoint.ToString());
}
Thread thread = new Thread(ReceiveMessage);
thread.IsBackground = true;
thread.Start(clientSocket);
}
}
private void ReceiveMessage(object clientSocket)
{
Socket ClientSocket = (Socket)clientSocket;
while (true)
{
try
{
int number = ClientSocket.Receive(result);
if (InvokeRequired)
{
this.Invoke(setReceiveRichBoxMessage, "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "说μ:阰" + Environment.NewLine
+ Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine);
}
else
richTextBox1.Text += "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "说μ:阰" + Environment.NewLine
+ Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine;
}
catch {
--user;
socketList.Remove(ClientSocket.RemoteEndPoint.ToString());
if (InvokeRequired)
{
this.Invoke(setReceiveRichBoxMessage, "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "断?开a连?接ó。£" + Environment.NewLine);
this.Invoke(setReceiveRichBoxMessage, "还1剩骸?下?" + user + "个?用?户§。£" + Environment.NewLine + Environment.NewLine);
this.Invoke(setListBoxMessage, 0, ClientSocket.RemoteEndPoint.ToString());
}
else
{
richTextBox1.Text += "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "断?开a连?接ó。£" + Environment.NewLine
+ "还1剩骸?下?" + user + "个?用?户§。£" + Environment.NewLine + Environment.NewLine;
listBox1.Items.Remove(ClientSocket.RemoteEndPoint.ToString());
}
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
break;
}
}
}
//发ぁ?送í消?息¢
private void sendMessage(Socket serverSocket,string message) {
if (message == "")
return;
try
{
string sMessage = "发ぁ?送í时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine + message;
serverSocket.Send(Encoding.UTF8.GetBytes(message));
if (InvokeRequired)
{
this.Invoke(setReceiveRichBoxMessage, "我ò对? " + serverSocket.RemoteEndPoint.ToString() + " 说μ:阰"
+ Environment.NewLine + sMessage + Environment.NewLine + Environment.NewLine);
}
else
{
richTextBox1.Text += "我ò对? " + serverSocket.RemoteEndPoint.ToString() + " 说μ:阰"
+ Environment.NewLine + sMessage + Environment.NewLine + Environment.NewLine;
}
}
catch
{
try
{
serverSocket.Shutdown(SocketShutdown.Both);
serverSocket.Close();
}
catch
{
return;
}
}
}
//接ó受酣?消?息¢的?窗洹?口ú
private void setReceiveRichTextBox(string message) {
richTextBox1.Text += message;
}
//设Θ?置?ListBox,?flag==1时骸?添?加ó客í户§端?,?flag==0时骸?,?移?除y客í服端?
private void setListBox(int flag, string message)
{
if (flag == 1)
listBox1.Items.Add(message);
else if(flag==0)
listBox1.Items.Remove(message);
}
private void button1_Click(object sender, EventArgs e)
{
try {
for(int i=0;i<listBox1.SelectedItems.Count;i++)
{
Socket socket=socketList[listBox1.SelectedItems[i].ToString()];
sendMessage(socket,richTextBox2.Text);
}
}
catch
{
return;
}
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
richTextBox1.Focus();
richTextBox1.Select(richTextBox1.TextLength,0);
richTextBox1.ScrollToCaret();
richTextBox2.Focus();
}
}
}
2、ClientSocket程序代码如下:
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.Sockets;
using System.Net;
using System.Threading;
namespace SocketClient
{
public partial class ClientForm : Form
{
private IPAddress ip = IPAddress.Parse("127.0.0.1");
private int port = 9191;
private byte[] result=new byte[1024];
private Socket socket;
private delegate void SetRichTextBoxMessagedelegate(string message);
SetRichTextBoxMessagedelegate setReceiveRichBoxMessage;
public ClientForm()
{
InitializeComponent();
Run();
}
private void Run() {
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
setReceiveRichBoxMessage = new SetRichTextBoxMessagedelegate(setReceiveRichTextBox);
try
{
socket.Connect(new IPEndPoint(ip, port));
richTextBox2.Text += "已?连?接ó到?服务?器÷。£" + Environment.NewLine;
//创洹?建¨接ó收?信?息¢线?程ì
Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.IsBackground = true;
receiveThread.Start(socket);
}
catch {
MessageBox.Show("连?接ó失骸?败悒?,?请?退?出?。£");
socket.Close();
return;
}
}
private void ReceiveMessage(object socket)
{
Socket mySocket = (Socket)socket;
while (true)
{
try
{
int number = mySocket.Receive(result);
if (InvokeRequired)
{
this.Invoke(setReceiveRichBoxMessage, "服务?器÷说μ:阰" + Environment.NewLine + "时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine +
Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine);
}
else
{
richTextBox2.Text += "服务?器÷说μ:阰" + Environment.NewLine + "时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine +
Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine;
}
}
catch
{
MessageBox.Show("接ó收?信?息¢失骸?败悒?!?\n连?接ó已?断?开a!?\n请?关?闭?后ó重?试?!?");
}
}
}
private void SendMessage(string message) {
if (message == "")
return;
try
{
String sendMessage = "Time : " + DateTime.Now + Environment.NewLine +
"Messages :" + Environment.NewLine + message;
socket.Send(Encoding.UTF8.GetBytes(sendMessage));
richTextBox2.Text += "我ò说μ:阰" + Environment.NewLine + sendMessage + Environment.NewLine + Environment.NewLine;
}
catch {
}
}
private void setReceiveRichTextBox(string message) {
richTextBox2.Text += message;
}
private void button1_Click(object sender, EventArgs e)
{
SendMessage(richTextBox1.Text);
richTextBox1.Text = "";
}
private void richTextBox2_TextChanged(object sender, EventArgs e)
{
richTextBox2.Focus();//获?取?焦1点?
richTextBox2.Select(richTextBox2.TextLength, 0);//光a标括?定¨位?到?文?本?最?后ó
richTextBox2.ScrollToCaret();//滚?动ˉ到?光a标括?处鋦
richTextBox2.Focus();
}
}
}