javasocket接收
① java socket發送和接收多條數據的情況怎麼解決
只要是接收端
你都應該不停的等待消息
,接受消息的那一段可以這樣寫
while(true)
{
try{
Thread.sleep(300);}catch(Excepion
e){}
//注意這里的inStream是DataInputStream
當然你也可以加以裝飾
String
message=
inStream.readUTF();
if(message!=null)
{
System.out.println("收到消息:"+message);
}
}
只有這樣才能不斷從發送端收到消息,這段代碼只是給你一個提示,有問題給我留言,通常為了程序的合理性
最好把這段代碼寫進一個線程裡面,這樣更合理
② Java Socket開發 關於報文傳遞和接收
看 Oracle 官方教程,同步式的 Socket 就是傳統的一問一答方式,它就是你需要的。
客戶端先 socket.getOutputStream().write(...); 之後到 socket.getInputStream().read(byte[]) 在循環中讀取直到 read 方法返回 -1 或你期望的位元組數已經全部收到了就停下來,如果不嘗試停下來,後面的 read 將會阻塞等待。
http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
基於性能改進,一般我們需要使用 NIO 非同步的 socket,只需要一個線程負責通信,每個線程都有自己的出站消息隊列和入站消息隊列,以線程為 key 區分開,通信線程只負責把各自的消息從出站隊列中發送去並把收到的消息放入入站隊列中,應用程序線程就去各自的消息隊列中取消息就可以了。因為每個應用線程有各自的消息隊列,我們把消息放入出站隊列之後就到入站隊列上用同步鎖等待的方法阻塞到有消息回答時為止。
關於 NIO non-blocking 非阻塞式 socket,下面有一個 NBTimeServer 例子,它講的是服務端。客戶端與此類似,
http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index.html
NIO 通信線程樣例。
publicvoidrun()
{
inttip=0;
try
{
selector=Selector.open();
SelectionKeyk=channel.register(selector,getInterestOptions());
k.attach(thread);//把當前線程綁定到附件中。
this.running=true;
statusChanged(Status.CONNECTED);
while(this.isRunning())
{
//select()isablockingoperation.
inteventCount=selector.select();
debug("[MC.Debug]PollingTCPevents..."+eventCount);
if(eventCount>0&&channel.isOpen()&&this.isRunning())
{
Setkeys=selector.selectedKeys();
for(Iteratoriter=keys.iterator();iter.hasNext();iter.remove())
{
SelectionKeykey=(SelectionKey)iter.next();
Threadthread=(Thread)key.attachment();
if(!key.isValid())
{//channelisclosing.
break;
}
process(key);//處理讀取消息並把消息放入thread對應的隊列。//寫出消息類似的,不過在register時需要注冊寫出允許的事件,
}
}
}
}
③ 用JAVA寫一個SOCKET 接收TCP發來的消息
服務端監聽:ServerSocket server=new ServerSocket(port);//port:綁定的埠號
Socket client=server.accept()();//監聽埠,一旦取得連接則獲得客戶端的socket連接對象client
客戶端: Socket s=new Socket(ip,port);//要連接的伺服器的ip以及埠號
如果正常連接上之後,socket的對象可以獲得InputStream和OutputStreame,然後就可以進行通信了
完成通信之後,執行socket對象的close()方法關閉連接,完成一次完整的socket連接