通过socket访问数据库

访问|数据|数据库

发布者:flyfox

Tip:通过socket访问数据库,分 Clinet, Display,sqlServer三个类

Client.java

import java.awt.*;
import java.io.*;
import java.net.*;
import java.applet.*;

public class Client extends Applet
{
public TextArea chat_txt;
private TextField sql_txt;
private Button connect,execute;
private Socket soc= null;
private PrintStream ps= null;
Listen listen;

public void init()
{
chat_txt= new TextArea();
sql_txt= new TextField(20);
connect= new Button("Connect");
execute= new Button("Execute");
execute.disable();

Panel pp= new Panel();
pp.setLayout(new FlowLayout());
pp.add(sql_txt);
pp.add(connect);
pp.add(execute);

add("North",pp);
add("Center",chat_txt);
}

public boolean action(Event evt,Object obj)
{
if(evt.target instanceof Button)
{
String label= (String)obj;
if(label.equals("Connect"))
{

try{
soc= new Socket(InetAddress.getLocalHost(),4700);
ps= new PrintStream(soc.getOutputStream());
ps.println("HELLO");
ps.flush();
listen= new Listen(this,soc);
listen.start();
}catch(Exception e)
{
chat_txt.setText(e.toString());
disconnect();
}
connect.setLabel("Disconnect");
execute.enable();
}else if(label.equals("Disconnect"))
disconnect();
else if(label.equals("Execute"))
{
if(sql_txt.getText()!= null)
{
ps.println("FIND");
ps.flush();
ps.println(sql_txt.getText());
ps.flush();
}
}
}
return false;
}

public void disconnect()
{
if(soc!= null)
{
try{
listen.stop();
ps.println("QUIT");
ps.flush();
soc.close();
}catch(Exception e){}
finally{
listen.stop();
listen= null;
soc= null;
}
execute.disable();
connect.setLabel("Disconnect");
}
}
}

class Listen extends Thread
{
Socket socket= null;
DataInputStream dis= null;
Client parent= null;

public Listen(Client p,Socket s)
{
parent= p;
socket= s;
try{
dis= new DataInputStream(socket.getInputStream());
}catch(Exception e){}
}

public void run()
{
String line= null;

while(true)
{
try{
line= dis.readLine();
}catch(Exception e){}
if(line!= null)
parent.chat_txt.appendText(line);
}
}
}

Display.java

/********************************************
格式化输出数据库记录,出自<<使用java进行SQL数据库程序设计>>
返回值为格式化的字符串
********************************************/
import java.sql.*;

class Display extends Object
{
ResultSet theResultSet;
String theResult;

public void display()
{}

public void setResult(ResultSet result)
{
theResultSet= result;
}

public String getString()
throws SQLException,NoClassDefFoundError
{
theResult= "";
ResultSetMetaData metaData= theResultSet.getMetaData();
int colcount = metaData.getColumnCount();
int colSize[]= new int[colcount];
String colLabel[]= new String[colcount];
int colType[]= new int[colcount];
String colTName[]= new String[colcount];
int colPrec[]= new int[colcount];
int colScale[]= new int[colcount];

theResult +="\n";
for(int i= 1;i<= colcount;i++)
{
colSize[i-1] = metaData.getColumnDisplaySize(i);
colLabel[i-1]= metaData.getColumnLabel(i);
colType[i-1] = metaData.getColumnType(i);
colTName[i-1]= metaData.getColumnTypeName(i);
colPrec[i-1] = metaData.getPrecision(i);
colScale[i-1]= metaData.getScale(i);

if(colSize[i-1]<1+ colLabel[i-1].length())
colSize[i-1]= 1+colLabel[i-1].length();
theResult+= rightPad(colLabel[i-1],colSize[i-1]);
}

theResult +="\n\n";
int row= 0;

while(theResultSet.next())
{
row++;
for(int i=1;i<= colcount;i++)
{
String colvalue= theResultSet.getString(i);
if(colvalue== null)
colvalue="";
theResult+= rightPad(colvalue,colSize[i-1]);
}
theResult+="\n";
}
theResult+="\n(" +row+ "rows included)\n";
return theResult;
}

private String rightPad(String s,int len)
{
int curlen= s.length();
if(curlen>len)
return repString("*",len);
return (s+repString(" ",(len-curlen)));
}

private String repString(String s,int times)
{
String result="";
for(int i=0;i<times;i++)
result+= s;
return result;
}
}

sqlServer.java

import java.awt.*;
import java.sql.*;
import java.io.*;
import java.net.*;
import Display;

public class sqlServer
{
public static void main(String[] args)
{
System.out.println("Waiting for connection");

try{
ServerSocket session= new ServerSocket(4700);
handleRequests handler= null;
System.out.println("Waiting for connection");
while(true)
{
Socket socket= null;
socket= session.accept();
if(socket== null)
continue;
System.out.println("Connection made");
handler= new handleRequests(socket);
handler.start();
}
}catch(Exception e)
{
System.out.println("客户连接失败"+e);
}
}
}

class handleRequests extends Thread
{
private DataInputStream in= null;
private PrintStream out= null;
private Socket socket= null;

Connection theConnection= null;
Statement theStatement= null;
ResultSet theResultSet= null;
Display display= null;

public handleRequests(Socket s)
throws IOException
{
socket= s;
in= new DataInputStream(socket.getInputStream());
out= new PrintStream(socket.getOutputStream());
}

public void openConnection()
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
if(theConnection!= null)
theConnection.close();
theConnection= DriverManager.getConnection("jdbc:odbc:test","admin","1234");
theStatement= theConnection.createStatement();
display= new Display();
}catch(Exception e)
{
System.out.println(e);
}
}

public void run()
{
openConnection();
try{
String line= null;
while(true)
{
line = in.readLine();
if(line!= null)
line= line.trim();
if(line.equals("FIND"))
{
line = in.readLine();
line= line.trim();
theResultSet= theStatement.executeQuery(line);
display.setResult(theResultSet);
out.print(display.getString());
out.flush();
}
if(line.equals("QUIT"))
break;
if(line.equals("HELLO"))
{
out.println("Welcome to join us");
out.flush();
}
}
in.close();
out.close();
socket.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}

时间: 2024-11-18 15:44:01

通过socket访问数据库的相关文章

c++ mfc-程序创建了几十个SOCKET后,访问数据库失败

问题描述 程序创建了几十个SOCKET后,访问数据库失败 在创建了SOCKET后 用UDL访问数据库SQL server2000,服务器名称填'.' 就能访问成功.如果填成服务器IP或者127.0.0.1 都失败.但在有些机器上能访问成功,在比较老的机器上访问就不能成功,这是什么原因呢 解决方案 一般情况 这三个都是可以的:LocalHost.. .127.0.0.1 至于老机器就不知道了

delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍?

问题描述 delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍? 20C 如题.这是我反复测试后得出的结论.我实在不理解为什么. 具体测试过程是这样子的:我用ado连接数据库.然后我写了一个简单的存储过程,就是往表里插入数据.然后我用ado调用这个存储过程.然后我就发现,虽然程序里我只调用了一次,但实际上表里的数据却被插入了完全一模一样的两条. 这算是bug还是怎么回事?是不是有什么我不曾注意到的细节没处理好? 存储过程代码如下: create procedure p

实现换一换功能怎么实现 要访问数据库的

问题描述 实现换一换功能怎么实现 要访问数据库的 页面中显示了9条数据,怎么点击换一换然后从后台查询,之后的内容? 解决方案 相当于翻页,原理一样的 解决方案二: SELECT * FROM ( SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查询条件 ORDER BY 排序条件 ) WHERE CON >=N;查n到m条 解决方案三: 就随机从数据库按某些条件查询另外9组数据咯

Eclipse3.0配置SQLExplorer访问数据库

sql|访问|数据|数据库 英文原文地址: http://www.onjava.com/pub/a/onjava/2005/05/11/sqlexplorer.html中文地址: http://www.matrix.org.cn/resource/article/43/43630_Eclipse_SQLExplorer.html关键词: Eclipse SQLExplorer MySQL JDBC SQLExplorer是Eclipse集成开发环境的一种插件,它可以被用来从Eclipse连接到一

学习ADO和ODBC访问数据库的一些思路整理

ado|odbc|访问|数据|数据库 最近一直在学习研究用vc++访问数据库的问题,使用过ADO,也使用过ODBC.就这两种连接数据源的接口都有好几种方式,可以利用database,也可以利用dataset.利用这个word把我学习的思路整理一下. 一.使用ADO连接数据源 一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题). 1.直接在应用程序中建立与数据库的connection 2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作

ADO.NET访问数据库的步骤

ado|访问|数据|数据库 不论从语法来看,还是从风格和设计目标来看,ADO.NET都和ADO有显著的不同.在ASP中通过ADO访问数据库,一般要通过以下四个步骤: 1.创建一个到数据库的链路,即ADO.Connection: 2.查询一个数据集合,即执行SQL,产生一个Recordset: 3.对数据集合进行需要的操作: 4.关闭数据链路. 在ADO.NET里,这些步骤有很大的变化.ADO.NET的最重要概念之一是DataSet.DataSet是不依赖于数据库的独立数据集合.所谓独立,就是:即

VB程序如何访问数据库

 通过[Data]控件访问数据库     (1)启动VB.    (2)出现如图10.12所示的新建工程的[新建]选项卡.    (3)出现如图10.13所示的VB主界面.    (4)如图10.14所示.    (5)出现如图10.15所示的[属性窗口]界面.    ―――――――――――――――――――――――――――――――――――――    odbc;dsn=graduateDB;uid=scott;pwd=tiger;    ――――――――――――――――――――――――――――――

用连接池提高Servlet访问数据库的效率 (-)

servlet|访问|数据|数据库 Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍一种充分发挥该特色的实用技术,即数据库连接池. 一.实现连接池的意义 动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问.连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证.安全上下文配置这类任务,因而往往成为最为耗时的

Java访问数据库的速度瓶颈问题的分析及解决

访问|解决|数据|数据库|速度|问题 内容: 速度瓶颈问题的提出 JDBC访问数据库的机制 不同模式的JDBC接口的选择 Java程序中SQL语句格式的优化 软件模型中对数据库访问的设计模式的优化 将深入研究的问题 参考资料 关于作者 FoolsGarden@SMTH 自由Java传道士 2001 年 11 月 速度瓶颈问题的提出 在企业级的Java应用中,访问数据库是一个必备的环节.数据库作为数据资源的集散地,往往位于企业级软件体系的后方,供前方的应用程序访问.在Java技术的体系中,应用程序