`
时间拾贝
  • 浏览: 9543 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • 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了~~

 

分享到:
评论

相关推荐

    java网络编程技术课程设计

    目前,基于TCP/IP协议的网络得到了普及和飞速的发展,Windows下的网络程序越来越显得重要。利用TCP/IP协议提供的编程接口———Socket(套接字)可以开发出TCP/IP应用程序。...实现客户端与服务器端之间的数据传输。

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭...

    Java典型模块

    25.3.2 套接字(Socket)机制 25.3.3 UDP协议类 25.3.4 TCP协议类 25.3.5 TCP协议客户端类 25.4 小结 第26章 FTP服务器客户端 (FtpClient+I/O处理) 26.1 FTP服务器客户端原理 26.1.1 项目结构框架分析 26.1.2 项目...

    java网络编程技术课程设计.doc

    实现客户端与服务器端之间的数据 传输。 关键词:TCP/IP 网络通信 java C/S(client/server)模式 1引言 计算机网络通信是以计算机为信息接收终端,融合了计算机网络技术的通信方式。计 算机网络通信顺畅的重要保障...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    第六章 认我测在线检测服务系统实现与测试 33 6.1认我测在线检测服务框架设计 33 6.2 系统运行环境搭建及配置 34 6.2.1 AndroidManifest.xml主程序环境配置 34 6.2.2 移动端工程资源布局 35 6.3 认我测在线认证检测...

Global site tag (gtag.js) - Google Analytics