我在做一个企业QQ通信系统,其中用到了是socket的UDP协议,有一个注册窗体,注册信息填完后,点击确定向服务器端发送注册信息,服务器已开,出现错误提示:“套接字操作尝试一个无法连接的主机”。 这是怎么回事,有谁知道吗,请教了!
解决方案 »
- Crystal Reports For .net framework安装到垃圾WIN7,搞了半天都装不成,请帮忙
- SqlDataAdapter怎么更新多张表数据
- 除了app.config和web.config外,如何读取另外自定义的配置文件?
- 我想调用资源管理器打开一个目录,请问该如何写代码?
- 类型转换的时候出错~~~大虾救命啊~程序晚上就要交了.最后的排错的时候出现问题.
- 帮我改改这段代码,js找不到变量,
- Blog中怎么作出这种代码效果
- 发一套DevExpress的控件(有源代码)
- 请告诉我为什么会是B阿谢谢
- byte[]转化成float[]
- 想做个数据库查询工具,通过下拉菜单选定数据库(多个库),该怎么做这个单选菜单呢?
- C# 读取EXCEL问题 着急。。。。。。
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net;
using System.IO;
using QQClass;
namespace MyQQClient
{
public partial class F_SerSetup : Form
{
public F_SerSetup()
{
InitializeComponent();
}
Publec_Class PubClass = new Publec_Class();
string serID = ""; private void F_SerSetup_Load(object sender, EventArgs e)
{
udpSocket1.Active = true;
}
private void btnOK_Click(object sender, EventArgs e)
{
if (text_PassWord.Text.Trim() == text_PassWord2.Text.Trim() && text_PassWord.Text.Trim() != "" && text_PassWord2.Text.Trim()!="") //当密码输入相同
{
RegisterMsg registermsg = new RegisterMsg();
registermsg.UserName = text_Name.Text;
registermsg.PassWord = text_PassWord.Text;
byte[] registerData = new ClassSerializers().SerializeBinary(registermsg).ToArray();
ClassMsg msg = new ClassMsg();
msg.sendKind = SendKind.SendCommand;
msg.msgCommand = MsgCommand.Registering;
msg.Data = registerData;
serID = text_IP.Text.Trim();
udpSocket1.Send(IPAddress.Parse(serID), Convert.ToInt32(text_Port.Text.Trim()), new ClassSerializers().SerializeBinary(msg).ToArray());
// udpSocket1.CallBackMethod(IAsyncResult );
//MessageBox.Show("chenggong");
}
else
{
text_PassWord.Text = "";
text_PassWord2.Text = "";
MessageBox.Show("密码与确认密码不匹配,请重新输入或密码为空。");
}
}
private delegate void DataArrivaldelegate(byte[] Data, IPAddress Ip, int Port);
private void udpSocket1_DataArrival(byte[] Data, IPAddress Ip, int Port)
{
DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival); //托管
this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port }); //异步执行托管
} [DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
private void DataArrival(byte[] Data, IPAddress Ip, int Port) //当有数据到达后的处理进程
{
try
{
MessageBox.Show("chenggong");
ClassMsg msg = new ClassSerializers().DeSerializeBinary((new MemoryStream(Data))) as ClassMsg; switch (msg.msgCommand)
{
case MsgCommand.Registered://注册成功
DialogResult = DialogResult.OK;
WritePrivateProfileString("MyQQ", "ID", serID, PubClass.Get_Windows() + "\\Server.ini");
WritePrivateProfileString("MyQQ", "Port", text_Port.Text.Trim(), PubClass.Get_Windows() + "\\Server.ini");
WritePrivateProfileString("MyQQ", "Name", text_Name.Text.Trim(), PubClass.Get_Windows() + "\\Server.ini");
break;
}
}
catch { }
}
private void btnCansel_Click(object sender, EventArgs e)
{
udpSocket1.Active = false;
this.Close();
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QQClass;
using System.Data.SqlClient;
using System.Net;
using System.Net.Sockets;
using System.IO;namespace MyQQServer
{
public partial class F_Server : Form
{
public F_Server()
{
InitializeComponent();
} private void F_Server_Load(object sender, EventArgs e)
{
UpdateUser();//加载用户列表
//udpSocket1.Active = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
//QQClass.Controls.ClassMsg msg = new QQClass.Controls.ClassMsg(0, LV_SysUser.Items[0].Text, null);
//SendMsgToAll(msg);//发送消息给所有此用户的联系人,告之用户掉线
}
private void SendMsgToAll(ClassMsg msg)//发送消息给所有用户
{
try
{
foreach (System.Windows.Forms.ListViewItem item in this.LV_SysUser.Items)
{
System.Net.IPAddress ip = System.Net.IPAddress.Parse(item.SubItems[1].Text);
int port = Convert.ToInt32(item.SubItems[2].Text);
System.IO.MemoryStream stream = new ClassSerializers().SerializeBinary(msg);
QQClass.UDPSocket udp = new QQClass.UDPSocket();
udp.Send(ip, port, stream.ToArray());
}
}
catch { } } private void SendMsgToOne(System.Net.IPAddress ip, int port, ClassMsg msg)//发送消息给一个用户
{
try
{
System.IO.MemoryStream stream = new ClassSerializers().SerializeBinary(msg);
QQClass.UDPSocket udp = new QQClass.UDPSocket();
udp.Send(ip, port, stream.ToArray());
}
catch { } }
private void 开始服务ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (((ToolStripMenuItem)sender).Text == "开始服务")
{
((ToolStripMenuItem)sender).Text = "结束服务";
udpSocket1.Active = true;
MessageBox.Show("chenggong");
}
else
{
((ToolStripMenuItem)sender).Text = "开始服务";
udpSocket1.Active = false;
}
}
private void Server(bool IsServer)//开始或停止服务
{ } private void udpSocket1_DataArrival(byte[] Data, IPAddress Ip, int Port)
{
MessageBox.Show("yijingchenggong");
DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival);
this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port });
} private delegate void DataArrivaldelegate(byte[] Data, IPAddress Ip, int Port); private void DataArrival(byte[] Data, IPAddress Ip, int Port) //当有数据到达后的处理进程
{
try
{
ClassMsg msg = new ClassSerializers().DeSerializeBinary((new MemoryStream(Data))) as ClassMsg; switch (msg.sendKind)
{
case SendKind.SendCommand://命令
{
switch (msg.msgCommand)
{
case MsgCommand.Registering://注册用户
RegisterUser(msg, Ip, Port);
break;
case MsgCommand.Logining://登录用户
UserLogin(msg, Ip, Port, 1);
break;
case MsgCommand.UserList://用户列表
SendUserList(msg, Ip, Port);
break;
case MsgCommand.SendToOne://发送消息给单用户
SendUserMsg(msg, Ip, Port);
break;
case MsgCommand.Close://下线
UpdateUserState(msg, Ip, Port);
break;
}
break;
}
case SendKind.SendMsg://消息
{
switch (msg.msgCommand)
{
case MsgCommand.SendToOne://发送消息给单用户
SendUserMsg(msg, Ip, Port);
break;
}
break;
}
case SendKind.SendFile://文件
{
break;
}
} }
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.Threading;namespace QQClass
{
public partial class UDPSocket : Component
{
private IPEndPoint ServerEndPoint = null; //定义网络端点
private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Sockets
private System.Threading.Thread thdUdp; //创建一个线程
public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port); //定义了一个托管方法
public event DataArrivalEventHandler DataArrival; //通过托管理在控件中定义一个事件
private string localHost = "127.0.0.1";
[Browsable(true), Category("Local"), Description("本地IP地址")] //在“属性”窗口中显示localHost属性
public string LocalHost
{
get { return localHost; }
set { localHost = value; }
} private int localPort = 11000;
[Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
public int LocalPort
{
get { return localPort; }
set { localPort = value; }
} private bool active = false;
[Browsable(true), Category("Local"), Description("激活监听")] //在“属性”窗口中显示active属性
public bool Active
{
get { return active; }
set //该属性读取值
{
active = value;
if (active) //当值为True时
{
OpenSocket(); //打开监听
}
else
{
CloseSocket(); //关闭监听
}
}
}
public UDPSocket()
{
InitializeComponent();
} public UDPSocket(IContainer container)
{
container.Add(this); InitializeComponent();
} public void Listener() //监听
{
ServerEndPoint = new IPEndPoint(IPAddress.Any, localPort); //将IP地址和端口号以网络端点存储
if (UDP_Server != null)
UDP_Server.Close();
UDP_Server = new UdpClient(localPort); //创建一个新的端口号
UDP_Server.Client.ReceiveBufferSize = 1000000000; //接收缓冲区大小
UDP_Server.Client.SendBufferSize = 1000000000; //发送缓冲区大小 try
{
thdUdp = new Thread(new ThreadStart(GetUDPData)); //创建一个线程
thdUdp.Start(); //执行当前线程
}
catch (Exception e)
{
MessageBox.Show(e.ToString()); //显示线程的错误信息
}
} private void GetUDPData() //获取当前接收的消息
{
while (active)
{
try
{
byte[] Data = UDP_Server.Receive(ref ServerEndPoint); //将获取的远程消息 if (DataArrival != null)
{
DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);
}
Thread.Sleep(0);
}
catch { }
}
} public void CallBackMethod(IAsyncResult ar)
{
//从异步状态ar.AsyncState中,获取委托对象
DataArrivalEventHandler dn = (DataArrivalEventHandler)ar.AsyncState;
//一定要EndInvoke,否则你的下场很惨
dn.EndInvoke(ar);
}
public void Send(IPAddress Host, int Port, byte[] Data)
{
try
{
IPEndPoint server = new IPEndPoint(Host, Port);
UDP_Server.Send(Data, Data.Length, server);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
} private void OpenSocket()
{
Listener();
} private void CloseSocket()
{
if (UDP_Server != null)
UDP_Server.Close();
if (thdUdp != null)
{
Thread.Sleep(30);
thdUdp.Abort();
}
}
}
}
兄弟,拜托学习一下tcp/ip吧,udp虽然面向无连接,但不是你说的“没有客户端和服务器端”,请其他兄弟不要被混淆了。