SocketRec.RemoteEndPoint
时间: 2023-12-28 13:04:10 浏览: 33
`SocketRec.RemoteEndPoint` 是一个 `System.Net.EndPoint` 类型的属性,它表示与当前 `System.Net.Sockets.Socket` 对象关联的远程网络终结点。更具体地说,它返回一个 `System.Net.IPEndPoint` 对象,该对象包含了远程计算机的 IP 地址和端口号。通过该属性可以获取到当前 `Socket` 对象所连接的远程主机的信息。
相关问题
如果我还有这样的接收消息的代码呢? var proxSocket=socket as Socket; byte[]data=new byte[1024*1024]; while (true) { int len = 0; try { len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); } catch { AppendTextToTxtLog(string.Format("服务器端:{0}非正常退出",proxSocket.RemoteEndPoint.ToString())); StopConnect(); return; } if (len <= 0) { AppendTextToTxtLog(string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString())); StopConnect(); return; } int type = data[0]; if (type == 1) { string str=Encoding.Default.GetString(data,1,len-1); AppendTextToTxtLog(string.Format("接收到服务器端:{0}的消息是:{1}", proxSocket.RemoteEndPoint.ToString(), str)); }else if(type == 2) { Flash(); }else if (type == 3) { saveFile(data, len); } }
在关闭连接时,您需要停止接收数据并退出循环。可以添加一个布尔变量 `isConnected`,并在关闭连接时将其设置为 `false`。然后在循环中,检查此变量的值,如果为 `false`,则退出循环。以下是修改后的代码示例:
```
var proxSocket = socket as Socket;
byte[] data = new byte[1024 * 1024];
bool isConnected = true; // 添加 isConnected 变量
while (isConnected) // 修改循环条件
{
int len = 0;
try
{
len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
}
catch
{
AppendTextToTxtLog(string.Format("服务器端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnect();
return;
}
if (len <= 0)
{
AppendTextToTxtLog(string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
StopConnect();
return;
}
int type = data[0];
if (type == 1)
{
string str = Encoding.Default.GetString(data, 1, len - 1);
AppendTextToTxtLog(string.Format("接收到服务器端:{0}的消息是:{1}", proxSocket.RemoteEndPoint.ToString(), str));
}
else if (type == 2)
{
Flash();
}
else if (type == 3)
{
saveFile(data, len);
}
}
```
在关闭连接时,将 `isConnected` 设置为 `false`:
```
isConnected = false;
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
```
/// 不停的接收从服务器发来的消息 /// </summary> void Receive() { try { while (true) { byte[] buffer = new byte[1024];//1024*1024*2 int r = socketSend.Receive(buffer); string s = Encoding.UTF8.GetString(buffer, 0, r); ShowMsg(socketSend.RemoteEndPoint + ":" + s); int intRecData = int.Parse(s); Chart.ChartData = intRecData; //mybtn.BtnData = buffer; } } catch(Exception ex) { ShowMsg(ex.Message); MessageBox.Show(ex.Message); } }优化这段代码
在上述代码中,可以考虑使用异步方法来接收从服务器发来的消息,以避免阻塞UI线程。以下是一个示例:
```
async void Receive()
{
try
{
while (true)
{
byte[] buffer = new byte[1024];//1024*1024*2
int r = await socketSend.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string s = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint + ":" + s);
int intRecData = int.Parse(s);
Chart.ChartData = intRecData;
//mybtn.BtnData = buffer;
}
}
catch (Exception ex)
{
ShowMsg(ex.Message);
MessageBox.Show(ex.Message);
}
}
```
在上述代码中,使用了`await socketSend.ReceiveAsync()`方法来异步接收数据,这样可以避免阻塞UI线程。同时,也可以考虑使用`ArraySegment<byte>`来避免在每次接收数据时都创建一个新的缓冲区。