`
时间拾贝
  • 浏览: 9637 次
  • 性别: 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了~~

 

分享到:
评论

相关推荐

    UDP简易客户端与服务器端程序(Java)

    在这个Java实现的UDP简易客户端与服务器端程序中,我们可以通过两个核心文件——UDPClient.java和UDPServer.java来理解其工作原理。 首先,让我们来看看`UDPServer.java`。服务器端通常负责监听特定的端口,接收...

    聊天室代码 套接字 java

    一旦有客户端连接,服务器端会为每个客户端创建一个新的套接字用于数据传输。客户端则通过套接字连接到服务器,发送和接收数据。 在Java中,我们可以使用`java.net.Socket`类来创建客户端套接字,`java.net....

    Java网络编程之TCP协议下—上传文件到服务器程序

    在Java中,我们可以使用`java.net.ServerSocket`类来创建服务器端的套接字,监听指定端口。一旦有客户端连接,服务器端就需要创建一个`Socket`对象来处理这个连接。接着,通过`Socket`的输入流(`InputStream`)读取...

    网络编程课程设计——猜数字

    1. 服务器端生成一个随机数。 2. 客户端发起连接请求,服务器接收连接。 3. 客户端发送猜测,服务器接收并验证。 4. 如果猜测正确,服务器通知客户端胜利;如果猜测错误,服务器会提示过高或过低。 5. 客户端根据...

    客户端和服务器互联——计算机网络课程设计

    在这个“客户端和服务器互联——计算机网络课程设计”项目中,我们聚焦于实现一个Echo程序,它是一个简单的聊天工具,能够模拟服务器与多个客户端之间的信息交互。 首先,我们需要理解“服务器”和“客户端”的概念...

    Chat-Application:使用套接字编程的客户端-服务器聊天(Java)

    通过这个“Chat-Application”,开发者可以深入理解Java套接字编程的基本原理和实践,同时学习如何设计并实现一个简单的聊天系统。这不仅有助于提升网络编程技能,也为构建更复杂的分布式系统打下基础。

    java语言实现服务器客户端聊天界面

    Java语言在实现服务器客户端聊天界面时,主要涉及网络编程的核心概念——套接字(Socket)技术,以及用户界面设计。套接字是网络通信的基本组件,它提供了进程间通信(IPC,Inter-Process Communication)的能力,...

    聊天系统服务器和客户端

    开发者通常会编写服务器端代码(如Java、Python或Node.js)来实现上述功能,并使用客户端开发语言(如JavaScript、Swift或Java)创建用户界面并与服务器通信。 总的来说,聊天系统的服务器和客户端涉及了网络通信、...

    TCP服务器与客户端源代码工程

    本项目名为"TCP服务器与客户端源代码工程",主要关注如何使用编程语言实现TCP通信的两端——服务器端(Server)和客户端(Client)。这里我们将深入探讨TCP协议、服务器与客户端的工作原理,以及如何在实际项目中...

    Java——简单Web服务器实现[借鉴].pdf

    `ServerSocket(int port)`构造函数用于创建一个监听指定端口的服务器套接字。 4. **`accept()`方法**: - `ServerSocket`的`accept()`方法阻塞,直到有客户端连接到服务器。当有连接时,它返回一个`Socket`对象,...

    TCP——实现时间协议实验三

    当有客户端连接请求时,accept()方法将返回一个新的套接字用于与客户端通信。接收到客户端的获取时间请求后,服务器使用time库获取当前时间,然后将其转换为字符串,再通过sendall()方法发送给客户端。 2. **客户端...

    java 入门教程课件——j2se

    - **网络编程**:使用Socket和ServerSocket类创建客户端和服务器端通信。 - **URL和URLConnection**:访问网络资源,如下载网页内容。 8. **建立对话框**(第八讲): - **对话框**:在主窗口之外显示的临时窗口...

    Java网络编程学习资料

    本文将深入探讨标题和描述中提及的几个关键知识点:Java套接字编程、Java的网络功能与编程基础、TCP网络协议以及Java Transaction API。 首先,我们来了解**Java套接字编程**。套接字(Socket)是实现进程间通信的...

    重大学生Java仿QQ

    在Java仿QQ项目中,网络编程的概念如套接字(Socket)、输入输出流(InputStream/OutputStream)以及多线程编程是非常关键的。Java的并发库使得开发者能够轻松地处理多个并发连接,保证了系统的高效运行。同时,为了...

    Java课程设计——Java聊天室程序源代码

    `ServerSocket`用于创建服务器端监听套接字,等待客户端连接;`Socket`则代表客户端与服务器之间的连接。 2. **多线程处理**:由于聊天室需要同时处理多个用户的请求,因此多线程是必不可少的。每个客户端连接都会...

    小小聊天程序代码——首次运行客户端可以向服务端发信息,不知道为什么之后相互就不能发信息了

    1. **资源管理不当**:如果服务器或客户端没有正确地关闭输入/输出流或套接字,可能会导致资源泄露,进而影响后续的通信。确保在每次发送完消息后都关闭流,而在结束通信时关闭套接字。 2. **多线程同步问题**:...

    Socket服务器端实例(网络聊天室)

    Socket编程是计算机网络编程中的重要组成部分,特别是在Java中,它为开发者提供了实现客户端与服务器端通信的能力。本实例——"Socket服务器端实例(网络聊天室)",将带你深入理解Socket在构建网络聊天室中的应用。 ...

    JAVA实现的屏幕共享程序

    在JAVA中,可以使用java.net.DatagramSocket类来创建UDP套接字,用于发送和接收数据包。服务器端会将屏幕截图的数据编码为字节流,然后通过UDP发送到各个客户端。而客户端则监听特定的UDP端口,接收到数据后解码并...

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

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

Global site tag (gtag.js) - Google Analytics