我正在尝试在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();
}
}
}
更新:所以我尝试了--debug命令,它没有给我任何有用的东西;
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
答案 0 :(得分:2)
嗯,你正在调用两次Start(),在Main()和ListenForClients()中,尝试删除Main()中的那个。
我在linux中使用mono来创建一些服务器,我必须告诉我TcpListener有很多麻烦(但至少在四年前......),所以最后还是使用了一个完美无缺的纯套接字实现。
答案 1 :(得分:0)
根据可获得的信息,我的猜测是它在这条线上死亡,因为没有打印其他内容:
Console.WriteLine("Try and listen to:" + tcpListener.Server.LocalEndPoint.ToString());
MSDN上的文档并没有真正说明Socket.LocalEndPoint
何时或是否可以返回null
,但我认为它可以为未绑定的套接字返回null
。也许情况是,在Mono的实现中,套接字不会被绑定,直到TcpListener.Start
被调用。
尝试在Start()
调用后移动该行,看看它是否使事情不为空。