小小改动:
Socket sk;
Socket newsk;
Thread xc;
private IPAddress getip()
{
IPHostEntry zhuji=Dns.Resolve(Dns.GetHostName());
return zhuji.AddressList[0];
}
private void kaishi()
{
IPAddress ip=getip();
this.label1.Text=getip().ToString();
IPEndPoint dizhi=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sk.Bind(dizhi);
sk.Listen(50);
newsk=sk.Accept();
xc=new Thread(new ThreadStart(go));
xc.Start();
}
private void go()
{
int recv;
while(true)
{
byte[] by=new byte[235];
recv=newsk.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by,0,recv);
this.richTextBox1.AppendText(sj);
}
}
private void button2_Click(object sender, System.EventArgs e)
{
kaishi();
}
Socket sk;
Socket newsk;
Thread xc;
private IPAddress getip()
{
IPHostEntry zhuji=Dns.Resolve(Dns.GetHostName());
return zhuji.AddressList[0];
}
private void kaishi()
{
IPAddress ip=getip();
this.label1.Text=getip().ToString();
IPEndPoint dizhi=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sk.Bind(dizhi);
sk.Listen(50);
newsk=sk.Accept();
xc=new Thread(new ThreadStart(go));
xc.Start();
}
private void go()
{
int recv;
while(true)
{
byte[] by=new byte[235];
recv=newsk.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by,0,recv);
this.richTextBox1.AppendText(sj);
}
}
private void button2_Click(object sender, System.EventArgs e)
{
kaishi();
}
解决方案 »
- C#winform中嵌入flash 让flash能透明播放的问题
- SQLite数据库的多次查询,使用多线程可以改善程序执行速度吗?
- wince winform问题
- C# winform 中treeview如何绑定数据源
- LoadRunner8.1如何测试WinForm程序
- 急急急!!! 100分求ComboBox数据帮定后数据源的更新问题
- c#序列化一个页面
- 请教各位,关于获取mp3文件长度的几个问题
- 重发请问:为什么会这样呢?谢谢~
- dataset 中的dataset.tables[0].rows[0]代表什么?
- 怎么调用OCX的问题,分不够再加啊
- Application.EnableVisualStyles();之后工具栏上的图标不显示了!
{
while(true)
{
newsk=sk.Accept();
byte[] by=new byte[235];
newsk.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by);
this.richTextBox1.AppendText(sj);
}
}
应该是这一段有问题, 像上面这样的话,如果第一次接受客户端的连接,同第一个客户端之间数据传输不完成断开之前,第二个客户端连接不上是吧?应该在
newsk=sk.Accept();
之后,另外启动一个线程去完成接收数据的工作,而让go()来继续等待另外一个客户端的连接。
{
public Socket newsocket;
public void go()
{
while(true)
{
byte[] by=new byte[235];
newsocket.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by);
this.richTextBox1.AppendText(sj);
}
}
private void kaishi()
{
IPAddress ip=getip();
this.label1.Text=getip().ToString();
IPEndPoint dizhi=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sk.Bind(dizhi);
sk.Listen(50);
while(true)
{
newsk=sk.Accept();
t thd = new t();
t.newsocket = newsk;
xc=new Thread(new ThreadStart(thd.go));
xc.Start();
}}
class t
{
public Socket newsocket;
public Form1 fm1; // 指向父窗口
public void go()
{
while(true)
{
byte[] by=new byte[235];
newsocket.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by);
fm1.richTextBox1.AppendText(sj); // 把 this 改成父窗口
}
}
private void kaishi()
{
IPAddress ip=getip();
this.label1.Text=getip().ToString();
IPEndPoint dizhi=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sk.Bind(dizhi);
sk.Listen(50);
while(true)
{
newsk=sk.Accept();
t thd = new t();
thd.newsocket = newsk;
thd.fm1 = this; // this 传给 thd
xc=new Thread(new ThreadStart(thd.go));
xc.Start();
}}应该差不多了
newsk=sk.Accept();
就是这样的,sk继续侦听,(下一轮循环时会再次阻塞在此)等待新的client请求,newsk是新建的socket(所谓socket是两端的ip加两端的端口),负责通讯;如果再有另外的client,将有新的newsk(又是一个新的socket,也同样传给t中的newsocket)