在C#里Socket编程问题,为什么只能连接一台客户机?

wushengshan 2003-08-21 03:33:32
我现在写一个有关于Socket的程序,我已写出来了,可是Server端只能接受一个Client端并且有好几个功能都没有实现,请各位高帮帮忙。怎样才能可以接受多台客户端呢?还有怎么才能实现:每个客户端刚请求连接服务端时都用服务器的Port号(固定Port号),可连接上去时服务端下一个自定的Port号(Port+序号)(序号是自动增长的)给该客户端,这个客户程序收到服务器端发来的Port号时,再次用收到的Port号(Port+序号)重新和服务端程序进行再次连接。下一台客户机连接时也是如此。并且时时获取各台客户端程序的行为并以各台客户的Port号列出来显示在服务器端的ListBox控件里。
...全文
257 42 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
bnb852921 2010-06-29
  • 打赏
  • 举报
回复
不错 挺好
wkyjob 2003-09-12
  • 打赏
  • 举报
回复
private void btnStart_Click(object sender, System.EventArgs e)
{
try
{
IPHostEntry myHost = new IPHostEntry();
myHost = Dns.GetHostByName(txtServer.Text);
string IPstring = myHost.AddressList[0].ToString();
myIP = IPAddress.Parse(IPstring);
}
catch
{
MessageBox.Show("您输入的IP地址格式不正确,请重新输入!");
}

try
{
myServer = new IPEndPoint(myIP,Int32.Parse(txtPort.Text.Trim()));
mySocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mySocket.Bind(myServer);
mySocket.Listen(50);

txtState.Text = "主机"+txtServer.Text+"端口"+txtPort.Text+"开始监听.....";

//线程
Thread thread = new Thread(new ThreadStart(target));
thread.Start();
}
catch(Exception ee)
{
txtState.Text = ee.Message;
}

}//end btnStart_Click

//线程同步方法target
private void target()
{
while(true)
{
//设为非终止
myReset.Reset();

mySocket.BeginAccept(new AsyncCallback(AcceptCallback),mySocket);

//阻塞当前线程,直到收到请求信号
myReset.WaitOne();
}
}//end target

//异步回调方法AcceptCallback
private void AcceptCallback(IAsyncResult ar)
{
//将事件设为终止
myReset.Set();

Socket listener = (Socket)ar.AsyncState;
handler = listener.EndAccept(ar);

//获取状态
StateObject state = new StateObject();
state.workSocket = handler;

txtState.Text = "与客户建立连接。\r\n";

ListViewItem item ;
//向lvIncept控件写入一条新进入的客户信息
string[] itemName = new string[3];
itemName[0] = handler.RemoteEndPoint.ToString();
itemName[1] = DateTime.Now.ToString();
itemName[2] = "正在连通状态.................................................";
item = new ListViewItem(itemName,0);
item.Checked=false;

//统计连接客户端数
intClient++;
txtCount.Text = intClient.ToString();

lvIncept.Items.Add(item);

try
{
byte[] byteData = System.Text.Encoding.UTF8.GetBytes("已经准备好,请通话!"+"\r\n");
//开始发送
handler.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
}

//线程
Thread thread = new Thread(new ThreadStart(begReceive));
thread.Start();

}//end AcceptCallback

//异步回调方法 SendCallback
private void SendCallback(IAsyncResult ar)
{
try
{
handler = (Socket)ar.AsyncState;
int bytesSent = handler.EndSend(ar);
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
}

}//end SendCallback

//线程同步方法begReceive
private void begReceive()
{
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReadCallback),state);

//中断指定的客户端
if(ClickBreak)
{
BreakClient(ref handler);
}

string strAccept = "";
strAccept = state.sb.Append(System.Text.Encoding.UTF8.GetString(state.buffer,0,24)).ToString();
//sw.Write(handler.RemoteEndPoint.ToString()+":");
sw.WriteLine(strAccept);
//MessageBox.Show(strAccept);
txtSend.Text = strAccept;
sw.Flush();

}//end begReceive

//异步回调方法ReadCallback
private void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject) ar.AsyncState;
Socket tt = state.workSocket;

//重新开始读取数据
try
{
//结束读取并获取读取字节数
//int bytesRead = handler.EndReceive(ar);
int bytesRead = tt.EndReceive(ar);
state.sb.Append(System.Text.Encoding.UTF8.GetString(state.buffer,0,bytesRead));
string content = state.sb.ToString();
state.sb.Remove(0,content.Length);

//txtSend.Text = content;
textBox1.AppendText(tt.RemoteEndPoint.ToString()+": "+content+"\r\n");

tt.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReadCallback),state);
}
catch
{
//从lvIncept控件删除相应的信息
if(ClickBreak == false)
{
for(int i=0;i<lvIncept.Items.Count;i++)
{
if(lvIncept.Items[i].SubItems[0].Text == tt.RemoteEndPoint.ToString())
{
lvIncept.Items[i].Remove();
}
}
}

intClient--;
txtCount.Text = intClient.ToString();
}

//控制颜色
CortrolColor(ref lvIncept);

}//end ReadCallback

//发送信息
private void SendMessage(string strSend)
{
try
{
byte[] byteData = System.Text.Encoding.UTF8.GetBytes(strSend);

/*
for(int i = 0;i<lvIncept.Items.Count;i++)
{
if(lvIncept.Items[i].Checked)
{
if(lvIncept.Items[i].SubItems[0].Text == handler.RemoteEndPoint.ToString())
{
//开始发送数据
handler.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);
}
}
}
*/

//开始发送数据
handler.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
}

}//end SendMessage
kuangren 2003-09-01
  • 打赏
  • 举报
回复
tcp只能和一个客户进行连接,用UDP吧
_weiKun_ 2003-08-28
  • 打赏
  • 举报
回复
你把我的文件不用.NET打开,用ULTRAEDIT 打开它得CS文件,即可呀,我是另外写得工程,没有用你的工程,你用我的连接,和发送,接受得函数即可。我就不给你写了,我在给你发一份。
zhbname 2003-08-28
  • 打赏
  • 举报
回复
关注
wushengshan 2003-08-28
  • 打赏
  • 举报
回复
那怎么办呀!你帮帮我好不好!要不我完蛋了。你帮我用Visual C#来在我发给你的工程文件的基础上写好吗?求你了.......
_weiKun_ 2003-08-28
  • 打赏
  • 举报
回复
我是用。net 2003写的,我在哈尔滨
wushengshan 2003-08-28
  • 打赏
  • 举报
回复
TO:_weiKun_(Virus)
你发给我的文件打不开,你在我发给你的那个工程文件的基础上写,好吗?我等你的好消息!!!非常感谢您!!!!我会给多分给你的。再次谢谢。。。
wushengshan 2003-08-28
  • 打赏
  • 举报
回复
TO:_weiKun_(Virus)
那我怎么获取各个连接的客户端的IP地址和机器名呢?怎么断开指定的客户端呢?怎么给指定的客户端发信息呢?
wushengshan 2003-08-27
  • 打赏
  • 举报
回复
怎么实现在服务器端给某个指定的客户端发送信息,能够断开某个指定的客户端呢?在客户端连接时怎么获取该客户的机器名和IP地址呢?
_weiKun_ 2003-08-27
  • 打赏
  • 举报
回复
你用我给你写得模式,写联接,或断开,即可。我已发到你的邮箱,记得给分呀,呵呵
wushengshan 2003-08-27
  • 打赏
  • 举报
回复
TO:weiKun_(Virus)
我改过来还是这样,不能连接多个客户端。我的需求是这样:要求每个客户端连接上来时都有一个自己的端口号(Port)和Socket对象,这样就服务器就容易对各个客户端进行管理。可是每个客户刚要和服务端连接时都用固定的端号(Port)和服务器名进行连接。你帮我写好不好?我现在好乱。求求你了。
_weiKun_ 2003-08-27
  • 打赏
  • 举报
回复
up
hjcy_2002 2003-08-27
  • 打赏
  • 举报
回复
发给我吧,应该可以搞定
_weiKun_ 2003-08-27
  • 打赏
  • 举报
回复
我也不一定,尽力吧
wushengshan 2003-08-27
  • 打赏
  • 举报
回复
TO:_weiKun_(Virus):
  你好!我已我把程序发到你邮箱了,你帮我看一下,帮我完成这个任务。谢谢您!!!!
_weiKun_ 2003-08-27
  • 打赏
  • 举报
回复
另一个,把你写的Socket送到我的邮箱
wk2003119@tom.com
_weiKun_ 2003-08-27
  • 打赏
  • 举报
回复
我想想,晚上给你信吧
wkyjob 2003-08-26
  • 打赏
  • 举报
回复
UP
wushengshan 2003-08-26
  • 打赏
  • 举报
回复
我等。。。。。。。。。。
加载更多回复(22)
C#多线程与Socket编程 在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式 ,都有这样一个概念:数据库服务器。这要求一台性能和配置都比较好的主机作为服务器, 以满足数目众多的客户端进行频繁访问。但是对于一些数据交换的要求不主同,而且涉及到的通讯个体数目不多,如果还采用“一主机多客户机”的模式, 便要求一台硬件配置良好而且软件上安装了相关数据服务软件,这样会造成硬件和软件上的很多不必要的成本,这时Socket在点对点的平行对象之间的网络通讯的优势就就发挥出来了。 其实对于Socket通讯来说,服务器和客户端的界定不像数据库服务器与客户端那样明显,甚至可以说Socket通讯面的服务器和客户端只是相对的, 因为网络通讯的对象基本上是处于平等层面的,只是为了方便对两台联网通讯的主机的描述才这样定义称谓的。 由于在.NET中Socket通讯的建立很容易,所以本文主要介绍一个Socket的比较典型的应用的流程:客户端向服务器发送图片请求,图片服务器接收到请求, 并将服务器硬盘上的图片编码,发送到客户端,客户端得到图片数据后,再将这些数据写成图片文件,保存在客户端上。 本文主要是对Socket的一个应用进行介绍,所以至于其原理在此没有深究,至于如何建立Socket还有如何实现网络的七层协议在此都没有进行相关研究和介绍, 本文主要介绍如何实现一个用户想要的功能,即在两台主机之间进行通讯,通过网络来收发用户想要收发的数据。

111,094

社区成员

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

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

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