----------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace socket_client
{
//客戶端
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
Socket s;//聊天用
Thread th;
//連接
private void button1_Click(object sender, EventArgs e)
{
//步驟1 配置遠程服務器信息
IPEndPoint removeServer = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));
//步驟2 創建套接字
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//步驟3 套接字連接遠程服務器
s.Connect(removeServer);
//步驟4 提示連接狀態
if (s.Connected)
{
label4.Text = "連接服務器成功!";
//步驟5 循環接收服務器發來的消息
th = new Thread(new ThreadStart(BB));
th.IsBackground = true;
th.Start();
}
}
void BB()
{
while (true)
{
byte[] bb = new byte[1024];
int i= s.Receive(bb); //接收數據,返回每次接收的字節總數
string removeMsg = Encoding.Unicode.GetString(bb,0,i);
if (removeMsg == "CMD--EXIT")//收到的是退出通知
{
label4.Text = "無連接";
DialogResult re=MessageBox.Show("服務器已經關閉.\n\"確定\"後退出程序,\n\"取消\"繼續停留!", "消息提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
MessageBox.Show(re.ToString());
if (re == DialogResult.OK)
{
sendExit();//告訴服務器我退出了
Application.Exit();
}
return;
}
richTextBox1.AppendText(removeMsg+"\n") ;
richTextBox1.ScrollToCaret();
}
}
//發送消息
private void button3_Click(object sender, EventArgs e)
{
string msg = "客戶端:" + richTextBox2.Text;
byte[] bb = Encoding.Unicode.GetBytes(msg);
s.Send(bb);
richTextBox2.Text = "";
richTextBox2.Focus();
}
//發送“客戶端退出提示”
void sendExit()
{
string cmd = "CMD--EXIT";
byte[] bb = Encoding.Unicode.GetBytes(cmd);
s.Send(bb);
}
}
}
socket-server
--------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace socket_server
{
//服務器
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; //可以調試時,不捕捉控件創建線程錯誤
}
Thread th;
Socket s1;//監聽用
Socket s2;//聊天用
//監聽
private void button1_Click(object sender, EventArgs e)
{
IPAddress ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
//步驟1 創建網絡端點IPEndPoint
IPEndPoint myServer = new IPEndPoint(ip, 888);
//步驟2 創建套接字Socket
s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//步驟3 套接字綁定到網絡端點
s1.Bind(myServer);
label1.Text = ip+": 888 \n等待客戶端連接......";
th = new Thread(new ThreadStart(AA));
th.IsBackground = true;
th.Start();
}
void AA()
{
//步驟4 監聽
s1.Listen(5);
//步驟5 接受客戶端連接
s2 = s1.Accept();
//步驟6 判斷連接狀態
if (s2.Connected)
{
label1.Text = "已有客戶端連接!";
//步驟7 循環接收客戶端消息
while (true)
{
byte[] bb = new byte[1024];
int i= s2.Receive(bb);
string removeMsg = Encoding.Unicode.GetString(bb,0,i);
if (removeMsg == "CMD--EXIT")//收到的是退出通知
{
label1.Text = "客戶端已經取消了連接";
return;
}
richTextBox1.AppendText( removeMsg+"\n" );
richTextBox1.ScrollToCaret();
}
}
}
//停止監聽
private void button2_Click(object sender, EventArgs e)
{
sendExit();//告訴客戶端
s2.Shutdown(SocketShutdown.Both);
s1.Close();
th.Abort();
label1.Text = "無連接";
}
//發送消息
private void button3_Click(object sender, EventArgs e)
{
string msg = "服務器:" + richTextBox2.Text;
byte[] bb = Encoding.Unicode.GetBytes(msg);
s2.Send(bb);
richTextBox2.Text = "";
richTextBox2.Focus();
}
//發送“服務器退出提示”
void sendExit()
{
string cmd = "CMD--EXIT";
byte[] bb = Encoding.Unicode.GetBytes(cmd);
s2.Send(bb);
}
}
}