我是客户端,服务器端是另一个厂家的而且找不到人。
1我这边是建一个Socket还是建一个ServerSocket一个Socket?因为服务器端也会主动往我这边发消息,习惯上建一个ServerSocket,主要想了解只建Socket是否可以实现。
2如果就一个Socket,如何不断的收包?不管是不是-1不停的收么?会不会很耗资源?
3有个长连接的例子最好了哈(伪码,流程图即可)
1我这边是建一个Socket还是建一个ServerSocket一个Socket?因为服务器端也会主动往我这边发消息,习惯上建一个ServerSocket,主要想了解只建Socket是否可以实现。
2如果就一个Socket,如何不断的收包?不管是不是-1不停的收么?会不会很耗资源?
3有个长连接的例子最好了哈(伪码,流程图即可)
解决方案 »
- httpclient4 重试机制请教?
- 如何以十六进制方式打印 byte[] bytearray 中的字节
- 求教JAVA原始类型编码问题
- 我现在想把字符转换成整数,在转换过程如 String b="c";
- 从Html文件中读取的中文字符都是问号????,高手进来指教(急,在线等)
- 在某个目录下有一些相同文件名不同扩展名的文件1.doc,1.txt,1.html,如何删除文件名为1的这些不同扩展名的文件
- 强烈建议!!!请大家提问前搜索论坛,请斑竹将本文置顶,支持跟贴!!!!
- JDBC 2.0要下载才有吗?如果是,请问哪有, sun上怎么没有
- 我的代码是怎么进入死循环的,为什么有两个线程运行一会就唤不醒了
- 这个图形打印有问题
- 关于一个类型转换的警告
- Swing的一个问题
超过了就认为没有读到数据,你可以休眠 sleep(10),10 毫秒后再读还有 read 本身是阻塞的,没有数据时,并不占用CPU资源。
关键是业务功能上扮演什么角色 当然用Socket也是可以的 那两边角色要反反
连好后不断开或断开后设置自动重连不就能长连接了
现在的确是我client,对方server,比较麻烦的是server也会主动给client发包,导致收发异步,要做些判断有没有好的思路哈?最麻烦的是,用byte来折腾,
Version 1字节(8位) Integer 版本号(高位4bit表示主版本号,低位4bit表示次版本号)
我的思路是
2个线程,一个专门发,一个专门收,
发的好办,发了就不管了,
收的区分是响应还是请求,响应的话起线程解析处理;请求的话,再起线程进行处理,发响应包
重发机制,又要计时器,多少秒没收到响应包则重发
心跳机制,做一个计时器,收发都为空闲状态时,60秒触发心跳包,再来计时,若干秒没收到响应包则重连socket
重连,锁定socket,重新连接后再继续想到这里,我想说,这厂家真会找麻烦,他自己程序不也得像我这样处理么?要是象5楼说的那样就好了~~~~~
然后数据的交互就是你的事情了,只为有些服务器当你的数据不符的时候,也会把你断掉的
否则一个电脑总共才65535个端口,都这样被占用着,别人还怎么连进来呢
从语法的角度来说,这个叫类型安全。
参见这两篇文章,关于对象的粒度:
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怎么传图片我不知道,要不我给你贴上我的签名
Socket就行,因为服务器虽然会主动向你发东西,但那也是在你连接上服务器后服务器的操作,服务器与客户端的最简单区别:谁去连接另一个,谁就是客户端,被连接的那个就是服务器,就如,你去找别人办事,别人就是大爷。2如果就一个Socket,如何不断的收包?不管是不是-1不停的收么?会不会很耗资源?
Socket收包放在一个线程中进行,因为Socket的read()方法一直会等待新的消息到来,程序才会向下走,否则一直停在read()这个方法处,这个不耗什么资源的,因为read()也是几百毫秒才读一次,并不是一刻不停的疯读.3有个长连接的例子最好了哈(伪码,流程图即可)
这个东西,一般的聊天室都会涉及,Java聊天室的代码到处都有。
其实我觉得互惠互利的话,应该定义一个连接包,我发第一包登陆,第二包传我的serversocket的ip,端口,他建一个客户端连过来
然后发一个等着收一个,多简单,咔咔,我这次80%代码都不用写了,他那边也一样~~~~
socket发一个包过去,就自带ip了。天哪tcp/ip三次握手是怎么学的?