我很想弄清楚我的代码有什么问题......请帮帮我吧!
我正在尝试在LAN中的服务器客户端之间创建TCP连接。会发生什么,当客户端尝试连接时程序崩溃。 请参阅代码:
public void Go()
{
if (whatjob == true)
{
IPEndPoint server_ipEndPoint = new IPEndPoint(IPAddress.Any, PortNum);
server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_socket.Bind(server_ipEndPoint);
try
{
server_socket.Listen(1);
server_GotClient = server_socket.Accept();
}
catch (SocketException e)
{
MessageBox.Show("Unable to listen...");
MessageBox.Show(e.ToString());
}
reading = new Thread(new ThreadStart(this.get_msg));
reading.Start();
}
if (whatjob == false)
{
IPEndPoint client_ipEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), PortNum);
client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
client_socket.Blocking = true;
client_socket.Connect(client_ipEndPoint); //here it stops execution
//client_socket.BeginConnect(client_ipEndPoint, new AsyncCallback(NowConnected), client_socket);
}
catch (SocketException e)
{
MessageBox.Show("Unable to connect...");
MessageBox.Show(e.ToString());
return;
}
reading = new Thread(new ThreadStart(this.get_msg));
reading.Start();
}
whatjob是bool ... true表示执行服务器工作而false表示执行客户端工作
此功能位于聊天窗口的窗口FORM中。当它到达client_socket.connect(ipendpoint)时,它崩溃了,甚至聊天窗口都被解码了......
线程函数
public void get_msg()
{
byte[] byte_message = new byte[1000];
string string_message = null;
int x = 0;
while (true)
{
if (server_GotClient != null)
{
x = server_GotClient.Receive(byte_message);
}
if (client_socket != null)
{
x = client_socket.Receive(byte_message);
}
if (x != 0)
{
string_message = Encoding.ASCII.GetString(byte_message);
this.richTextBox_GetMessage.Invoke(new MethodInvoker(delegate
{
richTextBox_GetMessage.Text = richTextBox_GetMessage.Text + "\nFriend: " + string_message;
}));
}
x = 0;
}
server_socket.Close();
}
请帮忙查看此代码。 进一步补充,我不了解异步技术,帮我一些简单的方法。
答案 0 :(得分:2)
了解完整的错误消息会有所帮助。
从你所展示的内容来看,我的想法是抛出的异常不是SocketException。 Socket.Connect的MSDN文档显示它可以抛出四个异常中的任何一个,包括SocketException。
我会将catch中的异常类型更改为Exception,并在开始括号上设置断点。下次失败时你会确切地知道出了什么问题,你可以从那里捕捉并处理它。
另外,我注意到虽然您的客户端作业确实在连接错误时退出了此方法,但服务器作业却没有;捕获异常,消息显示,然后继续执行reading = new Thread(new ThreadStart(this.get_msg));
。这可能会导致额外的异常(您不期望这样)被抛弃。除非你确定客户端的工作流程在这里失败了,否则我会注意这个方法的另一面。
至于多线程的帮助,有很多资源,包括有关SO的其他问题,可以帮助您入门。您想要多线程以及您需要如何控制它的确切原因尚不清楚,因此我尝试给出的任何答案都可能会有错误,这些错误会让您进一步受挫,因为它不是正确的方法。