Java套接字——实现客户端与服务器端的交流

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了~~

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值