tcp/ip
C# TcpClient 由于目标机器积极拒绝,无法连接近日写了一个tcp通信程序,但是运行时总是出现错误提示:
--------------------编程问答-------------------- 应该是目标机器的tcp服务器没有启动 --------------------编程问答-------------------- 在同一个机器上可以吗 --------------------编程问答--------------------
发送和接收 在同一个机器上可以吗
--------------------编程问答--------------------
可以呀 --------------------编程问答-------------------- 我给你个在同一台机上的服务器和客户端源码吧 --------------------编程问答-------------------- 我就是在同一个机器上才出现这个错误的啊,怎么回事啊 --------------------编程问答-------------------- 好 谢谢 --------------------编程问答-------------------- 服务器
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 --------------------编程问答--------------------
给我调试好的吧,程序加代码 谢谢 --------------------编程问答-------------------- 因为我调试老出错 我用的是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#