上面发了服务器端,没发客户端,现在补上!不知道写的好不好,见笑了
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();
}
}