c# socket TCP/IP 请教 本帖最后由 VisualEleven 于 2010-12-09 11:31:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 socket1.Listen(0);->socket1.Listen(大于0); byte[] recvBytes = new byte[4];接收字节是否太小,接收不完整 没有必要 Socket temp = socket1.Accept(); 看到这样的思路,就不可能到一个真正做服务器系统的团队里去开发。这是网上做着玩的一些业余开发服务程序的人的demo的思路。 你自己想想,哪些真正的互联网上的业务服务器,比如移动公司的支持会话的吧,它没事的时候一直跟每一个潜在的客户端去保持联系?那么得多大的服务器啊。如果Csdn的服务器需要支持2亿人可以访问于是一开机就要保持2亿个线程、2亿个socket,成了什么? 先谢谢您的指正。我确实是初学者,我还有疑问是,采用TCP/IP,通信时,如果没有服务器一直开着,怎么才能保证不会丢失客户端发来的消息呢?请指教 先去看看基础的知识..我知道楼主的难处.2个月以前.我用c# 做通信啥都写不出来...单我看了4天的通信的基础知识.我就开始写网络版的斗地主了.而且1个月就已经写完了.建议楼主想写通信的小代码的时候.先看看基础知识.socket通信.同步,异步...慢慢来..然后心跳.堵塞处理...等等等...等你看完.明白原理...写起来就非常简单了.就不会遇到现在的这些问题. QQ最高的那天不是1亿同时在线吗?服务器不会开1亿个线程,客户端也是每隔一定时间去服务器一下。具体还要问sp。呵呵 谢谢你的解答,我是这两天一定要这个功能,才这么着急希望你能给些解答,不胜感激:我现在成这样:服务器端button1_Click_1,打开端口,然后 button2_Click进循环监听;public Form1() { InitializeComponent(); } Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private void button1_Click_1(object sender, EventArgs e) { int port = 2000; string hostip = "192.168.0.2"; IPAddress ip = IPAddress.Parse(hostip); IPEndPoint ipe = new IPEndPoint(ip, port); socket1.Bind(ipe); } private void button2_Click(object sender, EventArgs e) { while (true) { socket1.Listen(15); byte[] recvBytes = new byte[1024]; int rNum = socket1.Receive(recvBytes, recvBytes.Length, SocketFlags.None); if (rNum > 0) { string recvStr = Encoding.ASCII.GetString(recvBytes, 0, rNum); textBox1.Text = recvStr; } } }client端:button2_Click 每次发送一次。 Socket socket1 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); private void button1_Click(object sender, EventArgs e) { try { int port = 2000; string hostip = "192.168.0.3"; IPAddress ip = IPAddress.Parse(hostip); IPEndPoint ipe = new IPEndPoint(ip, port); Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Connect(ipe); string s; s = textBox1.Text; byte[] bs = Encoding.ASCII.GetBytes(s); socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None); } catch { MessageBox.Show("send fall"); } } private void button2_Click(object sender, EventArgs e) { try { int port = 2000; string hostip = "192.168.0.3"; IPAddress ip = IPAddress.Parse(hostip); IPEndPoint ipe = new IPEndPoint(ip, port); Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Connect(ipe); } catch { MessageBox.Show("client connect fall"); } } private void button3_Click(object sender, EventArgs e) { socket1.Shutdown(SocketShutdown.Both); socket1.Close(); } private void button3_Click(object sender, EventArgs e) { socket1.Shutdown(SocketShutdown.Both); socket1.Close(); } }我的疑问有:1.现在client端可以将数据发送出来,我是用一个网口调试助手监测的,能接受到数据,但是如果将 private void button1_Click(object sender, EventArgs e) { try { string s; s = textBox1.Text; byte[] bs = Encoding.ASCII.GetBytes(s); socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None); } catch { MessageBox.Show("send fall"); } }改为这样,则不能发送了,很不解,每次发送都需要连接一次吗?问题2:现在的服务器端不能接受到数据,我是按照某个Demo写的,很困惑,listen是阻塞的吗?运行起来告诉我没有连接,我想的服务器是不需要连接吧,只要听就行了,不是吗?等待前辈解答!!!! 经典select模型就是1个线程死循环侦听. 然后调用 一些系统提供的非阻塞读,写方法进而实现 为N个客户端服务.楼主代码固然太DEMO,你恐怕也是过于武断.因为你引用的这段话至少从网络编程上来看没有任何问题. 有个例子,你试试看。去这里看看 资源看看这个资源:C#简单的socket示例 读取繁体文件 在循环内和循环外面定义变量 ,有什么区别? 关于自定义控件的问题 求一正则表达式 winfrom 中如何取得datagrid的列名?! 如何加载"DirectoryServices"? C#利用SMTP发送邮件的附件乱码问题 关于IP多路广播的问题 最小化窗体 如何人为中止程序? C# 把一个CAD里的文件拷贝到另一个CAD的指定位置 请问C#能分配多少个线程?
byte[] recvBytes = new byte[4];
接收字节是否太小,接收不完整
看到这样的思路,就不可能到一个真正做服务器系统的团队里去开发。这是网上做着玩的一些业余开发服务程序的人的demo的思路。
我确实是初学者,我还有疑问是,采用TCP/IP,通信时,如果没有服务器一直开着,怎么才能保证不会丢失客户端发来的消息呢?请指教
单我看了4天的通信的基础知识.我就开始写网络版的斗地主了.而且1个月就已经写完了.
建议楼主想写通信的小代码的时候.先看看基础知识.socket通信.同步,异步...慢慢来..然后心跳.堵塞处理...等等等...
等你看完.明白原理...写起来就非常简单了.就不会遇到现在的这些问题.
谢谢你的解答,我是这两天一定要这个功能,才这么着急
希望你能给些解答,不胜感激:
我现在成这样:服务器端button1_Click_1,打开端口,然后 button2_Click进循环监听;public Form1()
{
InitializeComponent();
} Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private void button1_Click_1(object sender, EventArgs e)
{
int port = 2000;
string hostip = "192.168.0.2";
IPAddress ip = IPAddress.Parse(hostip);
IPEndPoint ipe = new IPEndPoint(ip, port);
socket1.Bind(ipe);
} private void button2_Click(object sender, EventArgs e)
{ while (true)
{
socket1.Listen(15);
byte[] recvBytes = new byte[1024];
int rNum = socket1.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
if (rNum > 0)
{
string recvStr = Encoding.ASCII.GetString(recvBytes, 0, rNum);
textBox1.Text = recvStr;
}
}
}client端:button2_Click 每次发送一次。
Socket socket1 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
private void button1_Click(object sender, EventArgs e)
{
try
{
int port = 2000;
string hostip = "192.168.0.3";
IPAddress ip = IPAddress.Parse(hostip);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket1.Connect(ipe);
string s;
s = textBox1.Text;
byte[] bs = Encoding.ASCII.GetBytes(s);
socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None);
}
catch
{
MessageBox.Show("send fall");
}
} private void button2_Click(object sender, EventArgs e)
{
try
{
int port = 2000;
string hostip = "192.168.0.3";
IPAddress ip = IPAddress.Parse(hostip);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket1.Connect(ipe);
}
catch
{
MessageBox.Show("client connect fall");
} } private void button3_Click(object sender, EventArgs e)
{
socket1.Shutdown(SocketShutdown.Both);
socket1.Close();
} private void button3_Click(object sender, EventArgs e)
{
socket1.Shutdown(SocketShutdown.Both);
socket1.Close();
}
}
我的疑问有:
1.现在client端可以将数据发送出来,我是用一个网口调试助手监测的,能接受到数据,但是如果将
private void button1_Click(object sender, EventArgs e)
{
try
{
string s;
s = textBox1.Text;
byte[] bs = Encoding.ASCII.GetBytes(s);
socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None);
}
catch
{
MessageBox.Show("send fall");
}
}
改为这样,则不能发送了,很不解,每次发送都需要连接一次吗?问题2:
现在的服务器端不能接受到数据,我是按照某个Demo写的,很困惑,listen是阻塞的吗?运行起来告诉我没有连接,我想的服务器是不需要连接吧,只要听就行了,不是吗?等待前辈解答!!!!
经典select模型就是1个线程死循环侦听. 然后调用 一些系统提供的非阻塞读,写方法进而实现 为N个客户端服务.
楼主代码固然太DEMO,你恐怕也是过于武断.因为你引用的这段话至少从网络编程上来看没有任何问题.
去这里看看 资源
看看这个资源:C#简单的socket示例