以wcf作为服务端, socket 为客户端. 请问有具体的参考示例吗? 或是相关对于的方法思路.
wcf 服务端代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Contract; using System.ServiceModel; using System.ServiceModel.Description; namespace MyServices { [ServiceContract] interface ICalcContract { [OperationContract] int Add(int a, int b); } class CalcService : ICalcContract { #region CalcContract 成员 public int Add(int a, int b) { return a + b; } #endregion } class CalcHostServices { static void Main(string[] args) { Uri tcpBaseAddress = new Uri("net.tcp://localhost:8056/CalcService"); using (ServiceHost calculatorSerivceHost = new ServiceHost(typeof(CalcService), tcpBaseAddress)) { NetTcpBinding tcpBinding = new NetTcpBinding(); calculatorSerivceHost.AddServiceEndpoint(typeof(ICalcContract), tcpBinding, string.Empty); calculatorSerivceHost.Opened += delegate { Console.WriteLine("Calculator Service has begun to listen ... ..."); }; calculatorSerivceHost.Open(); Console.Read(); } } } }
下为socket客户端. 因为不知道怎么与wcf通讯所以下面代码是有错误的. 望高手多多指教.
int port = 8056; string host = "127.0.0.1"; IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket Console.WriteLine("Conneting..."); c.Connect(ipe);//连接到服务器
string sendStr = "hello!This is a socket test"; byte[] bs = Encoding.ASCII.GetBytes(sendStr); Console.WriteLine("Send Message"); c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息 c.Close();
HTTP协议的话,你的发送基于HTTP协议的数据包;
TCP的话,好像不行。
我回头测试下。
Socket理论上可行,但实际上要处理消息头,和消息响应,因此实际通信的时候必须完全清楚通信协议才可行,而我也没仔细研究过WCF每种协议的请求响应格式。
不过退一步可以使用WCF提供的RESF模式,它是以WCF为服务端提供RESF服务,客户端可以通过HTTP协议发送HTTP请求来访问服务端,也就是说支持IE浏览器直接访问服务端。我这里还特意给了一份RESF模式提供的文件下载示例项目:http://www.cnblogs.com/qldsrx/archive/2012/04/08/2437583.html
即使使用wcf中的消息契约也还是要自己要处理消息头和消息响应吗