C# TCPClient/TCPListener 编程

来源:百度知道 编辑:UC知道 时间:2024/06/18 10:24:41
本人想实现 一个 C/S 结构的 简单功能.

但是头绪比较乱,想高人帮忙指点一下.

服务器端:
程序开始运行时,5秒后(看完客户端的功能,您就能知道这5秒什么意思)开始40秒的倒计时.当倒计到期(为0)时.便向所有已连接的客户端发送字符串"1".然后开始下一次的(5)+40秒倒计时,如此循环.

客户端:
程序开始运行时,检测服务器端的倒计时状态.

如果服务器端还没进入倒计时状态(也就是还处在倒计时前5秒的状态中),则让客户端进入.

如果服务器端已经进入倒计时状态.则弹出对话框让用户等待(等到下一次循环前的那5秒中再自动进入).....

客户端界面:

2个 label 控件.

一个用来显示服务器端倒计时的时间(如服务器倒计时到了39,则label1.text = "39",服务器到了38,则label1.text="38"..以此类推).

当服务器倒计时结束.
所有已连接的客户端的label2.text = 服务器返回过来的那个字符串"1".

提供详细的代码,以及说明文档.本人将追加分数.
服务器利用Timer 间隔1秒 倒计时时间 -1

客户端则 也就是label1.text = string.format("{0}", int.parse(label1.text) - 1);

注意我不需要客户端自己拥有倒计时的功能.

而是服务器端 拥有 40秒 每一秒钟 -1 并发送给所有客户端结果的功能.

也就是说 客户端上的数据 完全是由服务器端发送过来的....

1、叙述有点问题:客户端必须先尝试连接,并且不能操作员手工连接,因为不知道服务器的状态,所以客户端有一个定时连接尝试的timer,当然并非倒计时的Timer。
另外一个问题:数据包可能丢失,所以服务器告诉客户端每次-1的做法不可靠,应该是发给客户端当前的秒数。
2、代码:卖过几千元钱的啊
(1) 客户端:
public partial class Form1 : Form
{
Socket clientSock ;//连接服务器的客户端Socket
IPAddress serverIp = IPAddress.Parse("127.0.0.1");
int port = 8000;
Thread thread;//接收数据的线程

delegate void SetReceivedToLabelCallBack(string msg,bool isSeconds);//数据接收线程到窗体的跨线程调用委托

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
try
{
linkToServer();//连接服务器
}
catch (Exception ec)
{
MessageBox.Show(ec.Message+",每隔1秒会自动再试");
timerTryLinkToServer.Enabled =