通常,你要用你熟悉的一种信令处理方式。这需要你自己动脑筋设计。例如如果你会使用json进行序列化、反序列化,那么你就可以把.net内存对象序列化为json字符串然后做为信令内容发送出去,到对方还能反序列化为.net内存对象。例如客户端可能发送这样一个消息: { "type":"Chat.SendMessage", "TargetUserId":[1002,2898,32623], "Content":"<p>今天中午吃了什么?<img src=\"http://www.mysite.com/chat_images/1.png\" />" } 那么显然,对方根据 type 元素就知道要反序列化的.net内存对象的类型了,然后把它直接使用json反序列化为 public class SendMessage: ICommand { public string[] TargetUser; public string Content;
public void Execute() { ................. } } 这样一个对象,然后执行它。
{
"type":"Chat.SendMessage",
"TargetUserId":[1002,2898,32623],
"Content":"<p>今天中午吃了什么?<img src=\"http://www.mysite.com/chat_images/1.png\" />"
}
那么显然,对方根据 type 元素就知道要反序列化的.net内存对象的类型了,然后把它直接使用json反序列化为
public class SendMessage: ICommand
{
public string[] TargetUser;
public string Content;
public void Execute()
{
.................
}
}
这样一个对象,然后执行它。
看来你并不知道 NetworkStream,你需要重新了解一下它跟HttpListener和HttpClient的关系。
看来你并不知道 NetworkStream,你需要重新了解一下它跟HttpListener和HttpClient的关系。
你刚说的那些类啊0.0,都还没见过(⊙o⊙)…0.0
得,我算服了你,夏虫不可语冰拜拜,大神
P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。
P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。网上搜,表示经常会卡0.0,上次搜SQL的图片二进制存在,把我折腾的- -,弄得最后只能考虑文件路径了
胡乱从网上整点“听上去挺厉害的词儿”贴出来,丝毫没有自己的技术原创,这是自欺欺人的招数,而且只是欺负读者不懂分辨关键瓶颈问题,只会坑那些真心想学技术的人。哎,我是想c#类太多了,一个一个对MSDN看,既不效率又难于用于实际,所以想着做一些简单的例子顺带学,发这贴纯碎是找能实现多人点对点聊天的客户端的方法,然后对其中的代码,调试着学类。 让你这通说道- -
P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。网上搜,表示经常会卡0.0,上次搜SQL的图片二进制存在,把我折腾的- -,弄得最后只能考虑文件路径了
卡你就弄明白为什么会卡不就完事了,这样就能提高很多了,大多数的学习都是在研究中进行的。
先要搞清楚tcp通信的结构
有一次有人让我做一个东西,我不会做,于是我边学边做,在做的过程中我学会了很多的东西,最终把问题解决了。如果按照你的逻辑他应该这么做,我不会做,等我N年以后会做了再做吧。假设他不会做,那么在做这个东西的过程中,他必须会一些基础的东西才能学会。这并不影响他的学习,反而加速了他的学习。
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Configuration;namespace Client
{
public partial class FrmClient : Form
{
public FrmClient()
{
InitializeComponent();
} Socket client = null;
byte[] Rcvbuffer;
string SendStr; delegate void AppendDelegate(string str);
AppendDelegate AppendString; string Host = ConfigurationManager.AppSettings["Host"].ToString();
int Port = Convert.ToInt32(ConfigurationManager.AppSettings["Port"].ToString());
AddressFamily af = ConfigurationManager.AppSettings["AddressFamily"].ToString() == "0" ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6; private void AppendMethod(string str)
{
lstStatus.Items.Add(str);
lstStatus.SelectedIndex = lstStatus.Items.Count - 1;
} private void ConnectCallback(IAsyncResult ar)
{
try
{
client.EndConnect(ar);
lstStatus.Invoke(AppendString, String.Format("已经成功连接到服务器{0}!", client.RemoteEndPoint.ToString()));
lstStatus.Invoke(AppendString, String.Format("本地端点为{0}!", client.LocalEndPoint.ToString())); //接收数据
Rcvbuffer = new byte[client.SendBufferSize];
AsyncCallback callback = new AsyncCallback(ReceiveCallback);
client.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, client);
}
catch (Exception ex)
{
lstStatus.Invoke(AppendString, "连接服务器出现异常!异常信息:" + ex.Message);
}
} private void ReceiveCallback(IAsyncResult ar)
{
try
{
int i = client.EndReceive(ar);
string data = String.Format("收:{0}", Encoding.UTF8.GetString(Rcvbuffer, 0, i));
lstStatus.Invoke(AppendString, data); //继续异步接收
Rcvbuffer = new byte[client.SendBufferSize];
AsyncCallback callback = new AsyncCallback(ReceiveCallback);
client.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, client);
}
catch (Exception ex)
{
if (null != client)
{
client.Shutdown(SocketShutdown.Both);
client.Close();
client = null;
lstStatus.Invoke(AppendString, ex.Message);
}
}
} private void FrmClient_Load(object sender, EventArgs e)
{
AppendString = new AppendDelegate(AppendMethod);
} private void BtnStart_Click(object sender, EventArgs e)
{
if (client == null)
{
client = new Socket(af, SocketType.Stream, ProtocolType.Tcp);
}
if (!client.Connected)
{
IPEndPoint remoteep = new IPEndPoint(IPAddress.Parse(Host), Port);
AsyncCallback callback = new AsyncCallback(ConnectCallback); //启动新的连接
client = new Socket(af, SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteep, ConnectCallback, client);
}
} private void BtnStop_Click(object sender, EventArgs e)
{
if (null == client) return;
if (!client.Connected) return;
client.Shutdown(SocketShutdown.Both);
client.Close(50);
client = null;
lstStatus.Invoke(AppendString, "断开了到服务器的TCP连接!");
} private void BtnClear_Click(object sender, EventArgs e)
{
this.lstStatus.Items.Clear();
} private void SendCallback(IAsyncResult ar)
{
try
{
client.EndSend(ar);
lstStatus.Invoke(AppendString, "发:" + SendStr);
}
catch (Exception ex)
{
client.Shutdown(SocketShutdown.Both);
client.Close();
client = null;
lstStatus.Invoke(AppendString, "发送消息出现异常!异常信息:" + ex.Message);
}
} private void SendData()
{
try
{
byte[] msg = Encoding.UTF8.GetBytes(SendStr);
AsyncCallback callback = new AsyncCallback(SendCallback);
client.BeginSend(msg, 0, msg.Length, SocketFlags.None, callback, client);
}
catch
{
client.Shutdown(SocketShutdown.Both);
client.Close();
client = null;
lstStatus.Invoke(AppendString, "服务器断开了TCP连接!");
}
finally
{
TxTMessage.Text = "";
}
} private void BtnSendMsg_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(TxTMessage.Text))
{
lstStatus.Invoke(AppendString, "不能发送空字符串!");
TxTMessage.Focus();
return;
}
if (client == null || !client.Connected)
{
lstStatus.Invoke(AppendString, "尚未建立到服务器的连接!");
BtnStart.Focus();
return;
}
SendStr = TxTMessage.Text.Trim();
SendData();
}
}
}