請高手解答用C#進行TCP網絡編程,也就是用TCP協議到一臺網絡主機(指定了PORT)取數據,如下 参考http://www.csharphelp.com/archives/archive133.htmlhttp://www.codeproject.com/csharp/simple_tcp_client.asp 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 各位;这个应用的大致功能是Client向Server取数据,并把它显示出来,Server的发送的数据是无限条格式为:“DATA YYYYDDMM xxxxxxx”的数据,请问:Server是怎样发送这些数据?还有原理?当Client读取Server发过来的Stream流时,它是不是一条一条的读取,还是怎么读取?是不是取决于Server端的发送方式? 不是一条一条的读,即“数据无边界”。和server的发送方式无关。 TCP发送的数据是无边界的,所以呢,你可以先发送一个4字节的数据长度然后再接着发送实际的数据,自己写个函数实现static int SendData(Socket s,byte[] data) { int total = 0; //已发送的数据 int size = data.Length; //数据长度 int dataleft = size; //数据剩余 int sent; //发送数据长度 byte[] datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); //发送数据 while(total < size) { //sent为本次发送的实际数据大小 sent = s.Send(data,total,dataleft,SocketFlags.None); total += sent; dataleft -= sent; } return total; //返回发送的数据大小 }接受也可以自己写个函数,先接受4字节的数据得到下面将要收到的数据大小,再跟这个大小接收数据,函数如下 static byte[] ReceiveData(Socket s) { int total = 0; //已接受的数据 int recv; byte[] datasize = new byte[4]; //接受数据长度 recv = s.Receive(datasize,0,4,SocketFlags.None); int size = BitConverter.ToInt32(datasize,0); int dataleft = size; //剩余未接受的数据 byte[] data = new byte[size]; while(total < size) { recv = s.Receive(data,total,dataleft,SocketFlags.None); total += recv; dataleft -= recv; } //返回一个Byte[]数组 return data; } server端的主函数为static void Main(string[] args) { int port = 9014; IPEndPoint ipep = new IPEndPoint(IPAddress.Any,port); Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); s.Bind(ipep); s.Listen(10); Console.WriteLine("等待连接...."); Socket ns = s.Accept(); string strout = Console.ReadLine(); byte[] data = Encoding.Unicode.GetBytes(strout); int send = SendData(ns,data); ns.Close(); s.Close(); } Client主函数为static void Main(string[] args){ int port = 9014; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),port); Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try { s.Connect(ipep); if(!s.Connected) { Console.WriteLine("连接失败"); } } catch(SocketException e) { Console.WriteLine("连接失败"); Console.WriteLine(e.ToString()); } byte[] data = ReceiveData(s); strin = Encoding.Unicode.GetString(data); Console.WriteLine(strin); s.Shutdown(SocketShutdown.Both); s.Close();}贴的有点乱七八糟的,复制下来看看来成,如果不了解那些函数可以去查查MSDN。 有問了: 我有建立了一個Client到Server的連結,我能發送數據到Server,但不能讀取Server發送的數據,也就是發送完Client到Server的數據後,我要共有個聯結讀取Server發送的數據,這樣可行嗎?部分代碼如下:cTcpClient= new TcpClient (strIP,iPort); nNetStream = cTcpClient.GetStream();bytes = new byte[256];nNetStream.Write(Encoding.ASCII.GetBytes(sConnect.ToCharArray()), 0, sConnect.Length); // nNetStream .BeginWrite (bytes ,0,256,AsyncCallback (),state) String data = null; Int32 i; while((i = nNetStream.Read(bytes, 0, bytes.Length))!=0) { data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); nNetStream.Close(); } //但不能讀取Server發送的數據与SERVER接受数据的原理相同,你可以在CLIENt上开一个端口进行监听。 多线程的简单问题 C#问提 奇怪的问题 如何删除xml文件指定的TextNode? 急求数据中单点突跳的剔除方法? datagridview按删除键后显示上的是上次删除后的内容,怎么办? 如何使指定的程序得到焦点的? 遇见一个十分诡异的问题,分数不多,但希望大家能进来看看 如何在C#中取得应用程序本身所在的目录? 我看的一些书上说的。请进 读取excel,文本类型可以,默认类型如果是数字就读不出来 怎样设置TextBox的Width?
这个应用的大致功能是Client向Server取数据,并把它显示出来,Server的发送的数据是无限条格式为:“DATA YYYYDDMM xxxxxxx”的数据,请问:Server是怎样发送这些数据?还有原理?当Client读取Server发过来的Stream流时,它是不是一条一条的读取,还是怎么读取?是不是取决于Server端的发送方式?
和server的发送方式无关。
static int SendData(Socket s,byte[] data)
{
int total = 0; //已发送的数据
int size = data.Length; //数据长度
int dataleft = size; //数据剩余
int sent;
//发送数据长度
byte[] datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize); //发送数据
while(total < size)
{
//sent为本次发送的实际数据大小
sent = s.Send(data,total,dataleft,SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total; //返回发送的数据大小
}接受也可以自己写个函数,先接受4字节的数据得到下面将要收到的数据大小,再跟这个大小接收数据,函数如下 static byte[] ReceiveData(Socket s)
{
int total = 0; //已接受的数据
int recv;
byte[] datasize = new byte[4]; //接受数据长度
recv = s.Receive(datasize,0,4,SocketFlags.None);
int size = BitConverter.ToInt32(datasize,0); int dataleft = size; //剩余未接受的数据
byte[] data = new byte[size]; while(total < size)
{
recv = s.Receive(data,total,dataleft,SocketFlags.None);
total += recv;
dataleft -= recv;
}
//返回一个Byte[]数组
return data;
}
static void Main(string[] args)
{
int port = 9014;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,port);
Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
s.Bind(ipep);
s.Listen(10);
Console.WriteLine("等待连接....");
Socket ns = s.Accept(); string strout = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(strout);
int send = SendData(ns,data); ns.Close();
s.Close();
}
static void Main(string[] args)
{ int port = 9014;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),port);
Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
s.Connect(ipep);
if(!s.Connected)
{
Console.WriteLine("连接失败");
}
}
catch(SocketException e)
{
Console.WriteLine("连接失败");
Console.WriteLine(e.ToString());
}
byte[] data = ReceiveData(s);
strin = Encoding.Unicode.GetString(data);
Console.WriteLine(strin); s.Shutdown(SocketShutdown.Both);
s.Close();
}
贴的有点乱七八糟的,复制下来看看来成,如果不了解那些函数可以去查查MSDN。
部分代碼如下:cTcpClient= new TcpClient (strIP,iPort);
nNetStream = cTcpClient.GetStream();
bytes = new byte[256];
nNetStream.Write(Encoding.ASCII.GetBytes(sConnect.ToCharArray()), 0, sConnect.Length);
// nNetStream .BeginWrite (bytes ,0,256,AsyncCallback (),state)
String data = null;
Int32 i;
while((i = nNetStream.Read(bytes, 0, bytes.Length))!=0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
nNetStream.Close();
}