使C#做个小聊天工具
使用 socket 套接字实现异步接收,在进行接收图片时,因为图片没有压缩,直接已byte[]数组传送过来接收的
部分代码如下:
private Socket LocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private int size = 1024*64;
private Thread ListenThread;
private byte[] bytData;
/// <summary>
/// 监听方法,用于监听远程发送到本机的信息
/// </summary>
public void Listen()
{
ListenThread = new Thread(new ThreadStart(VideoListen));
ListenThread.Start();
}
/// <summary>
/// 监听线程
/// </summary>
private void VideoListen()
{
bytData = new byte[size]
while (true)
{
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="iar"></param>
private void ReceiveVideo(IAsyncResult iar)
{
int intRecv = 0;
try
{
intRecv = LocalSocket.EndReceiveFrom(iar, ref ipeRemote);
}
catch
{
//throw new Exception();
}第二次执行到LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);出现"未处理的SocketException"异常"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作"。
这个异常怎么处理啊? 由于socket 的在接收数据时,需要给其分配个缓冲区,这里的缓冲区是 1024*64 就是64K大小(就算改大点,我改到1000000以后同样会报出这个异常,执行receive以后byte[]数组再清空已经和socket的缓冲区无关了),由于socket是在死循环中,所以socket的缓冲区没有被复位,所以再接收信息的时候,就是在刚才接受到得数据的缓冲区后再接收数据。
何如能吧receive的缓冲区给手动复位呢?
使用 socket 套接字实现异步接收,在进行接收图片时,因为图片没有压缩,直接已byte[]数组传送过来接收的
部分代码如下:
private Socket LocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private int size = 1024*64;
private Thread ListenThread;
private byte[] bytData;
/// <summary>
/// 监听方法,用于监听远程发送到本机的信息
/// </summary>
public void Listen()
{
ListenThread = new Thread(new ThreadStart(VideoListen));
ListenThread.Start();
}
/// <summary>
/// 监听线程
/// </summary>
private void VideoListen()
{
bytData = new byte[size]
while (true)
{
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="iar"></param>
private void ReceiveVideo(IAsyncResult iar)
{
int intRecv = 0;
try
{
intRecv = LocalSocket.EndReceiveFrom(iar, ref ipeRemote);
}
catch
{
//throw new Exception();
}第二次执行到LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);出现"未处理的SocketException"异常"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作"。
这个异常怎么处理啊? 由于socket 的在接收数据时,需要给其分配个缓冲区,这里的缓冲区是 1024*64 就是64K大小(就算改大点,我改到1000000以后同样会报出这个异常,执行receive以后byte[]数组再清空已经和socket的缓冲区无关了),由于socket是在死循环中,所以socket的缓冲区没有被复位,所以再接收信息的时候,就是在刚才接受到得数据的缓冲区后再接收数据。
何如能吧receive的缓冲区给手动复位呢?
解决方案 »
- 用C#连接oracle数据库的时候,出现ee = {"ORA-12154: TNS: 无法解析指定的连接标识符\n"}
- 网站过滤IP段
- C#进行视频转换 ~~~~求教
- 如何通过OleDbDataAdapter填充多个存储过程产生的多张表到DataSet,每张表表结构不一样
- 如何用读ini的方式来实现对webservice的引用????????
- How to把一个程序设为开机自动启动用C#
- 查看分数
- 代码复用重构求指点
- C# SplitContainer 打开子窗体的鼠标样式的问题
- 如何能不使用代理更改自已在INTERNET上的IP地址?有可能实现吗??
- 循环多线程返回值获取
- winform我想写日志文件
它必须确保和EndReceiveFrom()是成对调用的。
你一个while (true),还没等数据进来呢,
BeginReceiveFrom就可以走了无数次了。
你这是同步的写法,直接改成ReceiveFrom就得了
{
if (LocalSocket.Poll(5000, SelectMode.SelectRead))
{//每5ms查询一下网络,如果有可读数据就接收
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ReceiveData), LocalSocket);
}
}
这个是源码 楼主帮发那个 给删掉了
EndPoint ipeRemote =(EndPoint)(new IPEndPoint(IPAddress.Any,9000))
private void VideoListen()
{
bytData = new byte[size]
while (true)
{
LocalSocket.ReceiveFrom(byteData,ref ipeRemote);
}
}
接收大一点的信息,循环接收几次后就会出现:
未处理的“System.Net.Sockets.SocketException”类型的异常出现在 system.dll 中。 其他信息: 一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。 这个异常如何解决啊
如何 复位 缓冲器啊
{
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
}
你这个循环错了
begin?????都是些异步函数,即执行后立即返回的
如果socket已经关闭了,你的这个循环就要异常了
private void VideoListen()
{
while (true)
{
bytData = new byte[size]
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
}
}
写到里面就可以了啊
{ string Result;
bytData = new byte[1024];
int BytesRcvd;
while (true)
{
BytesRcvd = AcceptSocket.Receive(bytData);
Result += Encoding.ASCII.GetString(byteData,0,BytesRcvd);
if(FindTheDataEnd...)break;
}
}
一会让楼猪给分。
谁有图像压缩最好是拿C#写的源码啊?(最好带注释嘿嘿~)
给小弟我一份。JPEG,小波都行
小弟在这里谢谢 各位大虾了~