private static void Send(Socket handler, String data) {
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);
} private static void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket handler = (Socket) ar.AsyncState; // Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent); handler.Shutdown(SocketShutdown.Both);
handler.Close(); } catch (Exception e) {
Console.WriteLine(e.ToString());
}
}while(true)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s = Connect(ref s);
Send(s, "内容字符串");
}现在的问题是:
1。每次发送时,都必须新new 一个socket对象,这样太耗资源, 但不这样程序,程序会报错:无法访问已释放的对象
2。运行运行一会之后,接收端会报错:大概是什么连接已断开之类的。仅剩83分,大家请别嫌少,以后分多了再散 。
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);
} private static void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket handler = (Socket) ar.AsyncState; // Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent); handler.Shutdown(SocketShutdown.Both);
handler.Close(); } catch (Exception e) {
Console.WriteLine(e.ToString());
}
}while(true)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s = Connect(ref s);
Send(s, "内容字符串");
}现在的问题是:
1。每次发送时,都必须新new 一个socket对象,这样太耗资源, 但不这样程序,程序会报错:无法访问已释放的对象
2。运行运行一会之后,接收端会报错:大概是什么连接已断开之类的。仅剩83分,大家请别嫌少,以后分多了再散 。
//外部
Socket soc= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//内部while(true)
{
Socket s = soc.Accept();
s = Connect(ref s);
Send(s, "内容字符串");
}
要发的消息,直接插入队列中
socket一直链接着,当发现队列非空是,就取消息出来发送
报错:soc.Accept(); 在执行此操作前必须先调用 Listen 方法。
handler.Close();这后,不需要再每次 new 一个SOCKE.但接收的数据就有问题了,每收到一次数据,会有以前发送的数据在里面。不知道这是为什么。
问题二:不知道你说的是服务端还是客户端,但是无论什么地方报错,都是正常的,你需要用try-catch捕获这类错误并处理无法正常通讯的情况,毕竟网络传输双方都可能给你随时断开连接。另外我找下我写过的文件传输代码给你看看吧,等下。
太感谢了。
我 屏蔽了这两句: handler.Shutdown(SocketShutdown.Both);
handler.Close(); 以后我再要传消息的时候 ,就不需要再 new SOCKET和 重新连接了但是收到的数据就乱了,本来每次发送只有200字节的数据,在第二次接收时,发现接收到的数据变成了1024字节,他加上了以前接收的数据。
http://download.csdn.net/source/1782137虽然下载后回复一下,就返还下载资源分了(还额外送一分),但要是你目前资源分0分就不能下载,可以去这个网盘下载,我同样上传了一份,但是长时间无人下载,这个链接就会无效的:
http://www.megaupload.com/?d=1FHI9KD3你先下载了看看实际的数据收发,项目运行环境VS2008,除去了我原先很多随意性的代码,重新优化组织了用户交互输入和日志记录。再有不懂的回帖询问吧。
能帮我看看8楼的那个问题吗?
二、将里面的cs文件内部代码复制进去,如果出现错误。看会有哪些错误,一一修改——这也可以锻炼自己查错的能力。一般错误无法是名称不匹配造成的,比如解决方案名和我的不一样,或者类名不一样,自己修改下应该可以搞定。
三、里面唯一需要大动手术的代码,就是Action<string>这个委托。这个也好办,你照下面的方法调整即可:
找到“Action<string> showMessage;”
然后更改为如下两行代码
delegate void Action(string msg);
Action showMessage;
handler.Shutdown(SocketShutdown.Both);
handler.Close(); 你可以试一下。我现在贴出我发送的内容,和接收到的内容:我发送的内容是:
第一次: abcdefg18:09:33:3281
第二次: abcdefg18:09:33:3281
第是接收到的数据却是:
第一次接收:abcdefg18:09:33:3281
第二次接收:abcdefg18:09:33:3281abcdefg18:09:33:3281他把第一次发的数据也放在里面了,不知道为什么。 您不信可以运行一下那代码。
state.buffer, 0, bytesRead)); 我一直没注意到这句话....