Tcp服务器/客户端应用程序与其他PC通信

时间:2016-08-12 18:58:08

标签: c# sockets tcp

我正在尝试创建一个允许2台PC之间连接的应用程序(我计划稍后将其设置为多线程,但在开始时让它更简单)。这可以用于聊天或将数据发送到另一台PC,并且他对数据执行某些操作并将其发回。 到目前为止,这是我的编码:

服务器:

class Program
{
    private static StreamWriter serverStreamWriter;
    private static StreamReader serverStreamReader;

    private static bool StartServer()
    {
        //setting up Listener
        TcpListener tcpServerListener = new TcpListener(IPAddress.Any, 56765);
        tcpServerListener.Start();
        Console.WriteLine("Server Started!");
        Console.WriteLine("Waiting for Connection...");
        Socket serverSocket = tcpServerListener.AcceptSocket();
        try
        {
            if (serverSocket.Connected)
            {
                Console.WriteLine("Client connected to Server!");
                //open network stream on accepted socket
                NetworkStream serverSockStream = new NetworkStream(serverSocket);
                serverStreamWriter = new StreamWriter(serverSockStream);
                serverStreamReader = new StreamReader(serverSockStream);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
            return false;
        }

        return true;
    }

    static bool once = false;

    static void Main(string[] args)
    {
        //Set Console Window Stuff
        Console.Title = "Server";
        Console.BackgroundColor = ConsoleColor.Black;
        Console.ForegroundColor = ConsoleColor.Green;
        Console.BufferWidth = 120;
        Console.Clear();

        //Start Server
        if (!StartServer())
            Console.WriteLine("Error while Starting Server!");

        //Waiting till Client sends Something
        while (true)
        {
            string data = "Append Something to Me - ";
            if (!once)//that check -.-
            {
                serverStreamWriter.WriteLine(data);
                serverStreamWriter.Flush();
                once = true;
            }
            Console.WriteLine("Client: " + serverStreamReader.ReadLine());
            if (serverStreamReader.ReadLine() != data)
            {
                serverStreamWriter.WriteLine(data);
                serverStreamWriter.Flush();
            }
        }
    }
}

客户端:

class Program
{
    private static StreamReader clientStreamReader;
    private static StreamWriter clientStreamWriter;

    private static bool ConnectToServer()
    {
        try
        {
            TcpClient tcpClient = new TcpClient("127.0.0.1", 56765);
            Console.WriteLine("Connected to Server!");
            NetworkStream clientSockStream = tcpClient.GetStream();
            clientStreamReader = new StreamReader(clientSockStream);
            clientStreamWriter = new StreamWriter(clientSockStream);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
            return false;
        }

        return true;
    }

    private static void SendToServer(string message)
    {
        try
        {
            clientStreamWriter.WriteLine(message);
            clientStreamWriter.Flush();
        }
        catch (Exception se)
        {
            Console.WriteLine(se.StackTrace);
        }
    }

    static void Main(string[] args)
    {
        //Set Console Window Stuff
        Console.Title = "Client";
        Console.BackgroundColor = ConsoleColor.Black;
        Console.ForegroundColor = ConsoleColor.Red;
        Console.BufferWidth = 120;
        Console.Clear();

        if (!ConnectToServer())
            Console.WriteLine("Error while Connecting to Server!");

        SendToServer("Send Me Data...");

        //Waiting till Server sends Something
        while (true)
        {
            string response = clientStreamReader.ReadLine();
            Console.WriteLine(response + "|| Appending Text...");
            response += "Appended Text!";
            Console.WriteLine("Sended " + response + " back to server!");
            SendToServer(response);
        }
    }
}

即使这不是很好的编码,它对我有用,但主要问题是它只能在我的本地机器上运行。如果我在我的电脑上运行服务器应用程序并且我的朋友在他的电脑上运行客户端应用程序这两个连接,我将如何做到这一点!?帮助会非常好,因为我无法找到详细的教程或类似的,我只创建了这个帐户,在这里寻求帮助:)

1 个答案:

答案 0 :(得分:4)

TcpClient tcpClient = new TcpClient("localhost", 3333);

而不是“localhost”,请在此处使用远程计算机的地址。

编辑:

你似乎不明白这个连接过程是如何工作的,所以我会尝试更好地解释它。

您的服务器正在端口3333上打开一个套接字,侦听任何连接。此过程不需要任何外部IP地址。

您的客户端正在尝试连接到服务器。他们需要知道他们连接的服务器,因此您需要为他们提供IP地址。一个例子就像是

TcpClient tcpClient = new TcpClient("127.0.0.1", 3333); 
//this is identical to using "localhost"

使用连接协议中的远程地址,您无法在某处使用。您不能只告诉客户端“连接端口3333”并希望它确切地知道它需要连接的位置。

解释如何解析本地IP地址的注释在您的情况下没有用,因为您最终做的只是告诉客户端连接到自身,因为您解析了客户端的IP地址并尝试连接到该地址

但是,您可以让多个客户端连接到同一服务器。在这种情况下,您将不需要多个远程IP地址,您只需告诉所有客户端连接到相同的远程地址,然后在服务器上处理它。这是RemoteEndPoint生效的地方。

在服务器级别,您可以使用RemoteEndPoint查找连接到它的客户端的IP地址,并使用此IP地址将信息返回给这些客户端。

总而言之,您必须使用一些硬编码的地址作为您的初始

TcpClient tcpClient = new TcpClient(address, 3333);

步骤。没有办法解决这个问题。