javasocket數據
❶ java socket發送數據的類型
在Socket通信中,要在客戶端和服務端中傳輸數據,傳輸的數據有各種類型包括:int,short,long以及String,甚至是自定義的各種Object,如何能夠保證在服務端和客戶端之間的數據能夠使得兩端都能理解,這就是所謂的「應用協議「。
在通信的「管道」中,流的都是二進制數據,所以,雙方如何約定好「解析規則」,則就必須要求通信雙方都預先制定好協議。
❷ java的socket數據接收問題
你這貌似列印的都是他的十六進制的十進制形式啊
❸ 請教大家JAVA——socket接收的數據(byte[])的處理
接收方法的問題
如果你發送一個長度11的字元串 而用一個長度為8的數組接內收
第一次read沒問題 但第二容次read時因為只接受了3個字元 而數組長度卻是8.結果就是除了前3個字元外剩下全部都是0 就出現了你的問題。
byte[] b = {0x11,0x22,0x33, 0x00, 0x00, 0x00, 0x00...}; -->length = 1024 後面都是0x00
就是因為只接受了前3個字元 後邊數組實例的時候本身就是0
解決方法也比較容易
read(byte[] b)方法提供了一個返回的整數用來表示接受了多少個字元。
只要每次read時判斷下看看返回的數值和數組長度大小。如果接收小於數組長度在處理處理數據時把多餘的數據去掉。
❹ java中Socket如何實現數據包傳輸的打包和解包
socket一般調用accept方法等待連接:
public class ServerThread extends Thread{
ServicePanel servicePanel = null;
ServerSocket serverSocket = null;
Socket socket = null;
public ServerThread(ServicePanel servicePanel,ServerSocket serverSocket) {
this.servicePanel = servicePanel;
this.serverSocket = serverSocket;
}
public void run(){
while (true) {
try {
socket = serverSocket.accept();//等待連接
new ReciveFromClient(servicePanel,socket).start();
} catch (IOException e) {
// e.printStackTrace();
break;
}
}
}
}
至於收包,發包是以流的形式傳送的:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
一般包裡面的內容也就是被我們封裝在某個類中,這個類要實現序列化,即實現Serializable介面;
發送方法那些就要自己寫了~
❺ 怎麼判斷java的socket是否接到了數據,請看
一方面,getInputStream中有方法,
int
available()
Returns an estimate of the number of bytes that can be read (or
skipped over) from this input stream without blocking by the next
invocation of a method for this input stream.
另外,還可以讀出來看看
❻ JAVA SOCKET傳送數據
|可以這樣哈,數據復結制構:
|--時間(50個位元組)--||--上午數據長度(固定用8個位元組)--||--上午數據--||--中午數據長度--||--中午數據--||--下午數據長度--||--下午數據--|
然後讀取的時候先讀50個位元組的內容,然後把它轉為字元串得到的就是時間,然後讀8個位元組的內容,把讀到的內容轉為數字就是上午的數據的總長度,假如是n,則繼續讀n個位元組內容,轉為字元串就是上午數據,然後繼續讀8個位元組,轉為數字……
以上只是一種數據結構,還可以有很多,你可以根據自己的實際情況來決定各個位元組的長度。
再說寫入的情況,把所有的字元串轉化成固定長度的byte數組然後直接寫入就行了。
byte[] time=new byte[10];
String stime="2009-10-31 12:00:00";
byte[] temp=stime.getByte();
for(int i=0;i<temp.length;i++){
time[i]=temp[i];
}
然後寫入time,等到把所有數據寫入完畢統一刷新
❼ java中的一個Socket能不能發送多條數據
你這個問題問的我很尷尬,也有點不知道咋回,我大體說說,看能否解決你的問題,答:
能。
把socket作成一個長連接,後者說socket本身就是一個種鏈接,這個鏈接你不kill掉,就會存在(理論上。。。),他會一直發送數據,具體是否觸發看你自己是怎麼寫的,比如某個東西改變就發送一次,那麼下次這個東西改變,他還會發送一次。
我糾結的是,如果你問的不是socket能不能多次發送數據,而是一次發送能不能是多條數據,貌似也是可以的,,,
就算不可以,你也可以把多條數據存到一個對象里給發過去,到了接收端取相應的屬性值即可。
——————本人菜鳥,大神勿噴
❽ java socket傳輸數據問題
可以這樣哈,數據結構:
|--時間(50個位元組)--||--上午數據長度(固定用8個位元組)--||--上午數據--||--中午數據長度--||--中午數據--||--下午數據長度--||--下午數據--|
然後讀取的時候先讀50個位元組的內容,然後把它轉為字元串得到的就是時間,然後讀8個位元組的內容,把讀到的內容轉為數字就是上午的數據的總長度,假如是n,則繼續讀n個位元組內容,轉為字元串就是上午數據,然後繼續讀8個位元組,轉為數字……
以上只是一種數據結構,還可以有很多,你可以根據自己的實際情況來決定各個位元組的長度。
再說寫入的情況,把所有的字元串轉化成固定長度的byte數組然後直接寫入就行了。
byte[] time=new byte[10];
String stime="2009-10-31 12:00:00";
byte[] temp=stime.getByte();
for(int i=0;i<temp.length;i++){
time[i]=temp[i];
}
然後寫入time,等到把所有數據寫入完畢統一刷新
❾ java中socket不斷接收數據問題
其實,方法有幾個。
方法一:
定義一個MsgObject的消息類,裡面存放的為發送的消息內容版(記得序權列化)。然後再用ObjectOutputStream來把該類弄成一個輸出流發送出去。然後客戶端就用
ObjectInputStream in=new ObjectInputStream(socket.getInputStream());
MsgObject obj=(MsgObject)in.getObject();就能夠得到一個消息類對象了。。
不會的就追問下,我之前是這樣做過的。
方法二:
如果你會json格式,那麼就更加簡單了,直接把你的消息放到json數組裡面。。
這種方法沒試過,我近期使用json過於頻繁才突然記得的,如果你有興趣用這個方法,可以一起討論下。
方法三:
弄多個輸入輸出流,但是這個不建議