服務端:
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace 服務端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//監聽設定了執行緒,不讓主執行緒知道,否則主執行緒做兩件事就出錯
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//當點擊開始監聽的時候,在服務器端創建一個負責監聽IP地址跟埠的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;// 提供監聽所有客戶端IP
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtport.Text));//系結IP和埠
socketWatch.Bind(point);//系結監聽
socketWatch.Listen(10);//設定監聽列隊
ShowMsg("開始監聽");
Thread th = new Thread(Listen);//創建執行緒
th.IsBackground = true;//設為后臺執行緒
th.Start(socketWatch);//告訴CPU 監聽的socketWatch執行緒準備好了.
}
void ShowMsg(string str)
{
txtlog.AppendText(str + "\r\n");
}
/// <summary>
/// 等待客戶端連接,并且創建與之通信的Socket
/// </summary>
///
Socket socketSend;
void Listen(object o) //呼叫這個方法的時候把o做為引數調進來
{
Socket socketWatch = o as Socket; //as把o強轉為Socket,如果成功為true,否則為空
while (true)
{
socketSend = socketWatch.Accept();//負責和客戶端通信的socketSend
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "連接成功");//拿到客戶端的IP和埠
//將遠程連接的客戶端的IP地址和Socket存入鍵值集合中
dicsocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//將遠程連接的客戶端的IP地址和Socket存入下拉框中
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
Thread th = new Thread(Recive);//創建Recive執行緒接收客戶端的資料
th.IsBackground = true;//設為后臺執行緒
th.Start(socketSend);//告訴CPU 監聽的socketSend執行緒準備好了.
}
}
/// <summary>
/// 服務端不停的接收客戶端發來的訊息
/// </summary>
/// <param name="o"></param>
///
void Recive(object o)
{
Socket socketSend = o as Socket; //as把o強轉為Socket,如果成功為true,否則為空
while (true)//回圈接收用戶的資料
{
byte[] buffer = new byte[1024 * 1024 * 2]; //建立緩沖區
int r = socketSend.Receive(buffer);//接收到的資料存到緩沖區,并回傳int 值
if (r == 0)//判斷接收的資料是空那么就關閉,否則一直回圈空訊息
{
break;
}
//用UTF8解碼傳過來的數字從0開始到r結束
string str = Encoding.UTF8.GetString(buffer, 0, r);
//解碼完成添加到txtlog
ShowMsg(socketSend.RemoteEndPoint + ":" + str);
}
try
{
}
catch (Exception)
{
throw;
}
}
//創建鍵值對集合,將遠程連接的客戶端的IP地址和Socket存入鍵值集合中
Dictionary<string, Socket> dicsocket = new Dictionary<string, Socket>();
private void button4_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();//Trim是洗掉前后空格
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//將文本字符轉為位元組
List<byte> list = new List<byte>();//宣告泛型集合,以后可以知道發送給客戶端什么型別的資料
list.Add(0);
list.AddRange(buffer);
//將泛型集合轉換為陣列
byte[] newBuffer = list.ToArray();
//獲得用戶在下拉框cboUsers中的IP地址和埠
string ip = cboUsers.SelectedItem.ToString();
dicsocket[ip].Send(newBuffer);
// socketSend.Send(buffer);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
客戶端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 客戶端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//監聽設定了執行緒,不讓主執行緒知道,否則主執行緒做兩件事就出錯
}
Socket socketSend;//創建負責連接的Socket
/// <summary>
/// 連接服務器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//當點擊開始監聽的時候,在服務器端創建一個負責監聽IP地址跟埠的Socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);//IP地址
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtport.Text));//系結IP和埠
socketSend.Connect(point);//連接遠程服務器應用程式的IP和埠
ShowMsg("連接成功");
//開啟一個新的執行緒,不停的接收服務端發來的訊息
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start();
}
private void Form1_Load(object sender, EventArgs e)
{
}
void ShowMsg(string str)
{
textBox3.AppendText(str + "\r\n");
}
/// <summary>
/// 客戶端不停的接收服務端發來的訊息
/// </summary>
/// <param name="o"></param>
void Recive(object o)
{
while (true)
{
byte[] buffer = new byte[1024 * 1024 * 3];//宣告位元組陣列
int r = socketSend.Receive(buffer);
if (r == 0)
{
break;
}
//0表示接收到文字訊息
if (buffer[0] == 0) //文字訊息處理
{
string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
ShowMsg(socketSend.RemoteEndPoint + ":" + str);
}
}
}
/// <summary>
/// 客戶端給服務器發送訊息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();//客戶端要發送到服務器的訊息,集中到字串
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//將文本字串轉為位元組
socketSend.Send(buffer);//發送位元組到已連接服務器
}
private void button3_Click(object sender, EventArgs e)
{
socketSend.Close();
}
}
}
uj5u.com熱心網友回復:
自己已經解決!謝謝uj5u.com熱心網友回復:
請問您怎么解決的呀,我也遇到在服務器接收資料的程序中出現了被遠程主機關閉現有連接的問題?非常感謝,請指導一下uj5u.com熱心網友回復:
這個錯誤很正常,try...catch就可以了uj5u.com熱心網友回復:
可是照理說加了try...catch只是捕獲了這個錯誤而已,而我也試了,事實也是這樣,請問您不是這樣的結果嗎uj5u.com熱心網友回復:
請問你是怎么解決的呢,我也遇到這個問題,服務端接收資料的時候顯示“遠程主機強迫關閉一個現有連接”。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/191344.html
標籤:C#
下一篇:web程式事件的處理
