C#里关于静态方法中调用类里的变量的问题

类:publicclassStateObject{publicSocketworkSocket;publicconstintBufferSize=1024;publicb... 类:
public class StateObject
{
public Socket workSocket;
public const int BufferSize = 1024;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sbd = new StringBuilder();
}
静态方法:
public static void GetClientIp(string str)
{
StateObject sob = new StateObject();
Socket newSocket = sob.workSocket.Accept();
IPEndPoint ip = (IPEndPoint)newSocket.RemoteEndPoint;
MessageBox.Show(ip.Address.ToString());
}
这是服务器端想获取客户端ip
这样子编译的时候能通过,运行的时候就会报错:未将对象引用设置到对象的实例。

它的意思是说StateObject类为null么,可是这个类里都是我的一些定义,它们都会在运行过程中由具体的值,那是我调用这个静态方法的时候,它们都是null吗?但是也不应该呀,客户端能与服务器连接成功,且客户端发送消息给服务器,服务器能返回消息给客户端。这个问题到底是怎么解决呢,热心的人儿帮忙看下点拨一下我撒。
展开
 我来答
freeeeeewind
推荐于2016-06-17 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1352万
展开全部
错误出在:
Socket newSocket = sob.workSocket.Accept(); //执行到这里会导致异常

导致错误的根源在:
StateObject sob = new StateObject();
--------------
原因分析:执行StateObject sob = new StateObject()后,产生了一个新的StateObject实例sob。而此时sob中的workSocket成员的默认值为null,因此调用sob.workSocket.Accept()时,抛出了图示的异常。
追问
是的,我也感觉是这个原因,那么我还能使用静态方法来写获取客户端ip吗?还是只能把获取客户端ip的代码写在上面Socket一起。其实我的思路是想写一个静态方法为获取客户端ip,然后在我想要知道客户端ip的时候调用这个方法获取它,我不想要一旦客户端与服务器连接了,就获取该客户端的ip,那么我能在那个类class StateObject里写构造方法写获取客户端ip然后想用它的时候再调用它吗?
追答

你的意图是:调用StateObject的某个静态方法或静态属性,随时(在你需要的时候)获得客户端IPEndPoint信息?如果是的话,可以这么实现

public class StateObject
{
     //新加一个静态属性
     public static EndPoint Client;
     //原来的成员(略)
}

每当客户端连接到服务器时,你的程序做如下处理:获取客户端的EndPoint,其中mySocket是你程序中被客户端连接的Socket

StateObject.Client = mySocket.RemoteEndPoint;

然后, 你可以随时调用StateObject.Client来获取客户端地址和端口信息

if(StateObject.Client != null)
{
    MessageBox.Show(StateObject.Client.ToString()); //输出类似于 192.168.1.12 : 8721
}
else
{
    MessageBox.Show("没有客户端连接!");
}
阳光的雷咩咩
2015-01-03 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7824万
展开全部
public Socket workSocket;后面也加上类似new的结构试试。
更多追问追答
追问

好像不太好new,这个括号里想不到放什么参数。

追答
根据MSDN寻找合适的构造函数把,我看到了3个,不过我对socket不是很熟悉。
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.aspx
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式