Java套接字编程是大家学习Java网络编程的入门知识,最简单的例子就是实现客户端与服务器端的通信:从客户端可以发送消息至服务器端,从服务器端也可以反馈消息给客户端。下面先简单介绍一下涉及到的概念:
套接字:套接字是为了区别不同的应用程序进程和连接,计算机操作系统为TCP/IP协议提供的接口。
1)套接字是由IP地址和端口号组成的,简单解释一下,假设你的电脑上有两个程序都在运行,并且都从服务器端读取数据,一个是A,一个是B,现在A的服务器和B的服务器同时发送来数据,现在怎么判断接收到的网络数据是给哪一个程序使用的呢?这就是端口的作用了!每个程序监听本机上的一个端口,就可以从这个端口读取数据了!这样数据就不会混乱~~
2)网络流:在网络上传送的数据流;
下面是程序代码:(注:代码中涵盖了数据库操作JDBC以及多线程(线程池操作))
客户端:
import javax.swing.*;
import java.awt.*;
import java.net.Socket;
import java.sql.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.*;
public class test extends JFrame {
private DataOutputStream toServer;
private DataInputStream fromServer;
private Socket socket;
public test(){
//界面制作
setLayout(new FlowLayout());
JLabel label = new JLabel("请输入ID:");
final JTextField id = new JTextField(10);
JButton button = new JButton("search");
add(label);
add(id);
add(button);
JLabel labela = new JLabel(" Employee ID: ");
final JTextField text1 = new JTextField(20);
add(labela);
add(text1);
JLabel labelb = new JLabel(" Last Name: ");
final JTextField text2 = new JTextField(20);
add(labelb);
add(text2);
JLabel labelc = new JLabel(" First Name: ");
final JTextField text3 = new JTextField(20);
add(labelc);
add(text3);
JLabel labeli= new JLabel(" Address: ");
final JTextField text4 = new JTextField(20);
add(labeli);
add(text4);
JButton but = new JButton("Insert");
add(but);
//网络:打开套接字
try{
socket = new Socket("localhost", 8000);
}catch(IOException e){}
//这个按钮测主要作用就是向服务器端发送数据的,数据是从界面上读取的,然后写入网络流发送;
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String access = "insert|" + text2.getText() + "|" + text3.getText() + "|" + text4.getText();
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write(access);
pw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//这个按钮是查询操作,然后通过getInputStream()方法监听端口返回的数据,处理后显示在界面上
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
//网络操作;
InputStreamReader isr;//将从套接字读到的字节转化成为字符;
//isr = new InputStreamReader(socket.getInputStream());
//BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write("search|" + id.getText());
pw.flush();
char buf[] = new char[200];
//初始化
for(int i = 0; i < 100; i++){
buf[i] = '0';
}
isr = new InputStreamReader(socket.getInputStream());
isr.read(buf);
String result = arrayOp(buf);
//处理字符串;
String re[] = result.split("\\|");
//显示查询结果
text1.setText(id.getText());
text2.setText(re[0]);
text3.setText(re[1]);
text4.setText(re[2]);
}catch(IOException ex){};
}
});
}
//处理字符串的函数(主要是字符串在Java网络流里面不好传输)
public String arrayOp(char buf[]){
String result = "";
for(int i = 0; i < buf.length; i++){
if(buf[i] == '0')
break;
result = result + buf[i];
}
return result;
}
//实例化
public static void main(String args[]){
JFrame frame = new test();
frame.setTitle("数据库操作");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(350, 220);
frame.setVisible(true);
}
}
服务器端:
import java.awt.BorderLayout;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Server extends JFrame{
/**
* @param args
*/
private JTextArea jta = new JTextArea();
private DataInputStream input;
private DataOutputStream output;
private Socket socket;
//线程池
private ExecutorService executor = Executors.newFixedThreadPool(3);
String result = "";
//监听中!
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Server server = new Server();
server.listen();
}
public Server(){
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("Server");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void listen() throws IOException{
//create a server socket
//注意服务器端的接口声明,没有IP了~~
ServerSocket serverSocket = new ServerSocket(8000);
jta.append("~~~欢迎使用数据库操作服务器端~~~\n");
while(true){
socket = serverSocket.accept();
//建立线程,放入线程池
Runnable task = new Mc();
executor.execute(task);
}
}
private class Mc implements Runnable{
public Mc(){
}
public void run(){
try{
String dbUrl = "jdbc:odbc:jdbc";
String user = "";
String password = "";
//读取流;
InputStreamReader isr;
isr = new InputStreamReader(socket.getInputStream());
//BufferedReader br = new BufferedReader(isr);
///PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
char buf[] = new char[200];
//初始化
for(int i = 0; i < 200; i++){
buf[i] = '0';
}
while(true){
isr.read(buf);
String operation = arrayOp(buf);
//转义字符!!
String arrayStr[] = operation.split("\\|");
//连接数据库;
try{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}catch(ClassNotFoundException ep){
System.out.println(ep.toString());
}
Connection c = DriverManager.getConnection(dbUrl, user, password);
Statement s = c.createStatement();
//执行查询语句;
if(arrayStr[0].equals("search")){
jta.append("您的查询ID号为:" + arrayStr[1] + "\n");
jta.append("正在为您执行查询操作····请稍等\n");
ResultSet r =
s.executeQuery(
"SELECT FirstName, LastName, Address " +
"FROM Employees " +
"WHERE " +
"(EmployeeID=" + arrayStr[1] + ") ");
while(r.next()) {
result = r.getString("LastName") + "|" + r.getString("FirstName") + "|" + r.getString("Address");
}
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write(result);
pw.flush();
jta.append("查询完毕,数据已返回客户端\n\n");
c.close();
}
else if(arrayStr[0].equals("insert")){
jta.append("正在为您执行插入操作····请稍等\n");
jta.append("LastName :" + arrayStr[1] + "\n");
jta.append("FirstName :" + arrayStr[2] + "\n");
jta.append("Address :" + arrayStr[3] + "\n");
for(int i = 0; i < 200; i++){
buf[i] = '0';
}
String access = "INSERT INTO Employees(LastName, FirstName, Address) VALUES('" + arrayStr[1]+"','"
+ arrayStr[2] +"','" + arrayStr[3] +"')";
s.executeQuery(access);
c.close();
jta.append("插入完成^_^\n\n");
}
s.close(); // Also closes ResultSet*/
}catch(SQLException ex){
System.out.println(ex.toString());
}/
}
}catch(IOException ep){}
}
public String arrayOp(char buf[]){
String result = "";
for(int i = 0; i < buf.length; i++){
if(buf[i] == '0')
break;
result = result + buf[i];
}
return result;
}
}
}
好啦,上面的例子对Java的线程,网络,数据库都有演示~~~不过不能在你的电脑上演示,因为么得数据库啊,大家可以把数据库那一段删了或改了,这样就OK了~~