SOCKET問題???出血1000分搞清楚它。


http://vod.km2000.com/xxxx/socket.rar
1:程序關閉不了。
2:服務端與多客戶端,不知道服務端怎么指定與其中某個連接通信。
3:服務端怎么給全部客戶端通信。
各位大哥,小弟菜,代碼在上面,麻煩各位大哥幫忙改正帖出來或者發到我郵件里wmhnq@126.com
非常感謝!!!

17 个解决方案

#1


1、程序關閉不了是因為退出時沒關閉線程。
應先定義 private Thread pThread;

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
if(pThread!=null)
if(pThread.IsAlive)
pThread.Abort();
sk.Close();

}
catch{}
}

#2


ding

#3


暈了
關閉程序的時候線程沒關
一會我機器的CPU就彪到100%


================================================================
此帖通過csdn小助手回復。
    CSDN小助手是使用vb.net編寫的CSDN論壇脫機“外掛”,她能夠在
脫離IE的情況下使用Csdn論壇。程序只加載最核心的數據,所以顯示更
快,產生的流量更小。

    下載地址:http://qqwwee.com/csdn.rar
================================================================

#4


1:程序關閉不了。
---------------------
把代碼貼出來,看看哪里錯了

2、服務端與多客戶端,不知道服務端怎么指定與其中某個連接通信。
------------------------------
通過Accept方法返回的socket已經是點對點連接了,這是服務端已經已具體客戶端連接(TCP方式)

3:服務端怎么給全部客戶端通信。
---------------------------------
記錄所有客戶端的ip,端口,一一請求連接(tcp),或廣播(udp)

#5


http://vod.km2000.com/xxxx/socket.rar
打不開

#6


private void accept()
{
while(true)
{
try
{
k=sk.Accept();
this.listBox2.Items.Add(k.RemoteEndPoint.ToString());
Thread pThread = new Thread(new ThreadStart(receive));
pThread.Start();
}
catch{}
}
}

關鍵這里
k=sk.Accept();
this.listBox2.Items.Add(k.RemoteEndPoint.ToString());
你為什么不把k放在數組里呢,讓k數組和listBox2的對應起來,這樣一個客戶端就一個socket鏈接,對要說話的客戶端交流就用特定的鏈接不就OK呢。

你的問題錯在,k是可變的,當客戶端A鏈接時,k負責和A鏈接,B鏈接是,k負責和B鏈接,和A負責鏈接的線掉了。

#7


2和3的實現方法太多,我說下我的思路:客戶端發信息給服務器段時先發ip,這樣就知是哪個客戶端發的,而服務器段應做成多線程,若有新的ip發出請求就新開一條線程做通信。3可以通過服務器端的接受ip的記錄進行發送。

#8


LZ很幽默
private void start()
{
IPAddress ip=getip();
IPEndPoint xx=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
byte[] by=new byte[100];
sk.Bind(xx);
sk.Listen(10);
        Thread pThread = new Thread(new ThreadStart(accept));
pThread.Start();
}

private void accept()
{
while(true)
{
try
{
k=sk.Accept();
this.listBox2.Items.Add(k.RemoteEndPoint.ToString());
Thread pThread = new Thread(new ThreadStart(receive));
pThread.Start();
}
catch{}
}
}

private void receive()
{
while(true)
{
byte[] by=new byte[1024];
k.Receive(by);
string a=System.Text.Encoding.Default.GetString(by);
this.listBox1.Items.Add(a);
}
}

#9


沒有這樣寫無限循環的
private void accept()
{
while(true)
{
try
{
k=sk.Accept();
this.listBox2.Items.Add(k.RemoteEndPoint.ToString());
Thread pThread = new Thread(new ThreadStart(receive));
pThread.Start();
}
catch{}
}
}

還有這個
private void receive()
{
while(true)
{
byte[] by=new byte[1024];
k.Receive(by);
string a=System.Text.Encoding.Default.GetString(by);
this.listBox1.Items.Add(a);
}
}

#10


LZ為何沒有考慮客戶斷開連接后服務器的嗣后工作呢?

#11


mark

#12


幫忙改正改正了,非常感謝,一定給1000分。

#13


LZ
參考這個
http://blog.csdn.net/zhiang75/archive/2004/08/16/75915.aspx

#14


up

#15


加我qq,我來解答你的問題。
qq:420957076

#16


問題解決了嗎?我有例子。xuc2004@126.com

#17


mark

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com