关于java中Socket无法连接服务器的问题
c/s模式 你不仅需要一个client 还需要一个server
你只写了一个client,没用对应的server 当然无法连接了!
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
/
@author zc
@version 2011-8-1 下午04:35:19
/
public class Server {
public static void main(String[] args) {
Server server = new Server();
serverawait();
}
public void await(){
try {
ServerSocket ss = new ServerSocket(1234);
while (true) {
Socket s = ssaccept();
Systemoutprintln("accepted a request");
Systemoutprintln(s);
}
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
给你写了个简单的server
小鸟云服务器niaoyun实例创建好之后,您可以使用以下任意一种方式登录服务器:
远程桌面连接(MicrosoftTerminalServicesClient,MSTSC):采用这种方式登录,请确保实例能访问公网。如果在创建实例时没有购买带宽,则不能使用远程桌面连接。
管理终端VNC:无论您在创建实例时是否购买了带宽,只要您本地有网页浏览器,都可以通过管理控制台的管理终端登录实例。
使用远程桌面连接(MSTSC)登录实例
打开开始菜单>远程桌面连接,或在开始菜单>搜索中输入mstsc。也可以使用快捷键Win+R来启动运行窗口,输入mstsc后回车启动远程桌面连接。
在远程桌面连接对话框中,输入实例的公网IP地址。单击显示选项。
输入用户名,如小鸟云默认为niaoyun。单击允许我保存凭据,然后单击连接。这样以后登录就不需要手动输入密码了。
socket是用来和服务器通信的,无法直接调用服务器函数。
要实现功能,可以和服务器约定协议。
比如,在与服务器通信连接后,发送一系列标识符,最后加一个函数id,表示要求服务器调用约定的某一个函数。
服务器在接收到后,执行对应的函数,将结果返回给客户端即可。
实现步骤
1发现WCF默认不支持原始字节流传输, 即访问WCF的Server端的消息都已被MSFT封装(内部是xml),即使用各种MessageEncoder也不可以, WCF会把需要传输的数据封装到xml的body部分。
2经过试验, 想要实现传输原始字节流, 从下到上必须实现自定义IChannel,自定义ChannelBase,自定义RequestContext,自定义Listener和Factory,自定义TransportBindingElement,自定义MessageEncoder,自定义MessageEncoderFactory,自定义MessageEncoderBindingElement, 自定义Binding,以上部分组合即可以实现Channel级接受原始数据。
3如果想要把自定义Channel的实现封装成Endpoint, 还需要实现ChannelDispatcherBase和ServiceHostBase
4如果WCF宿主在Windows服务或者IIS中,还需要实现ServiceHostFatoryBase
实现过程中需要注意几点:
1默认Channel都是Message结构, 即WCF封装的消息结构,无法接受原始数据流, 因此必须实现自定义Channel。
2如果实现自定义Channel,则默认的Endpoint不支持此Channel, 因为ServiceHost内部默认调用DispatcherBuilder 的 GetSupportedChannelTypes, 此方法返回默认的几个Channel, 比如IReplyChannel,IRequestChannel,IInputChannel等等。
3可以利用Behavior来对Service,Endpoint,Contract等等各个级别进行过滤, 需要利用MessageFilter
4使用Behavior时, 在调用Service的Open方法之前加入。
5在实现ServiceHostBase时,重载的CreateDescription必须返回新的ServiceDescription。另外out IDictionary<string, ContractDescription> implementedContracts 的输出参数也必须实现, 基本思路就是根据要加入的Service类型,反射后得到利用ContractDescriptionGetContract得到Service声明的接口的各个ContractDescription,然后添加到字典里。字典的key为ContractDescriptionConfigurationName
6在实现ServiceHostBase时, 构造里必须调用InitializeDescription(new UriSchemeKeyedCollection(baseAddresses));, 不然后续的AddServiceEndpoint会失败。
7自定义实现的此原始Socket数据流Channel的ServiceHost可能和其他的默认ServiceHost有冲突, 无法共存, 即此ServiceHost只能监听自定义Channel而无法初始化默认Channel的BuildChannelListener。 解决办法是:(1)创建2个ServcieHost, 比如PIX,一个ServiceHost支持V2,另一个支持V3 (2)就是在ServiceHost的InitializeRuntime里调用BaseInitializeRuntime,但是由于此方法会把Endpoints里的所有channel都初始化,而系统不支持其他自定义Channel接口,导致初始化失败。使用此方法时就需要把自定义channel的endpoint放到最后调用AddServiceEndpoint。然后在出现异常时, 主动调用自定义Binding的BuildChannelListener,然后通过自定义ChannelDispatcher,把Listener放到ServiceHost里。
8在实现自定义ChannelBase时, 内部使用TcpListener和TcpClient来接受Client发来的请求,然后利用NetworkStream来解析byte数组。BufferManager来负责数据的缓冲区。
9实现自定义Router时, 即把接受字节流路由到对应方法时, 可以根据自己业务规则, 解析字节流, 然后根据ServiceHostDescriptionEndpoints的ContractDescriptionOperations获取对应方法后, 调用传参。
……这不是问题……是没办法的,手机配置比电脑差,上人多的www网站或服务器不稳定的网站时,手机就不一定能挤得进去了,就算上wap也是一样的,线路也不一定能登的进去。不过智能手机这类问题可能会改善一些,配置好一些的手机应该也会好一些。不想换手机的话,可以试着下载手机UC浏览器,情况应该会好一点吧!
用UC浏览器呀,它是个JAVA程序,下载下来就能用了呀。连不上确实是服务器不行,但也有你手机配置不够好的问题在,就像用了多年的老电脑和刚买的新电脑用起来绝对是新电脑快速方便一样,你手机配置不好就没办法登上线路但人家智能手机可以。
反正先用UC试试吧,确实是不错的软件,说不准就能连上了。
0条评论