当前位置:编程学习 > C#/ASP.NET >>

tcp/ip

C# TcpClient 由于目标机器积极拒绝,无法连接 
近日写了一个tcp通信程序,但是运行时总是出现错误提示:
--------------------编程问答-------------------- 应该是目标机器的tcp服务器没有启动 --------------------编程问答-------------------- 在同一个机器上可以吗 --------------------编程问答--------------------

发送和接收  在同一个机器上可以吗
--------------------编程问答--------------------
引用 3 楼  的回复:
发送和接收  在同一个机器上可以吗

可以呀 --------------------编程问答-------------------- 我给你个在同一台机上的服务器和客户端源码吧 --------------------编程问答-------------------- 我就是在同一个机器上才出现这个错误的啊,怎么回事啊 --------------------编程问答-------------------- 好 谢谢 --------------------编程问答-------------------- 服务器

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.Net;

namespace TCPServer
{
    public partial class TCPServer : Form
    {
        public TCPServer()
        {
            InitializeComponent();
        }

        Thread tr = null;
        private void button1_Click(object sender, EventArgs e)
        {
            tr = new Thread(xiancheng);
            tr.IsBackground = true;
            tr.Start();
        }

        TcpListener tcpL = null;//侦听来自 TCP 网络客户端的连接。
        TcpClient tc = null;
        Thread tr2 = null;
        public void xiancheng()
        {
            IPAddress ipa = IPAddress.Parse("127.0.0.1");
            tcpL = new TcpListener(ipa,10000);
            tcpL.Start();
            tc  = tcpL.AcceptTcpClient();
            tr2 = new Thread(new ThreadStart(getmsg));
            tr2.IsBackground = true;
            tr2.Start();
        }

        NetworkStream ts = null;
        public void getmsg()
        {
            ts = tc.GetStream();
            while (true)
            {
                if (ts.DataAvailable)
                {
                    byte[] by = new byte[1000];
                    ts.Read(by, 0, tc.Available);
                    string str = Encoding.UTF8.GetString(by);
                    MessageBox.Show(str);
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string str = textBox1.Text;
            byte[] by = Encoding.UTF8.GetBytes(str);
            ts.Write(by, 0, by.Length);
        }
    }
} --------------------编程问答-------------------- 客户端

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.Net.Sockets;
using System.Threading;

namespace TCPClient
{
    public partial class TCPClient : Form
    {
        public TCPClient()
        {
            InitializeComponent();
        }

        TcpClient tc = null;
        Thread td = null;
        private void button1_Click(object sender, EventArgs e)
        {
            tc = new TcpClient();
            tc.Connect("127.0.0.1",10000);
            td = new Thread(new ThreadStart(getmges));
            td.IsBackground = true;
            td.Start();
        }

        NetworkStream ns = null;
        public void getmges()
        {
            ns = tc.GetStream();

            while (true)
            {
                if (ns.DataAvailable)
                {
                    byte[] bt = new byte[1000];
                    ns.Read(bt,0,tc.Available);
                    string str = Encoding.UTF8.GetString(bt);
                    MessageBox.Show(str);
                }
            }
 
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string str = textBox1.Text;
            byte[] bt = Encoding.UTF8.GetBytes(str);
            ns = tc.GetStream();
            ns.Write(bt,0,bt.Length);
        }
    }
}


PS:我机器上测试通过 --------------------编程问答-------------------- 是在VS2008上吗   --------------------编程问答--------------------  添加几个控件啊  服务器和客户端各一个button控件吗 --------------------编程问答-------------------- 服务器端控件包括如下

namespace TCPServer
{
    partial class TCPServer
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(12, 12);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(106, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "启动服务器";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(93, 54);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(183, 21);
            this.textBox1.TabIndex = 2;
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(12, 52);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 3;
            this.button2.Text = "回复";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // TCPServer
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(498, 438);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "TCPServer";
            this.Text = "TCPServer";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button2;
    }
} --------------------编程问答-------------------- 客户端控件包括如下

namespace TCPClient
{
    partial class TCPClient
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.button2 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(12, 41);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 5;
            this.button2.Text = "发送";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(93, 43);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(153, 21);
            this.textBox1.TabIndex = 4;
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(12, 12);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "连接服务器";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // TCPClient
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(259, 75);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "TCPClient";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button1;
    }
}

--------------------编程问答-------------------- 能加你QQ吗,哥 --------------------编程问答-------------------- 留下Email吧 我把dome发给你吧 --------------------编程问答-------------------- 我很少上Q 留也没用 --------------------编程问答-------------------- 243065607@qq.com --------------------编程问答--------------------
引用 16 楼  的回复:
我很少上Q 留也没用


给我调试好的吧,程序加代码 谢谢  --------------------编程问答-------------------- 因为我调试老出错 我用的是VS2008
--------------------编程问答-------------------- 已发 注意查收 --------------------编程问答-------------------- 已发 注意查收  --------------------编程问答-------------------- 因为我老调试出错,我用是VS2008 --------------------编程问答-------------------- 已发 注意查收  --------------------编程问答-------------------- 晕 这是vs2010的demo,不过你看我贴出来的代码 托一下相应的控件 然后粘贴进去对应代码 应该没问题吧 自己动手做一下吧 正好也练练手 --------------------编程问答-------------------- 收到 非常感谢 你的VS 什么版本 --------------------编程问答-------------------- 2010的。。 --------------------编程问答--------------------    

谢谢........... --------------------编程问答-------------------- 我把俩窗体都启动运行了,怎么服务器怎么接收不到信息啊啊 --------------------编程问答-------------------- 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 --------------------编程问答-------------------- 步骤:
1.点击一下TCPServer中的“启动服务器”按钮
2.点击一下TCPClient中的“连接服务器”按钮
3.客户端发送给服务器数据
4.服务器发送给客户端数据

PS:3和4顺序可以颠倒  主要是前两步顺序 --------------------编程问答-------------------- 我点击server服务器(我的命名为server),出现 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

错误图片我发你邮箱了 --------------------编程问答-------------------- 我调好了, 只能弹出对话框, 不能再对放窗体上显示 --------------------编程问答-------------------- 我调好了, 只能弹出对话框, 不能在对方窗体上显示 --------------------编程问答-------------------- 是不是因为进程中还有Server啊? 结束进程试试? --------------------编程问答-------------------- 发送后,对方窗体不能接收是吧 --------------------编程问答-------------------- 客户端发送给服务器  服务器MessageBox显示一下
同理 服务器发送给客户端  客户端MessageBox一下

这是我之前写的一个demo 就为了图省事,你直接把值输出到界面上试试就可以了。。

如果不行的话估计是跨线程UI的问题了 解决方法几种 --------------------编程问答-------------------- 好,明白了谢谢 --------------------编程问答-------------------- 你赋值给界面上控件的时候可能会抱错->

线程间操作无效:从不是创建控件“XX”的线程访问它


最好的解决方法是利用委托  
最简单最快的方法是在构造函数中加上->
CheckForIllegalCrossThreadCalls = false; --------------------编程问答-------------------- 谢谢..........................
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,