c# Socket客户端 定时发送数据并接收返回的问题

baidu_14928573 2014-12-26 01:21:09
我的客户端每天要定时向服务器请求数据
开始很简单的功能,两个按钮,一个连接服务器一个发送,一个接收框,一个输入框发送
​ ​Socket clientSocket;
Thread clientThread;

public Client()
{
InitializeComponent();
}

private void ConnectToServer()
{
byte[] data = new byte[1024];

string vIp = "192.168.1.20";
int vPort = 8888;
//创建一个套接字
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(vIp), vPort);
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将套接字与远程服务器地址相连
try
{
clientSocket.Connect(ipep);
}
catch (SocketException ex)
{
MessageBox.Show("connect error: " + ex.Message);
return;
}

while (true)
{
//接收服务器信息
int bufLen = 0;
try
{
bufLen = clientSocket.Available;

clientSocket.Receive(data, 0, bufLen, SocketFlags.None);
if (bufLen == 0)
{
continue;
}
}
catch (Exception ex)
{
MessageBox.Show("Receive Error:" + ex.Message);
return;
}

string clientcommand = System.Text.Encoding.ASCII.GetString(data).Substring(0, bufLen);

​ ​ ​ ​//lstClient是我的接收到的数据显示框
lstClient.Items.Add(clientcommand);
}
}

​ ​//连接按钮
private void btnConnect_Click(object sender, EventArgs e)
{
clientThread = new Thread(new ThreadStart(ConnectToServer));
clientThread.Start();
}

​ ​//发送按钮事件
private void btnSend_Click(object sender, EventArgs e)
{

//向服务器发送信息
//txtClient 是输入要发送消息的文本框
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(txtClient.Text);
clientSocket.Send(data, data.Length, SocketFlags.None);
}
这个是手动的功能,我加了个Timer,间隔1分钟,就自动请求一次数据

private void timer1_Tick(object sender, EventArgs e)
{
​ ​ ​ //向服务器发送信息
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(“要定时发送的请求”);
clientSocket.Send(data, data.Length, SocketFlags.None);
​ }
然后把发送按钮屏蔽掉,程序跑起来以后,手动点连接按钮,也没问题,会自动收到数据

但是当我把连接按钮里面的语句放到Timer里面
private void timer1_Tick(object sender, EventArgs e)
{
​ ​ ​ clientThread = new Thread(new ThreadStart(ConnectToServer));
clientThread.Start();
//向服务器发送信息
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(“要定时发送的请求”);
clientSocket.Send(data, data.Length, SocketFlags.None);
}
先自动连接服务器,然后再自动发送请求
然后在接收数据的里面加了
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
接收数据完成以后关闭连接,下次timer时间到了再打开连接,这么做就出现问题了
发送数据成功,但是接收不到返回的数据。

然后我又把
clientThread = new Thread(new ThreadStart(ConnectToServer));
clientThread.Start();
这两句拿到Form_Load里面,打开界面就加载了,然后等到了时间,直接发送数据,等着接收,成功了,但是我又改了一下,再改回来,又接收不到数据了

各位大神,怎么整这个?

各种改,改出来错:
在一个已经连接的套接字上做了一个连接请求。
由于套接 字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

然后我加了clientSocket.isConnected 没连就再连一次,还是报错

大神们帮帮忙啊,还在加班,下不了班了。。。
...全文
2202 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_14928573 2014-12-26
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
不要在主线程里发送,子线程里接收 你这既不是同步方式,也不算异步方式,完全是拍脑袋想出来的方式 甚至在发送的时候都没判断clientSocket.isConnected,如果连接意外关闭,你执行这个代码直接就抛异常了
大神能帮我修改一下代码么?小弟刚接触这块,各种不明白啊。。。
於黾 2014-12-26
  • 打赏
  • 举报
回复
不要在主线程里发送,子线程里接收 你这既不是同步方式,也不算异步方式,完全是拍脑袋想出来的方式 甚至在发送的时候都没判断clientSocket.isConnected,如果连接意外关闭,你执行这个代码直接就抛异常了
於黾 2014-12-26
  • 打赏
  • 举报
回复
逻辑很混乱 你要使用异步接收,就必须在接收的回调函数里写关闭 否则你不如改成同步方式,发送完就等待接收,接收完就关闭连接 此外,你应该把建立连接,发送,接收,关闭,放到一个过程里,执行完,线程就退出 否则一个线程在死循环,你又开一个线程,然后用同一个套接字操作,那不乱套了
於黾 2014-12-26
  • 打赏
  • 举报
回复
不要使用长连接,每次发送接收完将连接关闭 不要使用while死循环 服务器又不会向你推送,你不是需要先发送才能接收吗,不发送一直接收有什么意义
baidu_14928573 2014-12-26
  • 打赏
  • 举报
回复
自己up。。。

111,092

社区成员

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

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

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