我是客户端,服务器端是另一个厂家的而且找不到人。
1我这边是建一个Socket还是建一个ServerSocket一个Socket?因为服务器端也会主动往我这边发消息,习惯上建一个ServerSocket,主要想了解只建Socket是否可以实现。
2如果就一个Socket,如何不断的收包?不管是不是-1不停的收么?会不会很耗资源?
3有个长连接的例子最好了哈(伪码,流程图即可)

解决方案 »

  1.   

    ServetSocket命名不正确,应该叫serverListener,它是负责监听请求的。搞这个其实也简单,如果你拿着ip去找对方,那你就写Socket,如果是对方知道你的ip过来访问你,你就用ServerSocket。别瞎想了,赶快动手在本地写个聊天室,就明白了。
      

  2.   

    你连接服务器啦! 人家哪知道你的IP.你的socket只要不主动断掉,默认是不会自动断下来的。你在读数据的时候,可以设定一个setSoTimeout,
    超过了就认为没有读到数据,你可以休眠 sleep(10),10 毫秒后再读还有 read 本身是阻塞的,没有数据时,并不占用CPU资源。
      

  3.   

    既然称为服务器 那就应该用ServerSocket 是等待被连接的
    关键是业务功能上扮演什么角色 当然用Socket也是可以的 那两边角色要反反
    连好后不断开或断开后设置自动重连不就能长连接了
      

  4.   

    理想状态当然是我一个server一个client了,他找我的server,我找他的server,大家方便,都是发一个包等响应
    现在的确是我client,对方server,比较麻烦的是server也会主动给client发包,导致收发异步,要做些判断有没有好的思路哈?最麻烦的是,用byte来折腾,
    Version 1字节(8位) Integer 版本号(高位4bit表示主版本号,低位4bit表示次版本号) 
      

  5.   

    需要一个ServerSocket 来接受服务厂商发过来的消息,还需要Socket去发送信息到服务器(作用就是通知服务器,让服务器给客服端发送数据)java的这种东西,完全可以实现。
      

  6.   

    ls,参考2楼第1,2句话
    我的思路是
    2个线程,一个专门发,一个专门收,
    发的好办,发了就不管了,
    收的区分是响应还是请求,响应的话起线程解析处理;请求的话,再起线程进行处理,发响应包
    重发机制,又要计时器,多少秒没收到响应包则重发
    心跳机制,做一个计时器,收发都为空闲状态时,60秒触发心跳包,再来计时,若干秒没收到响应包则重连socket
    重连,锁定socket,重新连接后再继续想到这里,我想说,这厂家真会找麻烦,他自己程序不也得像我这样处理么?要是象5楼说的那样就好了~~~~~
      

  7.   

    当然是建一个Socket了,你只要知道对方的IP和端口号就可以连接了
    然后数据的交互就是你的事情了,只为有些服务器当你的数据不符的时候,也会把你断掉的
    否则一个电脑总共才65535个端口,都这样被占用着,别人还怎么连进来呢
      

  8.   

    算了,为了让楼主把100分分我一半,我决定再次扯淡Java的Socket类和ServerSocket类,设计得算是很不错的了,比之MFC的Socket类设计得好得多。
    从语法的角度来说,这个叫类型安全。
    参见这两篇文章,关于对象的粒度:
    http://blog.csdn.net/slugfest/archive/2008/01/11/2036978.aspx
    http://blog.csdn.net/Slugfest/archive/2008/01/11/2038316.aspx
    顺便做一下科普。
    ServerSocket是表示TCP中处于Listen的Socket,想连接服务器的Socket,通常称为ClientSocket,就是java里面的Socket类。ServerSocket接受其他的Socket的CONNECT消息,如果表示可以连接就ACCEPT,那么服务器有义务创建一个和这个Remote Socket对等的Socket,术语叫PeerSocket。 那么这两个对等的Socket就可以互相扯淡了。那么注意,这里面涉及到了三个Socket。
    在连接中,有三次握手之说,具体传些什么内容,看相关资料,比如TCP/IP详解。但是Socket在系统编程这层就封装好了。
    (DoS,和DDos攻击,也源自于这种三次握手的不健全,这都是后话了。)
    从socket编程的角度来说,过程很清楚,都是SOCKET类,Linux/Win32编程中,SOCKET就是一个整数,无论是ServerSocket还是ClientSocket。
    所以这种编程方式可能导致类型不安全。所以在一些高级的语言,类库中,估计抽象出ServerSocket,ClientSocket,其实他们封装了几乎完全相同的数据类型,只是SOCKET工作于不同的状态,所以,从这个例子,大家还要继续体会面向对象的深意。端口是用SHORT类型表示的,所以前面有兄台说端口的数量是多少多少,是正确的。
    关于Socket不断收包,那也得我前面提过的PeerSocket要不断的发包才行。它不发,你想收也收不到。
    装个抓包的工具,可以清楚地看到你的这个Socket的通信过程。
    最后,CSDN怎么传图片我不知道,要不我给你贴上我的签名
      

  9.   

    1我这边是建一个Socket还是建一个ServerSocket一个Socket?因为服务器端也会主动往我这边发消息,习惯上建一个ServerSocket,主要想了解只建Socket是否可以实现。
    Socket就行,因为服务器虽然会主动向你发东西,但那也是在你连接上服务器后服务器的操作,服务器与客户端的最简单区别:谁去连接另一个,谁就是客户端,被连接的那个就是服务器,就如,你去找别人办事,别人就是大爷。2如果就一个Socket,如何不断的收包?不管是不是-1不停的收么?会不会很耗资源?
    Socket收包放在一个线程中进行,因为Socket的read()方法一直会等待新的消息到来,程序才会向下走,否则一直停在read()这个方法处,这个不耗什么资源的,因为read()也是几百毫秒才读一次,并不是一刻不停的疯读.3有个长连接的例子最好了哈(伪码,流程图即可) 
    这个东西,一般的聊天室都会涉及,Java聊天室的代码到处都有。
      

  10.   

    搞定了,散分。
    其实我觉得互惠互利的话,应该定义一个连接包,我发第一包登陆,第二包传我的serversocket的ip,端口,他建一个客户端连过来
    然后发一个等着收一个,多简单,咔咔,我这次80%代码都不用写了,他那边也一样~~~~
      

  11.   

    晕,你疯了,你还是没搞明白。
    socket发一个包过去,就自带ip了。天哪tcp/ip三次握手是怎么学的?