开发者

SocketException when connecting to server

I am running both client and server on the same machine. Does any 1 know the error stated above?

server

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
using System.Net;
namespace Server
{
    public partial class Server : Form
    {
        private Socket connection;
        private Thread readThread;

        private NetworkStream socketStream;
        private BinaryWriter writer;
        private BinaryReader reader;

        //default constructor

        public Server()
        {
            InitializeComponent();

            //create a new thread from server
            readThread = new Thread(new ThreadStart(RunServer));
            readThread.Start();
        }

        protected void Server_Closing(object sender, CancelEventArgs e)
        {
            System.Environment.Exit(System.Environment.ExitCode);
        }

        //sends the text typed at the server to the client
        protected void inputText_KeyDown(object sender, KeyEventArgs e)
        {
            // send the text to client
            try
            {
                if (e.KeyCode == Keys.Enter && connection != null)
                {
                    writer.Write("Server>>> " + inputText.Text);

                    displayText.Text +=
                        "\r\nSERVER>>> " + inputText.Text;

                    //if user at server enter terminate
                    //disconnect the connection to the client
                    if (inputText.Text == "TERMINATE")
                        connection.Close();

                    inputText.Clear();
                }
            }
            catch (SocketException)
            {
                displayText.Text += "\nError writing object";
            }
        }//inputTextBox_KeyDown

        // allow client to connect & display the text it sends
        public void RunServer()
        {
            TcpListener listener;

            int counter = 1;

            //wait for a client connection & display the text client sends
            try
            {
                //step 1: create TcpListener
                IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
                TcpListener tcplistener = new TcpListener(ipAddress, 9000);

                //step 2: TcpListener waits for connection request
                tcplistener.Start();

                //step 3: establish connection upon client request
                while (true)
                {
                    displayText.Text = "waiting for connection\r\n";

                    // accept incoming connection
                    connection = tcplistener.AcceptSocket();

                    //create NetworkStream object associated with socket
                    socketStream = new NetworkStream(connection);

                    //create objects for transferring data across stream
                    writer = new BinaryWriter(socketStream);
                    reader = new BinaryReader(socketStream);

                    displayText.Text += "Connection " + counter + " received.\r\n ";

                    //inform client connection was successful
                    writer.Write("SERVER>>> Connection successful");
                    inputText.ReadOnly = false;
                    string theReply = "";

                    // step 4: read string data sent from client
                    do
                    {
                        try
                        {
                            //read the string sent to the server
                            theReply = reader.ReadString();

                            // display the message
                            displayText.Text += "\r\n" + theReply;
                        }

                    // handle the exception if error reading data
                        catch (Exception)
                        {
                            break;
                        }

                    } while (theReply != "CLIENT>>> TERMINATE" && connection.Connected);

                    displayText.Text +=
                        "\r\nUser terminated connection";

                    // step 5: close connection
                    inputText.ReadOnly = true;
                    writer.Close();
                    reader.Close();
                    socketStream.Close();
                    connection.Close();

                    ++counter;
                }
            } //end try

            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }
    }// end method runserver
}// end class server

client

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
using System.Net;
namespace Client
{
    public partial class Client : Form
    {
        private NetworkStream output;
        private BinaryWriter writer;
        private BinaryReader reader;

        private string message = "";
        private Thread readThread;

        //default constructor
        public Client()
        {
            InitializeComponent();

            readThread = new Thread(new ThreadStart(RunClient));
            readThread.Start();
        }

开发者_如何学编程        protected void Client_Closing(
            object sender, CancelEventArgs e)
        {
            System.Environment.Exit(System.Environment.ExitCode);
        }

        //sends the text user typed to server
        protected void inputText_KeyDown(
            object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Enter)
                {
                    writer.Write("CLIENT>>> " + inputText.Text);

                    displayText.Text +=
                        "\r\nCLIENT>>> " + inputText.Text;

                    inputText.Clear();
                }
            }
            catch (SocketException ioe)
            {
                displayText.Text += "\nError writing object";
            }
        }//end method inputText_KeyDown

        //connect to server & display server-generated text
        public void RunClient()
        {
            TcpClient client;

            //instantiate TcpClient for sending data to server
            try
            {
                displayText.Text += "Attempting connection\r\n";

                //step1: create TcpClient for sending data to server

                client = new TcpClient();
                client.Connect("localhost", 9000);

                //step2: get NetworkStream associated with TcpClient
                output = client.GetStream();

                //create objects for writing & reading across stream
                writer = new BinaryWriter(output);
                reader = new BinaryReader(output);

                displayText.Text += "\r\nGot I/O streams\r\n";

                inputText.ReadOnly = false;

                //loop until server terminate
                do
                {
                    //step3: processing phase
                    try
                    {
                        //read from server
                        message = reader.ReadString();
                        displayText.Text += "\r\n" + message;
                    }

                    //handle exception if error in reading server data
                    catch (Exception)
                    {
                        System.Environment.Exit(System.Environment.ExitCode);
                    }
                } while (message != "SERVER>>> TERMINATE");

                displayText.Text += "\r\nClosing connection.\r\n";

                //step4: close connection
                writer.Close();
                reader.Close();
                output.Close();
                client.Close();
                Application.Exit();
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }
    }
}


It is probably your firewall acting up. Try connecting to something like www.google.com on TCP 80 just to see if you can actually connect.


Are you using a newer version of Windows? It's possible that you're only listening on IPv4, but "localhost" is resolving to an IPv6 address and it's not finding it. Try connecting to "127.0.0.1" instead of localhost and see if the result changes.


mk, I'd tcplistener/tcpclient for simple applications . . . TheEruditeTroglodyte


If you use that constructor with TCPListener then it will let the underlying service provider pick a network address, which probably won't be 'localhost'. You're probably listening on your LAN/WLAN card instead of localhost.

Take a look at the MSDN page for TCPListener, the sample there shows how to use a different constructor, look at the other constructors for more samples.

Here's one way:

IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
TcpListener tcpListener =  new TcpListener(ipAddress, 9000);    
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜