![](/img/trans.png)
[英]Android Client /Java Server and Mysql DataBase Tcp Socket Programming
[英]Server/ Client Socket Programming and mysql database
我正在进行客户端/服务器套接字编程。 我的笔记本电脑上的Android客户端和Java服务器。 我想通过套接字将多个图像从Android设备发送到Java服务器,该服务器将MySQL数据库中的每个图像另存为blob。 我为每次图像传输关闭客户端套接字,并为下一次图像传输再次重新连接。
我的第一次图像传输工作正常,并保存在MySQL数据库中,但是当我尝试将套接字重新连接到服务器并传输其他图像时,我将Connection重置 。
java.sql.SQLException: Error reading from InputStream java.net.SocketException
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.PreparedStatement.readblock(PreparedStatement.java:3099)
at com.mysql.jdbc.PreparedStatement.streamToBytes(PreparedStatement.java:5106)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2575)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2366)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2350)
at Uploadpic.run(Uploadpic.java:113)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.PreparedStatement.readblock(PreparedStatement.java:3097)
... 7 more
public class Uploadpic extends Thread {
private Socket socket1 =null;
//public Client user = new Client();
public Uploadpic(Socket socket1)
{
this.socket1 = socket1;
}
public void run() {
int imagenum = 0;
String mes = null;
BufferedReader buff;
int imagesize = 0;
InputStream is = null;
try {
buff = new BufferedReader(newInputStreamReader(socket1.getInputStream()));
while ((mes = buff.readLine())!= null)
{
if(!mes.equals(null))
break;
}
System.out.println("image size is =" + mes);
} catch (IOException e) {
e.printStackTrace();
}
imagesize = Integer.parseInt(mes);
try {
is = socket1.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
String connectionUrl = "jdbc:mysql://localhost:3306/users";
String dbUser = "root";
String dbPwd = "daniere";
boolean check = false ;
Connection conn = null;
ResultSet rs;
PreparedStatement ps = null;
PreparedStatement stmt = null;
byte [] mybytearray = new byte [imagesize];
int rowCount = -1;
String INSERT_PICTURE =
"INSERT INTO USERPICS (id_PIC,user_id,picname)values (?, ?, ?)";
try
{
conn = DriverManager.getConnection(connectionUrl, dbUser, dbPwd);
try {
while(check == false)
conn.setAutoCommit(true);
ps = (PreparedStatement)conn.prepareStatement(INSERT_PICTURE);
System.out.println(" ");
ps.setInt(1,imagenum);
ps.setInt(2, DataBase.user.getClientId());
ps.setBinaryStream(3, is, (int) mybytearray.length);
**ERROR HAPPENS HERE**int s = ps.executeUpdate();
if(s>0) {
System.out.println("Uploaded successfully !");
}
else {
System.out.println("unsucessfull to upload image.");
}
} finally {
try {
ps.close();
ps = null;
is.close();
//socket1.close();
socket2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null)
{
conn.close();
conn = null;
}
}
catch (SQLException sqle)
{
sqle.printStackTrace();
}
}
}
我猜这是由于多线程问题。 我猜您生成了一个用于插入每张图片的线程,因为Uploadpic extends Thread
(顺便Uploadpic extends Thread
,建议实现Runnable而不是扩展Thread ),而且我怀疑
DriverManager.getConnection(connectionUrl, dbUser, dbPwd)
如果已经为该URL打开了一个连接,则返回相同的连接。
如果是这种情况,则可能出现争用条件,即两个线程使用conn
引用的同一Connection
对象,一个线程关闭它,而另一个线程仍在使用它。
解决方案 :无需打开/关闭每个图片的连接,这是无用的工作:启动服务器时打开DB连接,退出时关闭它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.