原文出自:http://xidianwk.spaces.live.com/blog/cns!F2482102835C40AD!375.entryc#的TCP/IP編程我記得剛開始學VC的時候,就接到一些項目,裡面就用到了TCP/IP編程,當時因為是剛剛起步,因此在啃了N多的資料之後算是搞定了,但是如何?多線成,當時寫的並不是很成熟,因此,這次寫基於C#的TCP/IP通訊的時候,就必須考慮這個多線程的問題,下面是我的一個C/S通訊程式,裡面用到了多線程技術,比較完美的解決了問題,貼出代碼:服務段的:Int32 port=12345;
//TcpListener server=new TcpListener(port);
m_server=new TcpListener(port);
try
{
//m_server=server;
TextBox1.Text="已經開始了";
m_server.Start();
Thread m_thread=new Thread(new ThreadStart(GetConn));//開啟線成
m_thread.Start();//運行
}
catch(SocketException ae)
{
MessageBox.Show("錯誤源"+ae.Source+"表示"+ae.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
private void GetConn()//線成函數
{
m_client=m_server.AcceptTcpClient();
TcpClient c=this.m_client;
Thread m_thread=new Thread(new ThreadStart(GetConn));
m_thread.Start();//線程中開闢另外一個新的線成,這樣掛起請求全部在新的線程等待,因此不用一個while(true)的迴圈,有效地解決了程式“假死”現象
NetworkStream stream=c.GetStream();//下面就是一些讀和寫了,沒有什麼含量,不解釋了
byte[] recv=new byte[256]; string msg="";
string temp;
try
{
int a=0;
a=stream.Read(recv,0,256);
if(a>0)
{
temp=System.Text.Encoding.ASCII.GetString(recv,0,a);
msg+=temp;
//recv.SetValue(0,0);
//a=stream.Read(recv,0,256);
}
MessageBox.Show(msg);
stream.Write(System.Text.Encoding.ASCII.GetBytes(msg),0,msg.Length);
stream.Close();
c.Close();
}
catch(SocketException es)
{
MessageBox.Show("錯誤源"+es.Source+"表示"+es.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}///////////////////////////////////////用戶端的代碼:private void button1_Click(object sender, System.EventArgs e)
{
string str=textBox1.Text;
if(str.Length<=0)
{
MessageBox.Show("請輸入字元");
return;
}
byte[] send=new byte[str.Length];
send=System.Text.Encoding.ASCII.GetBytes(str);
try
{
TcpClient m_client=new TcpClient("192.168.3.65",12345);
NetworkStream stream=m_client.GetStream();
stream.Write(send,0,send.Length);
int len=stream.Read(send,0,send.Length);
string aa=System.Text.Encoding.ASCII.GetString(send,0,len);
stream.Close();
m_client.Close();
MessageBox.Show(aa);
}
catch(SocketException aa)
{
MessageBox.Show(aa.Message);
}
}//不進行解釋了,沒有什麼意思附加:早晨進行編碼的時候測試發現不能發送中文,應該是編碼那邊的問題,把Encoding.ASCII修改為Encoding.UT8就可以了。下面是圖片了: