TCP客户端

上面发了服务器端,没发客户端,现在补上!不知道写的好不好,见笑了 

C# code

public partial class Form1 : Form

{

private TcpClient client;

private bool isExit = false;

private NetworkStream networkStream;

private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);

#region 用于一个线程操作另一个线程的控件

private delegate void SetListBoxCallback(string str);

private SetListBoxCallback setListBoxCallBack;

private delegate void SetRichTextBoxCallback(string str);

private SetRichTextBoxCallback setRichTextBoxCallBack;

#endregion

public Form1()

{

InitializeComponent();

listBoxStatus.HorizontalScrollbar = true;

setListBoxCallBack = new SetListBoxCallback(SetListBox);

setRichTextBoxCallBack = new SetRichTextBoxCallback(SetReceiveText);

}

//状态显示

private void SetListBox(string str)

{

listBoxStatus.Items.Add(str);

listBoxStatus.SelectedIndex = listBoxStatus.Items.Count - 1;

listBoxStatus.ClearSelected();

}

//接收客户端信息

private void SetReceiveText(string str)

{

richTextBoxReceive.AppendText(str);

}

//连接服务器....

private void buttonConnet_Click(object sender, EventArgs e)

{

client = new TcpClient(AddressFamily.InterNetwork);

//得到服务器IP

IPAddress ip= IPAddress.Parse("127.0.0.1");

//创建一个委托,并知名在异步操作完成时执行的方法

AsyncCallback callback = new AsyncCallback(RequestCallBack);

allDone.Reset();

client.BeginConnect(ip, 7100, RequestCallBack, client);

}

private void RequestCallBack(IAsyncResult ar)

{

allDone.Set();

try

{

client = (TcpClient)ar.AsyncState;

client.EndConnect(ar);

listBoxStatus.Invoke(setListBoxCallBack, string.Format("与服务器{0}连接成功", client.Client.RemoteEndPoint));

networkStream = client.GetStream();

ReadObject readObject = new ReadObject(networkStream, client.ReceiveBufferSize);

networkStream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallBack, readObject);

}

catch (Exception e1)

{

listBoxStatus.Invoke(setListBoxCallBack, e1.Message);

return;

}

}

//异步操作完成时执行的回调调用的方法

private void ReadCallBack(IAsyncResult ar)

{

try

{

ReadObject ro = (ReadObject)ar.AsyncState;

int count = ro.netStream.EndRead(ar);

richTextBoxReceive.Invoke(setRichTextBoxCallBack, System.Text.Encoding.UTF8.GetString(ro.bytes, 0, count));

if (isExit == false)

{

ro = new ReadObject(networkStream, client.ReceiveBufferSize);

networkStream.BeginRead(ro.bytes, 0, ro.bytes.Length, ReadCallBack, ro);

}

}

catch (Exception e2)

{

listBoxStatus.Invoke(setListBoxCallBack, e2.Message);

return;

}

}

//发送数据

private void SendString(string str)

{

try

{

byte[] by = System.Text.Encoding.UTF8.GetBytes(str+"\r\n");

networkStream.BeginWrite(by, 0, by.Length, new AsyncCallback(SendCallBack), networkStream);

networkStream.Flush();

}catch(Exception e3){

listBoxStatus.Invoke(setListBoxCallBack, e3.Message);

return;

}

}

//发送数据回调的方法

private void SendCallBack(IAsyncResult ar)

{

try

{

networkStream.EndWrite(ar);

}

catch (Exception e4)

{

listBoxStatus.Invoke(setListBoxCallBack, e4.Message);

return;

}

}

private void buttonSend_Click(object sender, EventArgs e)

{

SendString(richTextBoxSend.Text);

richTextBoxSend.Clear();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

isExit = true;

allDone.Set();

}

}

 

posted @ 2011-11-03 16:45  虫虫虫虫飞  阅读(296)  评论(0)    收藏  举报