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过于频繁才突然记得的,如果你有兴趣用这个方法,可以一起讨论下。
方法三:
弄多个输入输出流,但是这个不建议