关于异步通信的问题

navisl 2013-04-07 11:33:18
我想写一个最简单的异步通信,就是把客户端的一个字符串传入服务器端,在服务器端倒序之后传回客户端显示,不知道是不是我这样写,而且在客户端还有报错,求高人指点。代码如下:
服务器端:
namespace SimpleServer
{
public partial class Form1 : Form
{
private Thread ListenerThread;
TcpListener tcpListener = null;

public Form1()
{
InitializeComponent();
ListenerThread = new Thread(new ThreadStart(ListenerThreadMethod));
ListenerThread.IsBackground = true;
ListenerThread.Start();
}

public void ListenerThreadMethod()
{
TcpClient tcpClient = null;
NetworkStream networkStream = null;
try
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
tcpListener = new TcpListener(ip, 7777);
tcpListener.Start();
}
catch
{
MessageBox.Show("不能建立服务器");
}
while (true)
{
try
{
tcpClient = tcpListener.AcceptTcpClient();
//对收到的请求做处理
List<byte> reData = new List<byte>();
byte[] reDataBytes = new byte[tcpClient.ReceiveBufferSize];
int n = 0;
networkStream = tcpClient.GetStream();
if (networkStream.CanRead)
{
do
{
n = networkStream.Read(reDataBytes, 0, (int)tcpClient.ReceiveBufferSize);
if (n == (int)tcpClient.ReceiveBufferSize)
reData.AddRange(reDataBytes);
else if (n != 0)
{
byte[] bytes1 = new byte[n];
for (int i = 0; i < n; i++)
{
bytes1[i] = reDataBytes[i];
}
reData.AddRange(bytes1);
}
} while (networkStream.DataAvailable);
}
reDataBytes = reData.ToArray();
//字符串倒序
string reString = Encoding.UTF8.GetString(reDataBytes);
string tempString = "";
for (int i = reString.Length - 1; i >= 0; i--)
{
tempString += reString[i];
}
byte[] data = Encoding.UTF8.GetBytes(tempString);
networkStream.BeginWrite(data, 0, data.Length, new AsyncCallback(DownLoadCallBackF), networkStream);
}
catch
{
}
}
}

public void DownLoadCallBackF(IAsyncResult ar)
{
NetworkStream networkStream = (NetworkStream)ar.AsyncState;
try
{
networkStream.EndWrite(ar);
}
catch
{
}
finally
{
if (networkStream != null)
networkStream.Close();
}
}
}
}


客户端:
namespace SimpleClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
TcpClient tcpClient = new TcpClient();
tcpClient.BeginConnect(IPAddress.Parse("127.0.0.1"), 7777, new AsyncCallback(DownloadCallBackF), tcpClient);
}

public byte[] ReadFromTcpClient(TcpClient tcpClient)
{
List<byte> data = new List<byte>();
NetworkStream networkStream = null;
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
int n = 0;
try
{
networkStream = tcpClient.GetStream();
if (networkStream.CanRead)
{
do
{
n = networkStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
if (n == (int)tcpClient.ReceiveBufferSize)
data.AddRange(bytes);
else if (n != 0)
{
byte[] bytes1 = new byte[n];
for (int i = 0; i < n; i++)
bytes1[i] = bytes[i];
data.AddRange(bytes1);
}
} while (networkStream.DataAvailable);
}
bytes = data.ToArray();
}
catch
{
MessageBox.Show("读取数据失败");
bytes = null;
}
finally
{
if (networkStream != null)
networkStream.Close();
tcpClient.Close();
}
return bytes;
}

public void DownloadCallBackF(IAsyncResult ar)
{
TcpClient tcpClient = (TcpClient)ar.AsyncState;
try
{
tcpClient.EndConnect(ar);
NetworkStream netStreamSend = null;
byte[] netSend = new byte[textBox1.Text.Length];
netSend = Encoding.UTF8.GetBytes(textBox1.Text);
netStreamSend.BeginWrite(netSend, 0, netSend.Length, new AsyncCallback(SendCallBackF), netStreamSend);
}
//此处捕获异常“未将对象引用设置到对象的实例。”
catch
{
MessageBox.Show("连接失败");
return;
}
byte[] bytes = ReadFromTcpClient(tcpClient);
textBox2.Text = Encoding.UTF8.GetString(bytes);
}

public void SendCallBackF(IAsyncResult ar)
{
NetworkStream netStream = (NetworkStream)ar.AsyncState;
try
{
netStream.EndWrite(ar);
}
catch
{
}
finally
{
if (netStream != null)
netStream.Close();
}
}
}
}
...全文
253 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
敌敌畏耶 2013-04-08
  • 打赏
  • 举报
回复
引用 7 楼 navisl 的回复:
引用 6 楼 yuekunge 的回复:NetworkStream netStreamSend = null; 你这里声明后 没有给他复制··你看是不是·· 所以会 捕获异常“未将对象引用设置到对象的实例。”的异常··· 请问该怎么赋值? NetworkStream netStreamSend = new NetworkStream(这里只能放入socket对象……
NetworkStream netStreamSend = tcpClient.GetStream(); 这样不行嘛? 你看你客户端地62行到66行···netStreamSend 有赋值?
navisl 2013-04-07
  • 打赏
  • 举报
回复
思路我知道,就是客户端发送数据给服务器端,服务器端接收、处理,然后将数据发送回客户端。但是我不知道异步通信是不是这样写。。我这个是把一个异步下载的程序改成这样的。
狼烟辉 2013-04-07
  • 打赏
  • 举报
回复
这么多代码,可以先写个思路。
navisl 2013-04-07
  • 打赏
  • 举报
回复
引用 6 楼 yuekunge 的回复:
NetworkStream netStreamSend = null; 你这里声明后 没有给他复制··你看是不是·· 所以会 捕获异常“未将对象引用设置到对象的实例。”的异常···
请问该怎么赋值? NetworkStream netStreamSend = new NetworkStream(这里只能放入socket对象 我用的是TcpClient。。放不进去);
敌敌畏耶 2013-04-07
  • 打赏
  • 举报
回复
NetworkStream netStreamSend = null; 你这里声明后 没有给他复制··你看是不是·· 所以会 捕获异常“未将对象引用设置到对象的实例。”的异常···
敌敌畏耶 2013-04-07
  • 打赏
  • 举报
回复
tcpListener.Start();之后添上 this.tcpListener.BeginAcceptTcpClient(OnListenCallback, tcpListener); OnListenCallback: 回调函数 在回调函数里执行你的逻辑代码,把whie代码放到回调函数里。 这个就是异步的一种方式
navisl 2013-04-07
  • 打赏
  • 举报
回复
报错我已经写在了代码的注释中了。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧