关掉客户端提示 (其他信息: 远程主机强迫关闭了一个现有的连接。)怎么处理呢?我是新手。

m0_37355223 2017-10-14 04:46:20
服务端:
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace 服务端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//监听设置了线程,不让主线程知道,否则主线程做两件事就出错
}

private void label1_Click(object sender, EventArgs e)
{

}

private void textBox4_TextChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
//当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;// 提供监听所有客户端IP
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtport.Text));//绑定IP和端口
socketWatch.Bind(point);//绑定监听
socketWatch.Listen(10);//设置监听列队
ShowMsg("开始监听");
Thread th = new Thread(Listen);//创建线程
th.IsBackground = true;//设为后台线程
th.Start(socketWatch);//告诉CPU 监听的socketWatch线程准备好了.
}

void ShowMsg(string str)
{
txtlog.AppendText(str + "\r\n");
}


/// <summary>
/// 等待客户端连接,并且创建与之通信的Socket
/// </summary>
///
Socket socketSend;
void Listen(object o) //调用这个方法的时候把o做为参数调进来
{
Socket socketWatch = o as Socket; //as把o强转为Socket,如果成功为true,否则为空

while (true)
{
socketSend = socketWatch.Accept();//负责和客户端通信的socketSend
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");//拿到客户端的IP和端口
//将远程连接的客户端的IP地址和Socket存入键值集合中
dicsocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将远程连接的客户端的IP地址和Socket存入下拉框中
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());

Thread th = new Thread(Recive);//创建Recive线程接收客户端的数据
th.IsBackground = true;//设为后台线程
th.Start(socketSend);//告诉CPU 监听的socketSend线程准备好了.

}
}


/// <summary>
/// 服务端不停的接收客户端发来的消息
/// </summary>
/// <param name="o"></param>
///
void Recive(object o)
{
Socket socketSend = o as Socket; //as把o强转为Socket,如果成功为true,否则为空


while (true)//循环接收用户的数据
{
byte[] buffer = new byte[1024 * 1024 * 2]; //建立缓冲区
int r = socketSend.Receive(buffer);//接收到的数据存到缓冲区,并返回int 值
if (r == 0)//判断接收的数据是空那么就关闭,否则一直循环空消息
{
break;
}
//用UTF8解码传过来的数字从0开始到r结束
string str = Encoding.UTF8.GetString(buffer, 0, r);
//解码完成添加到txtlog
ShowMsg(socketSend.RemoteEndPoint + ":" + str);

}


try
{

}
catch (Exception)
{

throw;
}

}


//创建键值对集合,将远程连接的客户端的IP地址和Socket存入键值集合中
Dictionary<string, Socket> dicsocket = new Dictionary<string, Socket>();
private void button4_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();//Trim是删除前后空格
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//将文本字符转为字节

List<byte> list = new List<byte>();//声明泛型集合,以后可以知道发送给客户端什么类型的数据
list.Add(0);
list.AddRange(buffer);
//将泛型集合转换为数组
byte[] newBuffer = list.ToArray();
//获得用户在下拉框cboUsers中的IP地址和端口
string ip = cboUsers.SelectedItem.ToString();
dicsocket[ip].Send(newBuffer);
// socketSend.Send(buffer);

}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}



客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 客户端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//监听设置了线程,不让主线程知道,否则主线程做两件事就出错
}

Socket socketSend;//创建负责连接的Socket
/// <summary>
/// 连接服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口的Socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);//IP地址
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtport.Text));//绑定IP和端口
socketSend.Connect(point);//连接远程服务器应用程序的IP和端口
ShowMsg("连接成功");

//开启一个新的线程,不停的接收服务端发来的消息
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start();
}




private void Form1_Load(object sender, EventArgs e)
{

}
void ShowMsg(string str)
{
textBox3.AppendText(str + "\r\n");
}


/// <summary>
/// 客户端不停的接收服务端发来的消息
/// </summary>
/// <param name="o"></param>
void Recive(object o)
{

while (true)
{
byte[] buffer = new byte[1024 * 1024 * 3];//声明字节数组
int r = socketSend.Receive(buffer);
if (r == 0)
{
break;
}
//0表示接收到文字消息
if (buffer[0] == 0) //文字消息处理
{
string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
ShowMsg(socketSend.RemoteEndPoint + ":" + str);
}


}

}

/// <summary>
/// 客户端给服务器发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();//客户端要发送到服务器的消息,集中到字符串
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//将文本字符串转为字节
socketSend.Send(buffer);//发送字节到已连接服务器
}

private void button3_Click(object sender, EventArgs e)
{
socketSend.Close();

}
}
}



...全文
2121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
llliao104 2020-10-25
  • 打赏
  • 举报
回复
请问你是怎么解决的呢,我也遇到这个问题,服务端接收数据的时候显示“远程主机强迫关闭一个现有连接”。
qq_36517242 2018-01-03
  • 打赏
  • 举报
回复
请问您怎么解决的呀,我也遇到在服务器接收数据的过程中出现了被远程主机关闭现有连接的问题?非常感谢,请指导一下
xian_wwq 2018-01-03
  • 打赏
  • 举报
回复
这个错误很正常,try...catch就可以了
qq_36517242 2018-01-03
  • 打赏
  • 举报
回复
可是照理说加了try...catch只是捕获了这个错误而已,而我也试了,事实也是这样,请问您不是这样的结果吗
m0_37355223 2017-10-14
  • 打赏
  • 举报
回复
自己已经解决!谢谢
一种上传软件 在家还是在办公室,行业领先的一种上传软件软件可以智能地和安全地移动你的重要文件在多个地点在广域网或局域网。用一种上传软件你可以发布网页,下载最新的音乐,图片,和软件;或国内服务器之间传输文件,你的互联网服务提供商,office-any服务器,您可以通过网络访问。 一种上传软件很简单对于新手FTP用户,然而强大的足以让有经验的用户。 友好的用户界面使您可以轻松地更新和维护复杂的网站。 你可以用一种上传软件维护关键任务文件传输的安全特性。 你甚至可以计划和脚本使用转让引擎转移以最小的开销。您可以使用传输引擎在一种上传软件或与任何COM-enabled脚本或编程语言 一个集成的、彩色的HTML编辑器允许您创建、打开和编辑HTML文件在您的计算机上或在一种上传软件远程服务器。 Unicode support-CuteFTP支持Unicode的文件名称。 集成TappIn™通过Globalscape® 文件传输安全 安全SSL Sessions-CuteFTP保护与128位SSL会话,相同的安全技术所使用的网络浏览器和服务器身份验证、消息完整性和数据机密性。SSL会话Choices-When设置SSL连接,一种上传软件允许您选择三种常见的SSL实现,包括TLS(AUTH TLS)*,SSL隐* *(直接连接在端口990)和SSL显式* *(身份验证SSL)模式。大多数FTP服务器支持至少一种,而一些(比如Globalscape EFT服务器)支持所有三个。 SSL Certificates-CuteFTP包括一个完整的证书管理系统,让您能够接受或拒绝一个服务器的证书,接受证书存储在一个本地数据库,导入和导出证书在本地存储,使用窗口的受信任的证书存储证书的批准,并且能够创建自己的“强势”(4096位)自签名证书,包括一个证书请求文件(签字的证书颁发机构(CA)如Verisign或Thawte)。 HTTPS Sessions-Connect,浏览目录,并转移到/从HTTPS网站使用相同的强大的安全性(SSL)web浏览器使用安全电子商务交易。HTTPS网站也依靠证书来验证客户端与所需的HTTPS服务器通信。 Secure Shell(SSH2)Sessions-CuteFTP还支持SSH2协议,具体来说,SFTP。 SFTP配置Options-CuteFTP给你巨大的控制你SFTP会话,包括选择加密密码,MAC(消息身份验证代码)类型、压缩和身份验证*机制使用。 SFTP身份Files-Use身份文件提供的主机或创建自己的密钥对进行身份验证。在创建自己的身份文件时,您可以选择在RSA和DSS公钥格式,密钥长度(4096位)和关键的存储位置。受信任的服务器标识文件(证书)存储在一个本地数据库。你也可以导入或导出身份文件从您的本地信任存储。 了OpenPGP加密和Decryption-CuteFTP使用开源加密了OpenPGP技术加密数据之前发送到服务器或解密从服务器检索数据。了OpenPGP使用公钥和私钥。这允许您给别人你的公钥,它们可以使用加密一个文件。只有你能与你的私钥解密文件。了OpenPGP功能在一种上传软件允许您加密文件在上传之前或解密文件下载后,创建了OpenPGP键,关键尺寸,并选择RSA或DSS密码;导入和导出了OpenPGP钥匙。 安全登录使用OTP-Some情况呼吁安全登录序列,但不是后续数据的保护和控制通道的事务。对于这种情况,一种上传软件提供了一次密码(OTP)认证,一个协议基于贝尔实验室的S /关键技术。OTP身份验证是接受许多UNIX和一些窗口FTP主机,包括Globalscape EFT服务器。 密码Manager-Encrypt站点内容管理器使用强大的河豚密码或完全禁止密码保存,包括URL和快速连接历史,在应用程序会话。您还可以更改默认的站点管理器和session-log存储位置。这些政策和功能帮助降低风险当运行在一个共享或身体上无限制的机器。 连接选项 连接Wizard-CuteFTP的连接向导可以指导您完成设置一个新的FTP连接。一旦完成,一种上传软件会自动连接到新网站并将其储存在您的站点经理后续连接。 网站一般Manager-Store访问网站内置的地址簿,站点管理器。站点管理器允许您设置per-Site特定的选项,你可以导出或导入站点数据,包括地址簿来自第三方的FTP客户端或一种上传软件的早期版本。您可以选择密码保护您的站点经理强加密来保护你的网站信息(特别是网站密码)。 快速Connect-CuteFTP提供其他各种连接选择。使用快速连接栏进入网站连接信息;使用粘贴URL对话框从剪贴板粘贴整个网址,创建一个新的网站,或直接从主菜单中启动一个现有的,或一种上传软件在程序启动时自动重新连接

110,536

社区成员

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

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

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