高分请教。有关C#中的sokcet编程问题
yx718 2007-10-29 10:44:54 最近刚学C#,遇到有关socket的问题,有请高手帮帮忙。
目的是想实现一个client/server最简单的通信,采用socket编程。
问题主要出现在客户端代码,服务器断能够接收到客户端的数据,但是客户端的receive总是没有反应。
如果把 if (connSocket.Available == 0) 这个判断去掉而直接receive的话,客户端程序会死掉。
不知道问题在那儿,100分有请高手解答!分数不是问题!不够再加!电脑旁等候回复信息。
//server端主要代码如下:
//省略了部分无关紧要的代码。
namespace myServer
{
public partial class frmMain : Form
{
private BackgroundWorker bwListener;
private Socket listenerSocket;
private IPAddress serverIP;
private int serverPort;
delegate void SetTextCallback(string text);
private Socket socket;
public frmMain()
{
InitializeComponent();
bwListener = new BackgroundWorker();
bwListener.WorkerSupportsCancellation = true;
bwListener.DoWork += new DoWorkEventHandler(StartToListen);
bwListener.RunWorkerAsync();
txtServerIP.Text = "192.168.1.10";
serverIP = IPAddress.Parse(txtServerIP.Text);
serverPort = 8000;
}
private void StartToListen(object sender, DoWorkEventArgs e)
{
string sendToClient = "OK! You can exit now!!!";
Byte[] bytesSentToClient = Encoding.ASCII.GetBytes(sendToClient);
Byte[] bytesReceived = new Byte[256];
this.listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.listenerSocket.Bind(new IPEndPoint(this.serverIP, this.serverPort));
this.listenerSocket.Listen(200);
int bytes = 0;
string page = "Client's information: ";
while (true)
{
try
{
socket = this.listenerSocket.Accept();
SetText(((IPEndPoint)socket.RemoteEndPoint).Address.ToString());
do
{
bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
int sendCount = 0;
socket.SendTimeout = 1000;
//在这里向客户端发送一句话,能够发送成功
sendCount = socket.Send(bytesSentToClient);
if (sendCount > 0)
MessageBox.Show("send success");
page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
}
while (bytes > 0);
}
catch (SocketException se)
{
MessageBox.Show(se.Message + "\r\n错误代码: " + se.ErrorCode);
return;
}
catch (Exception ee)
{
MessageBox.Show(ee.Message + "\r\n");
return;
}
DisconnectServer();
}
}
public void DisconnectServer()
{
this.bwListener.CancelAsync();
this.bwListener.Dispose();
this.listenerSocket.Close();
GC.Collect();
}
}
}
//-----------------------------------------------------------------------------
//客户端主要代码如下:
namespace test
{
public partial class ClientForm : Form
{
private Socket connSocket;
delegate void SetTextCallback(string text);
public ClientForm()
{
InitializeComponent();
}
private void btnConServer_Click(object sender, EventArgs e)
{
string host = "192.168.1.10";
int port = 8000;
host = txtServerIP.Text;
string result = SocketSendReceive(host, port);
}
private static Socket ConnectSocket(string server, int port)
{
Socket s = null;
IPHostEntry hostEntry = null;
// Get host related information.
hostEntry = Dns.GetHostEntry(server);
foreach (IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, port);
Socket tempSocket =
new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
tempSocket.Connect(ipe);
}
catch (SocketException e)
{
MessageBox.Show(e.Message + "\r\n错误代码: " + e.ErrorCode);
return null;
}
if (tempSocket.Connected)
{
s = tempSocket;
break;
}
else
{
continue;
}
}
return s;
}
// This method requests the home page content for the specified server.
private string SocketSendReceive(string server, int port)
{
string request = "connecting host: " + server +
"\r\n";
Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
Byte[] bytesReceived = new Byte[1024];
// Create a socket connection with the specified server and port.
connSocket = ConnectSocket(server, port);
if (connSocket == null)
return ("Connection failed");
// Send request to the server.
connSocket.Send(bytesSent, bytesSent.Length, 0);
// Receive the server home page content.
int bytes = 0;
string page = "receiving data from host " + server + " \r\n";
// The following will block until te page is transmitted.
do
{
try
{
connSocket.ReceiveTimeout = 1000;
if (connSocket.Available == 0)
{
MessageBox.Show("没有数据可接收");
//return null;
}
/**********问题出现在这里*******/
//Receive总是不能成功!
bytes = connSocket.Receive(bytesReceived, bytesReceived.Length, 0);
if (bytes > 0)
MessageBox.Show("接收成功");
page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
}
catch (SocketException se)
{
MessageBox.Show(se.Message + "\r\n错误代码: " + se.ErrorCode);
return null;
}
catch
{
MessageBox.Show("错误代码!");
return null;
}
}
while (bytes > 0);
return page;
}
}
}