一个网络程序,在局域网调试没有问题,把服务器端移到英特网(外网)上,运行客户端时出现"远程主机强迫关闭了一个现有的连接"错误!请高手进,在线等
服务器端代码:class Threadtcp
{
private Socket server;
public Threadtcp()
{
IPAddress local = Dns.GetHostAddresses(Dns.GetHostName())[0];
IPEndPoint iep = new IPEndPoint(local, 30000);
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
server.Bind(iep);
server.Listen(20);
Console.WriteLine("等待客户机进行连接...");
while (true)
{
Socket client = server.Accept();
clientThread newclient = new clientThread(client);
Thread newthread = new Thread(new ThreadStart(newclient.ClientService));
newthread.Start();
}
}
}
class clientThread
{
public static int conn = 0;
public Socket service;
int i;
public clientThread(Socket sc)
{
this.service = sc;
}
public void ClientService()
{
string data = null;
byte[] bytes = new byte[1024];
if (service != null)
Console.WriteLine("新客户连接建立:{0}个连接数",++conn);
while ((i = service.Receive(bytes)) != 0)
{
data = Encoding.ASCII.GetString(bytes,0,i);
Console.WriteLine("收到的数据:{0}", data);
data = data.ToUpper();
byte[] msg = Encoding.ASCII.GetBytes(data);
service.Send(msg);
Console.WriteLine("发送的数据:{0}",data);
}
service.Close();
Console.WriteLine("客户关闭连接:{0}个连接数",--conn);
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
string str = null;
while (str != "1")
{
byte[] buffer = new byte[1024];
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress adr = IPAddress.Parse("192.168.1.100");
IPEndPoint ep = new IPEndPoint(adr, 30000);
str = Console.ReadLine();
server.Connect(ep);
server.Send(Encoding.ASCII.GetBytes(str));
int rec = server.Receive(buffer);//就在这里出错:“远程主机强迫关闭了一个现有的连接”
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, rec));
server.Close();
Console.WriteLine("断开了与服务器的连接...");
}
}
}
当把客户端的IP地址换成外网服务器端的IP就不行了.另外,30000端口已打开,服务器操作系统是windows server 2003 enterprise 服务器WINDOWS防火墙已关闭.不过服务器有一个ARP防火墙客户端关不了,只能关闭ARP服务. --------------------编程问答-------------------- up --------------------编程问答-------------------- up --------------------编程问答-------------------- up
--------------------编程问答-------------------- Socket 学习 --------------------编程问答-------------------- 1. 对方关闭时没有调用 shutdown 而是直接调用 closesocket 时会出现这个问题
2. 对方的进程异常结束时 --------------------编程问答-------------------- 学习来。 --------------------编程问答-------------------- 你完全可以捕获这个异常,然后处理这个异常! --------------------编程问答-------------------- 这个是因为服务器端已经将连接断开了,
所以这个异常是需要捕获的,然后把连接断开,释放socket
如果需要重新连接,则去重新连接。 --------------------编程问答-------------------- 帮顶来。
补充:.NET技术 , C#