繁体   English   中英

服务器/客户端套接字编程和mysql数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM