C#中Socket多线程编程实例
时间:2025-07-08
时间:2025-07-08
非常有用的实例
//客户端form
using System;
using System.Collections.Generic;
using http://ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TCPClient
{
public partial class ClientForm : Form
{
private P2PClient ClientObj = new P2PClient();// 客户端对象
public ClientForm()
{
InitializeComponent();
}
非常有用的实例
EventArgs e)
{ bntSend.Enabled = false;//没有连接不允许发送数据
// this.AcceptButton = bntSend;
button1.Enabled = false;//没有连接,不能断开 }
private
EventArgs e)
{
string nickName = tbName.Text;
string ip = tbIP.Text;
string port = tbPort.Text;
if (string.IsNullOrEmpty(nickName) || void btnConnect_Click(object sender, string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(port)) {
MessageBox.Show("请将昵称,ip填写完整");
return;
}
try
非常有用的实例
ClientObj.SendConnection(ip,
Convert.ToInt32(port));//连接
//订阅事件的处理方法
ClientObj.receiveEvent += new P2PClient.receiveDelegate(ClientObj_receiveEvent);
ClientObj.Send(tbName.Text+"***"+"登陆成功!***"+ DateTime.Now.ToString());
bntSend.Enabled = true;
btnConnect.Enabled = false;
button1.Enabled = true;//连接后才能断开连接 }
catch(Exception ex)
{
MessageBox.Show("连接时出错:"+ex.Message);
return;
}
}
非常有用的实例
void ClientObj_receiveEvent(string receiveData) {
try
{
if (this.InvokeRequired)//指示是否需要在这个线程上调用方法
{ //当把消息传递给控件线程时重复调用该方法;就会调用else
P2PClient.receiveDelegate update = new P2PClient.receiveDelegate(ClientObj_receiveEvent);
this.Invoke(update, new object[] { receiveData });//将消息发送给控件线程处理
}
else
{
lbMessage.Items.Add(receiveData);//添加数据
}
}catch(Exception ex){
MessageBox.Show("接收数据错误:"+ex.Message);
return;
非常有用的实例
}
}
private void bntSend_Click(object sender, EventArgs e)
{
try
{
if(string.IsNullOrEmpty(tbMessage.Text)){ return;
}
ClientObj.Send(tbName.Text+"说: "+tbMessage.Text +" "+ DateTime.Now .ToString());//发送信息
tbMessage.Clear();//清除原来的文本
}catch(Exception ex){
MessageBox.Show("发送数据出错"+ex.Message);
return;
非常有用的实例
}
private void button1_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确定要断开连接吗", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK) {
ClientObj.Send(this.tbName.Text+" 下线了 " +DateTime.Now.ToString());
Application.Exit();//如果确定则跳出 //ClientObj.tcpClientObj.Close();//关闭连接
//ClientObj.CloseForm();
//this.Close();
非常有用的实例
}
}
}
//客户端类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using http://;
using http://.Sockets;
using System.Windows.Forms;
using System.IO;
namespace TCPClient
{
class P2PClient
{
非常有用的实例
public TcpClient tcpClientObj;//收发数据
private Thread receiveThread;//接收数据的线程
public delegate void receiveDelegate(string receiveData);//处理接收数据事件的方法类型
public event receiveDelegate receiveEvent;//接收数据的事件
//通过ip地址和端口号发送连接
public void SendConnection(string ip, int port) {
IPAddress ipAddr = IPAddress.Parse(ip);//转为ip地址后在连接会加快速度
tcpClientObj = new TcpClient();//连接客户端 tcpClientObj.Connect(ipAddr,port);//连接服务器 receiveThread =new Thread(Receiver);//启动接收线程
receiveThread.Start();
}
public void Send(string message)//发送消息 {
if (tcpClientObj == null) {
非常有用的实例
return;
}
NetworkStream
this.tcpClientObj.GetStream();//得到网络流
StreamWriter sw = new StreamWriter(ns); sw.WriteLine(message);//发送消息
sw.Flush();//将所有的缓冲数据写入基础数据流
ns.Flush();
}
private void Receiver() { //接收数据对应的线程(接收到数据以后触发事件)
while (true) {//一直接受
NetworkStream
this.tcpClientObj.GetStream();
StreamReader sr = new StreamReader(ns); string receivedata = sr.ReadLine(); receiveEvent(receivedata);//触发事件 }
}
ns = ns =
非常有用的实例
public void CloseForm()// 关闭线程
{
receiveThread.Abort();
}
}
}
服务器端类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using http://.Sockets;
using System.Threading;
using http://;
using System.Windows.Forms;
using System.IO;
namespace TCPServer