我试图在Linux服务器上运行一个内部代理,它是用C#编写的,我使用Mono来运行它。它在Windows 7上运行非常好,但是当我试图在Linux上运行它时,它会抛出一个异常;
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
at System.Threading.Thread.StartInternal () [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
at System.Threading.Thread.StartInternal () [0x00000] in <filename unknown>:0
我还没有完整地写完这门课,大部分都是来自谷歌,我主要研究和编辑了它,但是我对类和对象的经验还不够丰富。
这是密码
using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace SvrListener
{
class Server
{
static void Main()
{
Server server = new Server();
server.tcpListener.Start();
}
private TcpListener tcpListener;
private Thread listenThread;
public Server()
{
this.tcpListener = new TcpListener(IPAddress.Any, 32666);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}
private void ListenForClients()
{
try
{
Console.WriteLine("Try and listen to:" + tcpListener.Server.LocalEndPoint.ToString());
this.tcpListener.Start();
Console.WriteLine("Waiting for connection...");
}
catch (SocketException e) { Console.WriteLine("Error:" +e.ErrorCode + " "+ e.Message); }
while (true)
{
//blocks until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();
//create a thread to handle communication
//with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.Start(client);
}
}
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, message.Length);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
string s = message.Length.ToString();
Console.WriteLine(s);
Console.WriteLine(encoder.GetString(message, 0, bytesRead));
Thread forwardThread = new Thread(new ParameterizedThreadStart(forwardPacket));
forwardThread.Start(message);
}
tcpClient.Close();
}
private void forwardPacket(object message)
{
TcpClient client = new TcpClient();
byte[] buffer = (byte[])message;
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.50"), 24585);
client.Connect(serverEndPoint);
NetworkStream clientStream = client.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
string shit = encoder.GetString(buffer);
byte[] nBuffer = encoder.GetBytes(shit);
clientStream.Write(nBuffer, 0, nBuffer.Length);
clientStream.Flush();
}
}
}
更新:所以我尝试了--调试命令,它没有给我任何有用的东西;
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
at System.Threading.Thread.StartInternal () [0x00016] in /usr/src/mono-3.0.7/mcs/class/corlib/System.Threading/Thread.cs:734
发布于 2014-04-13 16:45:33
嗯,为了启动(),在Main()和ListenForClients()中调用两次,尝试删除Main()中的那个。
我在linux中使用了mono来创建一些服务器,而且我必须告诉您,我在TcpListener上遇到了很多麻烦(但至少在四年前……),所以最终使用了一个纯套接字实现,它运行得非常完美。
发布于 2014-04-13 16:42:36
根据现有的信息,我的猜测是,它将在这条线上消亡,因为没有任何其他信息被打印出来:
Console.WriteLine("Try and listen to:" + tcpListener.Server.LocalEndPoint.ToString());
MSDN上的文档并没有真正说明Socket.LocalEndPoint
何时或是否可以返回null
,但我认为返回未绑定套接字的null
是有意义的。在Mono的实现中,在调用TcpListener.Start
之前,套接字也可能不会绑定。
尝试在Start()
调用之后移动这一行,看看它是否使事情不是空的。
https://stackoverflow.com/questions/23050154
复制