TIdTCPClientCustom.Connect源码如下,中文注释是自己写的。
procedure TIdTCPClientCustom.Connect;begin if Connected then begin EIdAlreadyConnected.Toss(RSAlreadyConnected); //如果已经连接则抛出AlreadyConnected的异常 end; if Host = '' then begin EIdHostRequired.Toss(''); //如果Host为空,则抛出EIdHostRequired的异常 end; if Port = 0 then begin EIdPortRequired.Toss(''); //如果Host为空,则抛出EIdPortRequired的异常 end; if IOHandler = nil then begin IOHandler := MakeImplicitClientHandler; IOHandler.OnStatus := OnStatus; //改变OnStatus的状态 ManagedIOHandler := True; end; try // Bypass GetDestination if FDestination <> '' then begin IOHandler.Destination := FDestination; end;{BGO: not any more, TIdTCPClientCustom has precedence now (for port protocols, and things like that) // We retain the settings that are in here (filled in by the user) // we only do this when the iohandler has no settings, // because the iohandler has precedence if (IOHandler.Port = 0) and (IOHandler.Host = '') then begin IOHandler.Port := FPort; IOHandler.Host := FHost; end;} IOHandler.Port := FPort; //BGO: just to make sure IOHandler.Host := FHost; IOHandler.ConnectTimeout := FConnectTimeout; IOHandler.ReadTimeout := FReadTimeout; if Socket <> nil then begin Socket.BoundIP := FBoundIP; Socket.BoundPort := FBoundPort; Socket.BoundPortMin := FBoundPortMin; Socket.BoundPortMax := FBoundPortMax; Socket.IPVersion := FIPVersion; Socket.ReuseSocket := FReuseSocket; Socket.UseNagle := FUseNagle; Socket.OnBeforeBind := FOnBeforeBind; Socket.OnAfterBind := FOnAfterBind; Socket.OnSocketAllocated := FOnSocketAllocated; end; IOHandler.Open; //打开IO if IOHandler.Intercept <> nil then begin IOHandler.Intercept.Connect(Self); end; DoStatus(hsConnected, [Host]); DoOnConnected; //调用OnConnected函数 except //捕捉异常 if IOHandler <> nil then begin IOHandler.Close; if ManagedIOHandler then begin IOHandler := nil; // RLebeau - SetIOHandler() will free the IOHandler end; end; raise; end;end;。
应该是无法建立安全的TCP/IP连接的意思, 错误信息里未详细说明无法建立连接的原因, 猜测: 。
可能是IP地址不对;
也可能是网络不通;
或者是有防火墙,导致无法建立连接;。
还有一种可能是安全加密协议不支持, 或者密钥未设置或者不对导致的;。
看看下面的参考吧,可能对你有帮助: 该控件包装了一个完整的TCP客户端。该客户端包括sock支持。该控件是以下客户端控件的父类: TIdDayTime, TIdEcho, TIdFinger, TIdFTP, TIdGopher, TIdHTTP, TIdNNTP, TIdPOP3, TIdQUOTD, TIdSMT.。
在运行中输入cmd ,然后用 netstat -an 看下有没有8888这个端口?至少可以看是不是被占用了。
是TCP协议吧,原因是服务器没有启动,或者启动了没有处于侦听状态。
是TCP协议,在实例化tcpclient = new TcpClient(remoteIpString, remotePort);的时候报错。
我想问一下,在同一个程序中怎么既充当服务器有充当客户端?
很有如果我用本机的ip做监听服务器地址,然后用127.0.0.1做客户机的ip地址可以嘛?
我想做的是P2P数据传送
这个8888应该是服务端的监听端口,如果netstat看不到的话肯定是会发生lz你所说的问题的。你应该还要启动这个服务端才对。
貌似不是在服务器端了,程序开始默认获取本机ip地址以及一个可用的端口,然后对这个端口进行监听。然后让你添加一个或多个好友ip地址及端口号。我是在添加好友的时候出现这个错误的。添加好友的ip我试过用127.0.0.1和本机ip,都报这个错。
网上那些“范例”很多都是所谓的单机demo,不要相信是产品的。回答你#4楼的问题。最起码的,通用服务器不是什么什么127.0.0.1进行bind操作的。比较正规的是IPAddress.Any,比较业余的也是从dns对象中遍历IPAddress集合,找出其中第一个符合ipv4模式的地址。你看到127.0.0.1的,直接把这个写“范例”的作者当作骗子好了。
大规模的测试,产品化的测试,这是必需的。不要相信仅仅是为了掩饰一个特别方法随便写的所谓范例。即使是msdn上的通讯范例,大多数也是非产品化的。因为它如果按照产品设计必须有的要素来设计,初学者反而会“看不懂”。这就是一个现实矛盾。
服务器应该害是启动了的,服务器的ip是本机ip,端口号时一个随机可用的值。这是我的理解。
我把监听的代码贴上来,在程序加载方法里调用。
ThreadStart myThreadStartDelegate = new ThreadStart(Listensing);。
//创建一个用于监听的线程对象,通过代理执行线程中的方法 myThread = new Thread(myThreadStartDelegate);。
//启动线程。
myThread.Start();。
一下是监听方法
private void Listensing()。
{
Socket socket = null;。
//获取本机上第一个可用的IP地址 myIPAddress = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);。
Random r = new Random();。
while (true) 。
{
try。
{。
//随机产生一个0~65535之间的端口号。
myPort = r.Next(65535);。
//myPort = 8888;。
//创建TcpListener对象,在本机的IP和Port端口监听连接到该IP和端口的请求。
tcpListener = new TcpListener(myIPAddress, myPort);。
//开始监听,如果不出现异常,则说明IP地址和端口号可用。
tcpListener.Start();。
//显示IP地址和端口。
ShowLocalIPAndPort();。
//在信息窗口显示成功信息。
ShowMyMessage(string.Format("尝试用端口{0}监听成功", myPort));。
ShowMyMessage(string.Format("<message>[{0}]{1:h点m分s秒}开始在端口{2}监听与本机的连接", myIPAddress, DateTime.Now, myPort));。
break;。
}。
catch 。
{。
//继续while循环,以便随机找下一个可用端口号,同时显示失败信息。
ShowMyMessage(string.Format("尝试用端口{0}监听失败", myPort));。
}。
}
while (true) 。
{
try。
{。
//使用阻塞方式接受客户端连接,根据连接信息创建Tcpclient对象。
//注意:AcceptSocket接受到新的连接请求才会继续执行其后的语句。
socket = tcpListener.AcceptSocket();。
//如果往下执行,说明已经根据客户端连接请求创建了套接字。
//使用创建的套接字接受客户端发送的信息。
NetworkStream stream = new NetworkStream(socket);。
StreamReader sr = new StreamReader(stream);。
string recieveMessage = sr.ReadLine();。
int i1 = recieveMessage.IndexOf(",");。
int i2 = recieveMessage.IndexOf(",", i1 + 1);。
int i3 = recieveMessage.IndexOf(",", i2 + 1);。
string ipString = recieveMessage.Substring(0, i1);。
string portString = recieveMessage.Substring(i1 + 1, i2 - i1 - 1);。
string messageTypeString = recieveMessage.Substring(i2 + 1, i3 - i2 - 1);。
string messageString = recieveMessage.Substring(i3 + 1);。
ShowMyMessage(ipString, portString, messageTypeString, messageString);。
}。
catch 。
{。
//通过停止TcpListener使AcceptSocket方法出现异常。
//在异常处理中关闭套接字并终止线程。
if (socket != null) 。
{。
if (socket.Connected) 。
{。
socket.Shutdown(SocketShutdown.Receive);。
}。
socket.Close();。
}。
myThread.Abort();。
}。
}
}
http://topic.csdn.net/u/20100506/18/19b27fcf-af70-4016-a30c-10de342c3214.html。
System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接。 127.0.0.1:80。
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)。
在 System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)。
在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)。
--- 内部异常堆栈跟踪的结尾 ---。
在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)。
在 System.Net.HttpWebRequest.GetRequestStream()。
在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)。
这种你最好是用HttpWebRequest或是WebClient来获取,不用自己去分析这些了。直接能得到想的值。
首先在iPhone操作界面中找到“设置”点击进入。
点击“设置”进入后,在左侧看到“Wi-Fi”设置项目了,同样点击进入设置。
在右侧看到可用的Wifi无线网络列表(前提是iPhone附近有无线网络,并且信号范围之内。
在搜索到无线Wifi网络列表中,选择自己创建的或者某些场合的免费Wifi网络,进行连接,如果Wifi网络要密码的话,输入对应的密码。
如果Wifi无线网络信号较好,并且输入了正确的Wifi无线密码后,即可成功连接到Wifi无线网络了,返回后,可以看到在连接的Wifi无线网络列表前已经打上勾了,就开始Wifi无线网络上网了.。