using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static Socket client;
static void Main(string[] args)
{
Console.WriteLine("客户端");
IPAddress address=Dns.GetHostAddresses(Dns.GetHostName())[1];//本地IPAddress
IPEndPoint port=new IPEndPoint(address,3000);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(port);
client.Send(new byte[] { 1 }); //发送字节1 服务器收到后会执行一个耗时处理;
byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hellow Word");
//只要加上这句就能接收到,去掉就挂了。说明啥问题? 说明服务器收到数据处理的时候因为无法Receive就无法接收到客户端send过来的数据;
//客户端这边只有让线程停一会等服务器那边处理完了数据继续Receive的时候服务器才能接收到send过来的数据;
//Thread.Sleep(1000);
client.Send(msg);//向服务器发送Hellow Word;
Console.ReadKey();
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace ConsoleApplication4
{
//服务器
class Program
{
static Socket Client;//服务器绑定端口 3000
static Thread accepteThread;//监听线程;
static Thread reseveThread;//接收线程;
static Socket socket;
static void Main(string[] args)
{
Console.WriteLine("服务器");
Client= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint port = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[1], 3000);
Client.Bind(port);
Client.Listen(10);
//开启监听线程;
accepteThread = new Thread(Accepter);
accepteThread.IsBackground = true;
accepteThread.Start();
Console.ReadKey();
}
//接收;
static private void Reseve(object reseve)
{
Socket udpClient = reseve as Socket;
byte[] bytes = new byte[1024 * 1024];
int len;
while (true)
{
len= udpClient.Receive(bytes);
switch (bytes[0])
{
//假设收到1时会执行一个耗时操作;
case 1:
for (int i = 0; i <1000;i++ )
{
Console.WriteLine("处理数据中.....");
}
break;
default:
//收到其他数据就转换成字符串输出;
string msg = System.Text.Encoding.UTF8.GetString(bytes,0,len);
Console.WriteLine(msg);
Console.ReadKey();
break;
}
}
}
//监听;
static void Accepter()
{
socket= Client.Accept();
//开启接收线程;
reseveThread = new Thread(Reseve);
reseveThread.IsBackground = true;
reseveThread.Start(socket);
}
}
}奇怪的是,用UDP发送就不存在这种问题。但是TCP就会出问题;
http://bbs.csdn.net/topics/390344671
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static Socket client;
static void Main(string[] args)
{
Console.WriteLine("客户端");
IPAddress address=Dns.GetHostAddresses(Dns.GetHostName())[1];//本地IPAddress
IPEndPoint port=new IPEndPoint(address,3000);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(port);
client.Send(new byte[] { 1 }); //发送字节1 服务器收到后会执行一个耗时处理;
byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hellow Word");
//只要加上这句就能接收到,去掉就挂了。说明啥问题? 说明服务器收到数据处理的时候因为无法Receive就无法接收到客户端send过来的数据;
//客户端这边只有让线程停一会等服务器那边处理完了数据继续Receive的时候服务器才能接收到send过来的数据;
//Thread.Sleep(1000);
client.Send(msg);//向服务器发送Hellow Word;
Console.ReadKey();
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace ConsoleApplication4
{
//服务器
class Program
{
static Socket Client;//服务器绑定端口 3000
static Thread accepteThread;//监听线程;
static Thread reseveThread;//接收线程;
static Socket socket;
static void Main(string[] args)
{
Console.WriteLine("服务器");
Client= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint port = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[1], 3000);
Client.Bind(port);
Client.Listen(10);
//开启监听线程;
accepteThread = new Thread(Accepter);
accepteThread.IsBackground = true;
accepteThread.Start();
Console.ReadKey();
}
//接收;
static private void Reseve(object reseve)
{
Socket udpClient = reseve as Socket;
byte[] bytes = new byte[1024 * 1024];
int len;
while (true)
{
len= udpClient.Receive(bytes);
switch (bytes[0])
{
//假设收到1时会执行一个耗时操作;
case 1:
for (int i = 0; i <1000;i++ )
{
Console.WriteLine("处理数据中.....");
}
break;
default:
//收到其他数据就转换成字符串输出;
string msg = System.Text.Encoding.UTF8.GetString(bytes,0,len);
Console.WriteLine(msg);
Console.ReadKey();
break;
}
}
}
//监听;
static void Accepter()
{
socket= Client.Accept();
//开启接收线程;
reseveThread = new Thread(Reseve);
reseveThread.IsBackground = true;
reseveThread.Start(socket);
}
}
}奇怪的是,用UDP发送就不存在这种问题。但是TCP就会出问题;
http://bbs.csdn.net/topics/390344671
接受方在水管的另一端,并不知道对方灌水方式,甚至不知道对方是否已经灌完了(除非一方开始拆管了)。也就是说,你代码中发送方发了两次数据,但对接受方来说,可能只收到一次数据(这时1和'Hello World'可能连在一起),也可能理论上超过两次才收完。很明显接受方的代码没有处理这些情况(你代码中看到1,就不处理后面可能的数据了)。至于UDP不存在这种问题,是因为UDP是基于包传送的。客户发的每个包,服务要么没收到,要么整包收到。