getData()方法返回与数据报文相关联的字节数组。实际返回的是对与DatagramPacket最近关联的字节数组的一个引用,而关联则是通过构造函数或setData()方法形成。返回的缓存数组的长度可能比数据报文内部长度更长,因此,必须使用内部长度和偏移量来指定实际接收到的信息。
setData()方法指定一个字节数组作为该数据报文的数据部分。第一种形式将整个字节数组作为缓冲区;第二种形式把字节数组中,从offset到offset+length-1的部分作为缓存区。每次调用第二种形式的setData()方法,都将更新数据的内部偏移量和长度。
可以用image代替 ,2008还可以用varbinary(MAX)
Sql里可以存文件的类型,和My sql 或 oracle的blob类型没啥区别的
是否加载了驱动?
用 LongBlob
客户端也可以用多个线程实现
老师分享了自己就懒得去敲代码了
在MySQL中有四种Blob类型,他们的区别就是可以容纳的信息量不容分别是以下四种:
1.TinyBlob类型 最大能容纳255B的数据
2.Blob类型 最大能容纳65KB的
3.MediumBlob类型 最大能容纳16MB的数据
4.LongBlob类型 最大能容纳4GB的数据
很有可能是图片太大了,Blob容纳不了,可以换成MediumBlob类型,亲测有效。
去控制台切换一下就好了
已经解决了,自己太粗心,上传文件和接受数据里都创建了socket对象,删掉一个就好了
我用了三天的时间
...说一下我的思路。一个服务端,两个客户端A,B。 A给服务端传输给B的信息和B的IP。 服务端将信息通过A的ip传给A。B给A的回复同样A的信息和A的IP传给服务端。。。
一个人 在这自编自导自演
//服务器端 package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8899); Socket socket = server.accept(); System.out.println("链接成功。"); Speak speak = new Speak(socket); speak.start(); Listen listen = new Listen(socket); listen.start(); } } class Speak extends Thread { Socket socket = null; PrintWriter speak = null; String Data = null; Scanner hand = new Scanner(System.in); public Speak(Socket socket) throws IOException { this.socket = socket; this.speak = new PrintWriter(socket.getOutputStream(), true); } public void run(){ while(true){ Data = hand.next(); speak.println(Data); } } } class Listen extends Thread { Socket socket = null; BufferedReader reader = null; public Listen(Socket socket) throws IOException{ this.socket = socket; this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); } public void run(){ while(true){ try { System.out.println(reader.readLine()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //客户端 package Main; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { public static void main(String[] args) throws UnknownHostException, IOException { // TODO Auto-generated method stub Socket socket = new Socket("127.0.0.1", 8899); System.out.println("链接成功。。"); Speak speak = new Speak(socket); speak.start(); Listen listen = new Listen(socket); listen.start(); } }
可能是缺mysql-connector-java-5.1.7-bin.jar包
当数据库字段为blob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法;当数据库字段为longblob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,long)方法。
----------------------------------------------------------------------------------------
客户端同样方式修改。。。
你问问题的下面
private void closeAll() { try { if(socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } private void sendData(CommandTransfer transfer) { try { ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject(transfer); } catch (IOException e) { e.printStackTrace(); } } private CommandTransfer getData() { CommandTransfer transfer = null; try { ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); transfer = (CommandTransfer) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return transfer; }
我这边可以运行
先启动服务器,再启动客户端。
Java可以使用jedis来操作redis
输入没反应,是不是提前关闭了io流呢,就和老师讲的,while死循环后再关闭socket。
数据库中存储上传文件内容的类型应为为blob
个人看法:传参数据大小超过缓存区大小,会直接报异常
表示客户端和服务器之间传输的指令和数据,其中包括当前操作的命令、所有发送的数据对象、是否操作成功和返回的结果四个属性
实现分析里不是展示的有一个文件实体类File么, 用它来封装文件信息的,你传递多个文件就可以
使用 Map<File> datamap 接收后取出来就可以
既然图片能写入,为什么文字不行,按理说用的一个流如果没有格式限制就没有问题,这我也看不出什么问题。不过给你几个建议,你可以调试一下看看传文本的时候哪里阻塞了导致数据过不去,还有catch块不要抛出太多,可以用父类代替,最重要的一点。。。为什么没注释,还好代码不长也不难,要是复杂点真想回答的看一眼也觉得烦。。。
首先你应该把你的错误提示也贴出来,其次你在服务端并没有关闭流。
blob
如何实现多客户端之间的通信?经过服务器。
答:服务器端同时持有两个socket,这两个socket分别表示和两个客户端的连接。从一个socket的输入流读取数据,写到另一个socket的输出流中,这样就能实现多客户端之间的通信吧。
如何实现并行通信?
答:从socket中可以获取输入流和输出流对象,如果使用两个线程,分别持有输入流和输出流,那么便可以实现你所谓的“并行通信”。