webform和winform之间通讯的一个问题

as11qwer 2011-09-29 03:18:04
我在winform服务器端写的代码是:
using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace socket_server
{
//服务器
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; //可以调试时,不捕捉控件创建线程错误
}

Thread thThreadRead;
Socket s1=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//监听用
Socket s3;//聊天用
TcpListener tlTcpListen;
NetworkStream nsStream;
StreamReader srRead;
StreamWriter swWriter;
TcpClient [] tcClient=new TcpClient[10];
int threadnum = 1;
bool blistener = true;

private void Listen()
{
try
{
tlTcpListen = new TcpListener(888); //以888端口号来初始化TcpListener实例
tlTcpListen.Start(); //开始监听
label1.Text = "正在监听";
tcClient[threadnum] = tlTcpListen.AcceptTcpClient(); //通过TCP连接请求
TcpClient newtcp = new TcpClient();
newtcp = tcClient[threadnum];
nsStream = newtcp.GetStream(); //获取用以发送、接收数据的网络基础数据流

srRead = new StreamReader(nsStream);//以得到的网络基础数据流来初始化StreamReader实例

label1.Text = "已经连接!" + threadnum.ToString();
while (true) //循环侦听
{
string sMessage = srRead.ReadLine();//从网络基础数据流中读取一行数据

richTextBox1.AppendText(sMessage + "++");
richTextBox1.ScrollToCaret();

}
}
catch (System.Security.SecurityException)
{
MessageBox.Show("侦听失败!", "错误");
}
}

private void button1_Click(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(Listen));
thThreadRead.Start();//启动线程
}

private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < threadnum; i++)
{
NetworkStream nsStream = tcClient[i].GetStream(); //获取用以发送、接收数据的网络基础数据流
swWriter = new StreamWriter(nsStream);
swWriter.WriteLine(richTextBox2.Text);
swWriter.Flush();
}
}


}
}



webform客户端的代码如下:
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.Threading;
using System.Text;
using System.Net.Sockets;
using System.IO;

public partial class _Default : System.Web.UI.Page
{

private TcpClient tcpClient=new TcpClient("192.168.1.18", 888);
private NetworkStream nsStream;// = tcpClient.GetStream(); //创建发送数据的网络基础数据流 
private bool tcpConnect = false;
private StreamReader srRead;//= new StreamReader(nsStream);
private StreamWriter swWriter;//= new StreamWriter(nsStream); //用以向网络基础数据流传送数据 
Thread thThreadRead;
protected void Page_Load(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(BB));
thThreadRead.Start();//启动线程
}
void BB()
{
if (tcpClient.Connected)
{
while (true) //循环侦听
{
nsStream = tcpClient.GetStream();
srRead = new StreamReader(nsStream);
string sMessage = srRead.ReadLine();//从网络基础数据流中读取一行数据
Label1.Text = sMessage;
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
nsStream = tcpClient.GetStream();
swWriter = new StreamWriter(nsStream);
swWriter.WriteLine(TextBox1.Text);//刷新当前数据流中的数据
swWriter.Flush();
}

}


现在只能实现服务器端向客户端发送信息,客户端向服务器端却发不过去,求解啊,给100分!!
...全文
297 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny906 2011-09-30
  • 打赏
  • 举报
回复
在你原有的方法上做了些改进,流打开后,一定要及时关闭

服务端

private void Listen()
{
try
{
tlTcpListen = new TcpListener(888); //以888端口号来初始化TcpListener实例
tlTcpListen.Start(); //开始监听
label1.Text = "正在监听";

while (true) //循环侦听
{
TcpClient newtcp = tlTcpListen.AcceptTcpClient(); //通过TCP连接请求
using (NetworkStream nsStream = newtcp.GetStream()) //获取用以发送、接收数据的网络基础数据流
{
using (StreamReader srRead = new StreamReader(nsStream))//以得到的网络基础数据流来初始化StreamReader实例
{
label1.Text = "已经连接!" + threadnum.ToString();
string sMessage = srRead.ReadLine();//从网络基础数据流中读取一行数据

richTextBox1.AppendText(sMessage + "++");
richTextBox1.ScrollToCaret();
srRead.Close();
}
nsStream.Close();
}
}
}
catch (System.Security.SecurityException)
{
MessageBox.Show("侦听失败!", "错误");
}
}


不要把TcpClient作为全局变量
客户端

//private TcpClient tcpClient = new TcpClient("192.168.1.18", 888);
private NetworkStream nsStream;// = tcpClient.GetStream(); //创建发送数据的网络基础数据流 
private bool tcpConnect = false;
private StreamReader srRead;//= new StreamReader(nsStream);
private StreamWriter swWriter;//= new StreamWriter(nsStream); //用以向网络基础数据流传送数据 

protected void Button1_Click(object sender, EventArgs e)
{
TcpClient tcpClient = new TcpClient("192.168.1.18", 888);
using (NetworkStream nsStream = tcpClient.GetStream())
{
using (StreamWriter swWriter = new StreamWriter(nsStream))
{
swWriter.WriteLine(TextBox1.Text);//刷新当前数据流中的数据
swWriter.Flush();
swWriter.Close();
}
nsStream.Close();
}
}
sunny906 2011-09-30
  • 打赏
  • 举报
回复
帮你把代码简化了,可以作为参考

服务端

Thread m_Thread;
Socket m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//监听用
IPAddress m_IP = IPAddress.Parse("192.168.1.18");
byte[] m_Buffer = new byte[1024];

private void Listen()
{
try
{
m_Socket.Bind(new IPEndPoint(m_IP, 888));
m_Socket.Listen(5);

while (true)
{
Socket socket = m_Socket.Accept();
socket.Receive(m_Buffer);
richTextBox1.AppendText(Encoding.Default.GetString(m_Buffer));
richTextBox1.AppendText("\r\n");
}
}
catch (System.Security.SecurityException ex)
{
MessageBox.Show(ex.Message);
}
}

private void button1_Click(object sender, EventArgs e)
{
m_Thread = new Thread(new ThreadStart(Listen));
m_Thread.Start();//启动线程



客户端

Socket m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress m_IP = IPAddress.Parse("192.168.1.18");

protected void Button1_Click(object sender, EventArgs e)
{
m_Socket.Connect(new IPEndPoint(m_IP, 888));
String strMessage = TextBox1.Text;
m_Socket.Send(Encoding.Default.GetBytes(strMessage));
}
as11qwer 2011-09-30
  • 打赏
  • 举报
回复
不能在修改我的源代码的基础上实现吗?
sunny906 2011-09-29
  • 打赏
  • 举报
回复
代码有问题
1.webform的客户端,用线程接收来自服务端的方法,这种方法不可取,因为webform是基于HTTP协议的,也就是客户端请求一次,获得web服务器的响应,连接就断开了
2.正是因为上述的原因,所以webform用线程的意义不大,建议采用ajax
3.客户端在发送消息的时候,应该先与服务端建立连接,再发送消息,然后,连接就断开了;再次点击的时候,再与服务端建立连接,然后发送消息,如此这般。。。

Socket m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress m_IP = IPAddress.Parse("192.168.1.18");

private void button1_Click(object sender, EventArgs e)
{
m_Socket.Bind(new IPEndPoint(m_IP, 888));
String strMessage = TextBox1.Text;
m_Socket.Send(Encoding.Default.GetBytes(strMessage));
}
sdl2005lyx 2011-09-29
  • 打赏
  • 举报
回复
另外一种思路:Remoting
Gemini Dean 2011-09-29
  • 打赏
  • 举报
回复

来学习了!
ohkuy 2011-09-29
  • 打赏
  • 举报
回复
看备注:在从发送数据到接收数据的整个过程中,必须关闭 NetworkStream。关闭 TcpClient 并不会释放 NetworkStream。
你这种方法很容易阻塞或异常,
看看这两种方式,或许有用
http://www.cnblogs.com/stg609/archive/2008/11/15/1333889.html
as11qwer 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 workingforever 的回复:]
swWriter = new StreamWriter(nsStream);
你的nsStream没东西啊,只是初始化了
[/Quote]
有东西,刚开始就初始化了:private TcpClient tcpClient=new TcpClient("192.168.1.18", 888);
debra 2011-09-29
  • 打赏
  • 举报
回复
swWriter = new StreamWriter(nsStream);
你的nsStream没东西啊,只是初始化了
as11qwer 2011-09-29
  • 打赏
  • 举报
回复
客户端把
 nsStream = tcpClient.GetStream();
swWriter = new StreamWriter(nsStream);
swWriter.WriteLine(TextBox1.Text);//刷新当前数据流中的数据
swWriter.Flush();

这段代码放到Page_Load里面,就能传过去一句,然后再点客户端的发送按钮就发不过去了
ohkuy 2011-09-29
  • 打赏
  • 举报
回复
as11qwer 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ohkuy 的回复:]
因为在你的客户端根本没写向服务器发送消息的代码,
只有接收消息
[/Quote]
Button1_Click就是发送消息的代码啊
ohkuy 2011-09-29
  • 打赏
  • 举报
回复
因为在你的客户端根本没写向服务器发送消息的代码,
只有接收消息
C#即时通讯客户端源码 企业内部即时通讯源码 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 开发语言 : C# 数据库 : SQL2008 开发工具 : VS2013 源码类型 : WebForm 一、企业内部使用的一个即时通讯工具,实现了即时通讯,发送文件,群组通讯等常用功能 .软件包含了三部分,客户端,服务器端,一个辅助的发送文件的WEB应用,最新版本界面参考了 PC端的微信。 二、功能介绍 1:组织机构间发送即时信息,离线消息,2:建立群组,发送群组消息,图片文件等 3:界面实现了阴影圆角界面4:最近联系人之间发送消息  5:未读消息提示 软件源码包括三部分   1、客户端:使用了WinForm内嵌Xilium.CefGlue的方式开发,通过自定义的浏览器控 件载入HTML和JS文件来实现主要功能, 通讯基HTML5的WEBSOCK,实现了断线自动连接,新消 息自动提醒等功能。 2、服务器端:使用的是开源的SuperSocket引擎,使用起来相当便捷 3、辅助的上传文件的Web应用:考虑到开发的便利性,采用了在软件内部来调用一个 部署在IIS上的上传文件页面来实现发送文件的功能上传插件使用的是Plupload-2.1.2。  由于软件采用了内嵌WebKit的方式开发,并且对框架做了优化,这套特别适合通过 HTML+JS进行开发Winform项目,这样可以把Web上相当出色的界面应用到WINFORM上去

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧