WebService里的调用Socket的问题 请大家帮忙看看 谢谢

lihaoru 2008-04-28 08:59:05
在WebService里定义了一个公共的Socket类,用来做TCP/IP连接
WebService里有2个[WebMethod],ConnectServer(string ip, int port)用来连接tcp/ip,SendMsg()用来再在TCP/IP连接上的情况下向tcp/ip服务端发送消息。
WebService里的代码为:
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;


/// <summary>
/// Convert 的摘要说明
/// </summary>
[WebService(Namespace = "TcpTest")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Convert : System.Web.Services.WebService {
public Socket Soc;

public Convert () {

//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}

[WebMethod]
public bool ConnectServer(string ip, int port)
{
if (Context.Cache["Soc"] == null)
{
try
{
IPAddress ipaddress = IPAddress.Parse(ip);//转换IP地址
IPEndPoint ipe = new IPEndPoint(ipaddress, port);
Soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立连接


Soc.Connect(ipe);

return true;
}
catch (SocketException)
{
Context.Cache.Remove("Soc");
return false;
}
}
else
{
return false;
}
}

[WebMethod]
public void SendMsg()
{
byte[] testStr = { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00 };
Soc.Send(testStr);
}
}


现在做了一个WINFORM(C#)测试程序来调用这个WEBSERVICE
WINFORM上有2个按纽,一个用来tcp/ip,一个用来发消息
代码如下:
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WindowsApplication4.CtiWebReference;

namespace WindowsApplication4
{
public partial class Form1 : Form
{
CtiWebReference.Convert tcp = new CtiWebReference.Convert();
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)//连接tcp/ip
{
bool a;
a = tcp.ConnectServer("127.0.0.1", 9000);
}

private void button2_Click(object sender, EventArgs e)//发送消息
{
tcp.SendMsg();
}
}
}

测试时button1_Click可以连接调用tcp/ip,但是再做button2_Click的时候会出错,提示说:System.Web.Services.Protocols.SoapException: 服务器无法处理请求。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
在 Convert.SendMsg() 位置 c:\Documents and Settings\lihaoru\桌面\WebServiceTest\App_Code\Convert.cs:行号 63
--- 内部异常堆栈跟踪的结尾 ---

请问应该怎么解决这个问题,可以在WebService里做OpenConnect连接之后用SendMsg发送消息

请大家帮忙看看 谢谢了


...全文
750 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yilanwuyu123 2008-04-29
  • 打赏
  • 举报
回复
增加全局变量
hhhero 2008-04-29
  • 打赏
  • 举报
回复
WebService采取的是基于Http连接方式,也就是Tcp方式的短连接方式,一次请求就是一个"Rquest/Response"过程,然后连接就会中断,你这个button1请求了一次tcp连接,然后马上就断了,然后你在button2里又发送消息,但是这个连接已经没有了,所以会报错.
wingtech520 2008-04-29
  • 打赏
  • 举报
回复
可以验证一下功1楼的说法是否正确
chichenzhe 2008-04-29
  • 打赏
  • 举报
回复
眼花了, 看见了...

跟踪一下. 跟到 server里看看 sendmsg方法里 有没问题.

短点打在server的SendMsg方法里
yagebu1983 2008-04-29
  • 打赏
  • 举报
回复
因为发送消息的时候,并没有建立连接啊!!
把连接主机的代码与发送消息代码合在一起试试!!
chichenzhe 2008-04-29
  • 打赏
  • 举报
回复
这样贴的代码 看得头大.

你的 Server 没有SendMsg方法,

你的 client 调用了SendMsg方法.

tcp.ConnectServer 能成功的原因:Server 里有 该方法 如:
[WebMethod]
public bool ConnectServer(string ip, int port)


tcp.SendMsg(); 无法成功的原因:Server 找不到该方法.


什么是WEBSERVICE:
WEBservice 实际上就是把HTTP协议封装得更简单一点.
实际是对 稍微 有一丁点儿复杂的HTTP协议的 表层应用...
实际上 GET,POST 过去的.. 还是那些数据流...

只是 封装上 有了WebService这样一个膜...
xml膜.
webservice不是一个独立于HTTP的其他协议...
他的函数原理(函数调用,与函数返回值)
就是直接复制的HTTP的
Response,Request 模式...
zhangxuyu1118 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Wanting 的回复:]
HTTP调用是无状态的,所以你button1和button2中调用的服务器端的Convert web service根本就不是同一个实例,你在button1中初始化了Soc,但是button2的调用中用到的Convert web service是一个新的对象,它的Soc仍然没有初始化……

建议你重新改代码吧,就算把Soc放在Cache中,在并发状态下可能会有性能问题的
[/Quote]
Wanting 2008-04-28
  • 打赏
  • 举报
回复
HTTP调用是无状态的,所以你button1和button2中调用的服务器端的Convert web service根本就不是同一个实例,你在button1中初始化了Soc,但是button2的调用中用到的Convert web service是一个新的对象,它的Soc仍然没有初始化……

建议你重新改代码吧,就算把Soc放在Cache中,在并发状态下可能会有性能问题的

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧