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,状态可以被保存。
wolAI那红包的
明显是Server这端没有加载到com.client.MsgPackage这个类,你的MsgPackage实现了Serializable接口吗?

java与C#进行TCP局域网通信,丢包严重,怎么解决
应该没有这样严重的。 TCP只有在网络很差的情况下会有些数据丢掉的。 你在局域网应该还不至于俄。 多办是没有处理粘包俄。人家还没有把数据发给你就读取了。读到就会是 00定协议把。 很简单的俄。 如 包头+数据区域的长度+数据。 这样根据长度来解析数据就不会出现粘包了。

TCP和UDP通信有什么区别 如何分别用java实现?
TCP是面向连接,UDP面向非连接,资料不复制,在这里简单说下: TCP建立连接时需要传说的三次握手,服务端与客户端需要确认对方身份而已,建立好连接后,就开始传递消息,直到有一方断开连接位置。 就好比两个人打电话,要先通了才能说话。UDP只是数据报发送,它的优点速度快,并非要向TCP那样麻烦建立,它只负责将信息发出,但是并不确保信息的准确完整性等,就好比发短信,短信是出去了,但是中间是否有问题,是否对方手机能收到就不管了。 在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。至于如何通过socket建立两个连接,网上资料多的是,在这里不复制例子了。

TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例
1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。 2.信息编码:首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用DataInputStream类和ByteArrayInputStream类。其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded characterset)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用String的getBytes()方法。最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。3.成帧与解析成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。有两个技术:1.基于定界符(Delimiter-based):消息的结束由一个唯一的标记(uniquemarker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而使其与原始消息一致。2.显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。接口:Java代码import java.io.IOException;import java.io.OutputStream;public interface Framer {void frameMsg(byte [] message,OutputStream out) throws IOException;byte [] nextMsg() throws IOException;}定界符的方式:Java代码import java.io.ByteArrayOutputStream;import java.io.EOFException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class DelimFramer implements Framer {private InputStream in;//data source;private static final byte DELIMTER=(byte)'n';//message delimiterpublic DelimFramer(InputStream in){this.in=in;}@Overridepublic void frameMsg(byte[] message, OutputStream out) throws IOException {//ensure that the message dose not contain the delimiterfor(byte b:message){if(b==DELIMTER)throw new IOException("Message contains delimiter");}out.write(message);out.write(DELIMTER);out.flush();}@Overridepublic byte[] nextMsg() throws IOException {ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream();int nextByte;while((nextByte=in.read())!=DELIMTER){if(nextByte==-1){//end of stream?if(messageBuffer.size()==0){return null;}else{throw new EOFException("Non-empty message without delimiter");}}messageBuffer.write(nextByte);}return messageBuffer.toByteArray();}}显式长度方法: Java代码import java.io.DataInputStream;import java.io.EOFException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class LengthFramer implements Framer {public static final int MAXMESSAGELENGTH=65535;public static final int BYTEMASK=0xff;public static final int SHOTMASK=0xffff;public static final int BYTESHIFT=8;private DataInputStream in;// wrapper for data I/Opublic LengthFramer(InputStream in) throws IOException{this.in=new DataInputStream(in);}@Overridepublic void frameMsg(byte[] message, OutputStream out) throws IOException {if(message.length>MAXMESSAGELENGTH){throw new IOException("message too long");}//write length prefixout.write((message.length>>BYTEMASK)&BYTEMASK);out.write(message.length&BYTEMASK);//write messageout.write(message);out.flush();}@Overridepublic byte[] nextMsg() throws IOException {int length;try{length=in.readUnsignedShort();}catch(EOFException e){//no (or 1 byte) message;return null;}//0<=length<=65535;byte [] msg=new byte[length];in.readFully(msg);//if exception,it's a framing error;return msg;}}
用java socket,这是封装好的tcp/ip API,然后用数据流,之间就可以相互传递字节数组了

java如何通过tcp发送指令
以下是一个展示java使用tcp通讯的简单例子,包括服务器和客户端代码: /***TCPServer*/import java.io.*;import java.net.*;class TCPServer{public static void main(String[] args)throws IOException{ServerSocket listen = new ServerSocket(5050);Socket server= listen.accept();InputStream in = server.getInputStream();OutputStream out = server.getOutputStream();char c = (char)in.read();System.out.println("收到:" + c);out.write('s');out.close();in.close();server.close();listen.close();}}/***TCPClient*/import java.io.*;import java.net.*;class TCPClient{public static void main(String[] args)throws IOException{Socket client = new Socket("127.0.0.1" , 5050);InputStream in = client.getInputStream();OutputStream out = client.getOutputStream();out.write('c');char c = (char)in.read();System.out.println("收到:" + c);out.close();in.close();client.close();} }
import java.io.BufferedReader; import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;public class SimpleClient {public static void main(String[] args) throws Exception {Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),8888);//连接某台机器(127.0.0.1)上的某个端口(8888)PrintWriter pw=new PrintWriter(socket.getOutputStream());//得到Socket连接的输出流pw.println("你好服务器!!");//向服务器发送数据(有可能在缓存里面不会立刻发送,所以要下面的语句)pw.flush();//立刻发送数据BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//取得Socket连接的输入流System.out.println(in.readLine());//打印取得的数据Thread.sleep(1000);}} 这是一个简单的客户端连接发送例子
Socket 类和SocketServer类

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://m.wangsu123.cn/news/320697.html。