JAVA的TCP/UDP和数据库
很久没有写了,有点懒了,把两个实验写在一起:
第一个是java通信:TCP和UDP协议的使用;
先是UDP:
UDP是一个广播式通信,所以不需要确定对方是否接受到,只要自己发送就可以了,有点像短信的发送:
以下是用来接收的代码,放在一个线程里,不停的循环,对方发送的就可以收到:
具体步骤:
先新建一个DatagramSocket;
之后通过DatagramPacket承接包;
然后就是用receive方法接收;
之后转化为String就可以了;
1 public void run(){
2 try
3 {
4 DatagramSocket ds = new DatagramSocket(port);
5 while(true)
6 {
7 byte[] buf = new byte[1024];
8 DatagramPacket dp = new DatagramPacket(buf,buf.length);
9 ds.receive(dp);
10 String message = new String(dp.getData(),0,dp.getLength());
11 if(message.length()>5)
12 {
13 String flag = message.substring(0,5);
14 if(flag.equals("fi*le"))
15 {
16 getFileButton.setEnabled(true);
17 int nu =message.indexOf("\\");
18 String tempName = message.substring(5, nu);
19 int tempnu = nu;
20 nu = message.indexOf("\\",nu+1);
21 tempFilelenth = Integer.parseInt(message.substring(tempnu+1, nu));
22 nu = message.lastIndexOf("\\");
23 tempFileName = (String) message.subSequence(nu,message.length());
24 model.insertElementAt(tempName+" 向你发送文件,请接收!!",num++);
25 continue;
26 }
27 }
28 model.insertElementAt(message,num++);
29 }
30 }
31 catch(Exception e)
32 {
33 ;
34 }
35 }
之后就是文本发送,很简单了。
public void sendText(int port,String address,String message){
try{
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket(message.getBytes(),message.getBytes().length,InetAddress.getByName(address),port);
ds.send(dp);
ds.close();
}
catch(Exception eX){
;
}
}
UDP的话比较简单,但是容易丢包,所以之后的文件传输就采用TCP;
TCP的话就是一个握手式通信,有点类似于打电话,因为其这个特性,所以就可以防止丢包:
来看一下基本流程;
先是文件发送:
在服务器端新建一个ServerSocket,确定端口;
然后通过ServerSocket的accept方法获得一个Socket方法;
之后用返回的Socket的getOutputStream方法得到一个输出流;
之后向流里面写入就好了;
ServerSocket ss = new ServerSocket(portSend);
Socket s = ss.accept();
OutputStream out=s.getOutputStream();
while(len != -1)
{
lenth += len;
out.write(arr,0,len);
len = infile.read(arr);
string = (lenth*1000/size)/1000.0;
model.setElementAt(""+format.format(string*100)+"%"+" Sending "+lenth+" B",num);
}
再看一下文件接收:
接受就比发送简单一些,
先是新建一个对应接口的Socket;
然后调用它的getInputStream方法获得一个输入流就好;
之后向里面写入数据就好;
DataOutputStream outfile = new DataOutputStream(new FileOutputStream(path+fileName));
Socket get = new Socket("localhost",portGet);
byte[] arr = new byte[1024];
InputStream in = get.getInputStream();
len = 0;
long lenth = 0;
while((get.isConnected()==true)&&((len = in.read(arr)) !=-1))
{
lenth += len;
outfile.write(arr,0,len);
string = (lenth*1000/size)/1000.0;
model.setElementAt(""+format.format(string*100)+"%"+" Geting "+lenth+" B",num);
}
这样,简单的通信就做好了;
最后要注意的是接口不要搞错。
之后就是JAVA连接数据库:
实验采用的是Mysql数据库,一个轻量级的小型数据库:
JAVA连接数据库一般是先采用JDBC的接口,JDBC的接口会调用ODBC的接口,然后ODBC会真正操作数据库;
说的这么深奥,其实我们只要操作最上层的JDBC的接口就好了:
具体步骤:
先导入驱动包:
之后再在代码中引用:
这里要注意中文字符集在Mysql中和JAVA中的不匹配,将导致明明两个字段是一样的SQL语句就是不能识别,select也不能选中该列:
解决方法就是在连接时加入代码:?UseUnicode=true&characterEncoding=UTF-8;
//这里采用两次判断,区分没有用户还是密码错误:
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hit?useUnicode=true&characterEncoding=UTF-8","***","***");
//PerparedStatement解决注入的问题:
PreparedStatement pt = (PreparedStatement) con.prepareStatement("select * from admin where username=?");
pt.setString(1,sUser);
ResultSet rs = pt.executeQuery();
rs.next();
这样就可以简单的实现SQL操作了,上面采用PreparedStatement解决了SQL注入的问题;
下面是另一种最普通的连接方式:
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hit?useUnicode=true&characterEncoding=UTF-8","***","****");
Statement stmt = (Statement) con.createStatement();
ResultSet rs = stmt.executeQuery("select * from student");
这样就完成了JAVA中SQL操作;