日期:2014-05-18 浏览次数:21156 次
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.Threading;
using System.Net.Sockets;
namespace WindowsForms
{
public partial class Form1 : Form
{
//我想做一个多人聊天的程序,参考了一下网上的代码。
//首先创建一个监听的线程(主线程),然后监听2012端口。一旦有新连接,创建另外一个处理线程
//处理消息,目前发现一些问题(该程序是服务端的)。
//这两个变量在运行时会提示从不是创建的线程访问,如何让这两个变量线程安全访问??
Thread ListenThread;
Thread ServiceThread;
Socket ServiceSocket;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ListenThread = new Thread(new ThreadStart(StartListen));
ListenThread.Start();
}
private void StartListen()
{
TcpListener server = new TcpListener(2012);
server.Start();
while (true)
{
//以下的ServiceSocket和ServiceThread全局变量需要在【标记1】和【标记2】之间不被其他线程更改
//【标记1】
ServiceSocket = server.AcceptSocket();
ServiceThread = new Thread(new ThreadStart(StartService));
ServiceThread.IsBackground = true;
ServiceThread.Start();
}
}
private void StartService()
{
//这里需要得到全局变量ServiceThread和ServiceSocket,仍然会提示从不是创建的线程访问。
//如果不将变量ServiceThread设为全局,如何才能在函数中得到自己是属于哪个线程??
//如果使用委托,这怎么处理啊。需要把【标记1】和【标记2】之间的语句放入委托函数中,不清楚怎么弄。
Thread thread = ServiceThread;
Socket socket = ServiceThread;
//【标记2】
Boolean active = true;
while(active)
{
byte[] buffer = new byte[10000000];
socket.Receive(buffer);
//一些其他处理过程
}
}
}
}