C#。使用套接字和外部IP连接到朋友

时间:2015-06-28 09:22:29

标签: c# sockets

我与Windows Forms应用程序进行了简单的聊天。我正在使用套接字,当我尝试连接本地IP时,一切正常,我可以在本地发送消息。

但是当我尝试使用外部IP连接到我的朋友机器时,没有任何反应。我在IP字段输入他的外部IP,按下连接,程序停止工作。

问题是:我在IP领域写什么?我需要更多信息来连接我朋友的机器吗?我是网络编程的初学者,请帮助我。

如果可以的话,请给我一本关于C#网络编程的好书。

这是我的风电图片: ChatPicture

这是我的代码:

namespace Client
{
    public partial class Client : Form
    {
        public Socket ServerSocket, ClientSocket, ClientSocket2;
        byte[] Buffer;

        public Client()
        {
            InitializeComponent();
            StartConnect();
        }

        private void StartConnect()
        {
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ServerSocket.Bind(new IPEndPoint(IPAddress.Any, Convert.ToInt32(textBox2.Text)));
            ServerSocket.Listen(0);

            ServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }

        private void AcceptCallback(IAsyncResult ar)
        {
            ClientSocket2 = ServerSocket.EndAccept(ar);
            Buffer = new byte[ClientSocket.SendBufferSize];
            ClientSocket2.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }

        private void ReceiveCallback(IAsyncResult ar)
        {
            ClientSocket2.EndReceive(ar);
            string Text = Encoding.ASCII.GetString(Buffer);
            AppendRichTextBox(Text);

            ClientSocket2.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }

        private void AppendRichTextBox(string Text)
        {
            MethodInvoker Invoker = new MethodInvoker(delegate
            {
                richTextBox2.Text += "Client says: " + Text;
            });

            this.Invoke(Invoker);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            ClientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse(textBox1.Text), Convert.ToInt32(textBox2.Text)), new AsyncCallback(ConnectCallback), null);
        }

        private void ConnectCallback(IAsyncResult ar)
        {
            button2.Enabled = true;
            ClientSocket.EndConnect(ar);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Buffer = Encoding.ASCII.GetBytes(richTextBox1.Text);
            ClientSocket.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null);
            richTextBox1.Clear();
        }

        private void SendCallback(IAsyncResult ar)
        {
            ClientSocket.EndSend(ar);
        }

        private void Client_KeyPress(object sender, KeyPressEventArgs e)
        {
        }

        private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar==(char)13)
            {
                button2_Click(sender, (EventArgs)e);
            }
        }

        private void Client_Load(object sender, EventArgs e)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:2)

您需要在朋友的计算机防火墙上打开远程端口。