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吗?但是也不应该呀,客户端能与服务器连接成功,且客户端发送消息给服务器,服务器能返回消息给客户端。这个问题到底是怎么解决呢,热心的人儿帮忙看下点拨一下我撒。 展开
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吗?但是也不应该呀,客户端能与服务器连接成功,且客户端发送消息给服务器,服务器能返回消息给客户端。这个问题到底是怎么解决呢,热心的人儿帮忙看下点拨一下我撒。 展开
2个回答
展开全部
错误出在:
Socket newSocket = sob.workSocket.Accept(); //执行到这里会导致异常
导致错误的根源在:
StateObject sob = new StateObject();
--------------
原因分析:执行StateObject sob = new StateObject()后,产生了一个新的StateObject实例sob。而此时sob中的workSocket成员的默认值为null,因此调用sob.workSocket.Accept()时,抛出了图示的异常。
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("没有客户端连接!");
}
展开全部
public Socket workSocket;后面也加上类似new的结构试试。
更多追问追答
追答
根据MSDN寻找合适的构造函数把,我看到了3个,不过我对socket不是很熟悉。
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.aspx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询