⑴ java socket報文通信心跳相關問題
正常的伺服器/客戶端的交流是客戶端發信息給伺服器伺服器返回
而伺服器想主動發送消息給客戶端就需要一些額外的技術你說的就是其中一種
心跳肯定要定時
心跳的功能是保持長久通信狀態
⑵ JAVA TCP通信,客戶端給伺服器傳送JAVA對象通信出錯了,求各位大神指教
在java中用socket傳輸對象的時候,底層是把java對象序列化,然後以二進制數據進行傳輸的。socket的服務端和客戶端都需要有這個對象的聲明,比如客戶端發送的是com.client.MsgPackage對象,那麼這個對象的class文件必須在服務端的classpath中。否則就會是接收方接收了tcp的數據包,但是無法還原成對象。
底層要能把對象序列化,這個對象要實現一個可序列化的介面:java.io.Serializable。
類通過實現 java.io.Serializable
介面以啟用其序列化功能。未實現此介面的類將無法使其任何狀態序列化或反序列化。可序列化類的所有子類型本身都是可序列化的。序列化介面沒有方法或欄位,僅用於標識可序列化的語義。
writeObject 方法負責寫入特定類的對象的狀態,以便相應的 readObject 方法可以恢復它。通過調用
out.defaultWriteObject 可以調用保存 Object 的欄位的默認機制。該方法本身不需要涉及屬於其超類或子類的狀態。通過使用
writeObject 方法或使用 DataOutput 支持的用於基本數據類型的方法將各個欄位寫入 ObjectOutputStream,狀態可以被保存。
readObject 方法負責從流中讀取並恢復類欄位。它可以調用 in.defaultReadObject
來調用默認機制,以恢復對象的非靜態和非瞬態欄位。defaultReadObject
方法使用流中的信息來分配流中通過當前對象中相應指定欄位保存的對象的欄位。這用於處理類演化後需要添加新欄位的情形。該方法本身不需要涉及屬於其超類或子類的狀態。通過使用
writeObject 方法或使用 DataOutput 支持的用於基本數據類型的方法將各個欄位寫入 ObjectOutputStream,狀態可以被保存。
⑶ java socket 客戶端是如何向伺服器端發送消息的
伺服器端和客戶端都是通過SOCKET來進行通信的,首先產生一個 socket實例,通過這個實例,伺服器端調用accept這個方法接收來自客戶端發送的信息.但是在產生socket實例的時候必須初始化一個埠.用來負責接受客戶端的請求!
客戶端要給伺服器發送消息也必須產生一個socket實例,初始化的時候必須指定伺服器的IP地址,並且指定服務接收的埠號,這樣客戶端才能找到伺服器要接收的地方,找到地方就可以發送過去了。和你寫信一樣。找到地址
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
這個只是用來獲取一個從鍵盤的一個流.傳送給伺服器端的數據都是通過流來表示的。意思是是鍵盤輸入的一個位元組轉化成字元流.並輸出或者寫入!