c# socket 多线程问题

epngllh 2009-03-24 07:06:05
问题是这样的,我在写一个socket服务端的应答程序,使用同步操作方式,程序打开,开始侦听,代码如下:
//程序开始运行,监听话机,启用了多线程.
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress serverIP = IPAddress.Parse(ipaddressnow);
IPEndPoint serverhost = new IPEndPoint(serverIP, Convert.ToInt32(ipportnow));
serverSocket.Bind(serverhost);
serverSocket.Listen(200);

while(true)
{
try
{
//在套接字上接收接入的连接
Socket s = serverSocket.Accept();
clientSocket = s;
ListenClient lc = new ListenClient(clientSocket);
clientThread = new Thread(new ThreadStart(lc.ServerThreadProc));
clientThread.Start();
}
catch (Exception ex)
{
MessageBox.Show("listening Error: " + ex.Message);
}
}


代码里,把接收客户端并处理客户端的信息全部放在ListenClient类里进行处理.

现在的问题是,我想把处理的一些信息发回到主线程的显示框里显示出来.我知道要用委托,但不知道在类里面怎么调用.请高手帮忙..
...全文
302 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjsun138 2009-08-25
  • 打赏
  • 举报
回复
学习学习
lixianyi08 2009-04-22
  • 打赏
  • 举报
回复
学习学习
alldj 2009-03-24
  • 打赏
  • 举报
回复
呵呵,看错问题了,解答如下:

CrossThreadOperationControl sendmsg = delegate()
{
rtLog.Text = "消息……";
rtLog.Select(rtLog.TextLength, 0);
rtLog.ScrollToCaret();
};

rtLog.Invoke(sendmsg);
epngllh 2009-03-24
  • 打赏
  • 举报
回复
楼上的代码给我.好像没用.
alldj 2009-03-24
  • 打赏
  • 举报
回复
class Sock
{

private Socket m_sock;
private IPEndPoint m_serverEndPoint;

public Sock(int localPort, int servPort, string servIPAddr)
{
IPAddress localAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(localAddress, localPort);

IPAddress serverAddress = IPAddress.Parse(servIPAddr);
m_serverEndPoint = new IPEndPoint(serverAddress, servPort);

m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_sock.Bind(localEndPoint);
}

~Sock()
{
if (m_sock != null)
{
m_sock.Shutdown(SocketShutdown.Both);
m_sock.Close();
}
}

public int SendData(String msg)
{
Byte[] buf = Encoding.ASCII.GetBytes(msg.ToCharArray());
return m_sock.SendTo(buf, m_serverEndPoint);
}

public int ReceiveData(ref String data)
{
Byte[] buf;
buf = new Byte[4096];
EndPoint servPort = (EndPoint)m_serverEndPoint;
int len = m_sock.ReceiveFrom(buf, ref servPort);
if (len > 0)
{
data = Encoding.Unicode.GetString(buf, 0, len);
}

return len;
}


}
gisyellow 2009-03-24
  • 打赏
  • 举报
回复
ListenClient类:
public delegate void SomeMessageEventHandler(string strMsg);
public event SomeMessageEventHandler SomeMessageEvent = null;

在需要触发事件的方法中:
if(SomeMessageEvent != null)
{
SomeMessageEvent(strMessage);//需要传递的消息,可以是对象,或者其他参数,不必一定是字符串,看委托如何声明
}

主线程:
ListenClient lc = new ListenClient(clientSocket);
lc.SomeMessageEvent += new SomeMessageEventHandler(lc_SomeMessageEvent);

处理方法:
private void lc_SomeMessageEvent(string strMsg)
{
//处理消息
}
yangjipei 2009-03-24
  • 打赏
  • 举报
回复
接分

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧