- 浏览: 26144 次
- 性别:
- 来自: 南宁
文章分类
最新评论
java网络编程 多线程服务器与客户端系统架构 socket应用
最近在做一些金融业管理系统,经常要进行网络间数据的交互,其实也就是服务器端与客户端的一些信息发送与接收。系统已经完成,也就整理下使用的架构。
服务器端:做为系统的服务器是要面对多个客户端的,所以要用多线程来架设,对每个客户端的数据处理都是互不影响的,而且服务器与客户端的数据交互是同步的。
客户端:客户端的应用也就是发送信息到服务器,然后得到服务器返回的信息。
(代码很清晰,就不用多说了。)
服务器端主要有三个类:
1、服务器类:Server.java
2、服务器线程类:ServerThread.java
3、服务器代理线程类:ServerThreadAgent.java
客户端主要有两个类:
1、信息发送类:Client.java
2、信息接收类:ClientThreadAgent.java
package net.xiaoxiang.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; /** * @author weishaoxiang */ public class Server { ServerSocket serverSocket; ServerThread serverThread; boolean sign = true; // true:服务器未启动 false:服务器已启动 public static void main ( String[] args ) { Server server = new Server ( ); try { server.showmenu ( ); while ( true ) { InputStreamReader reader = new InputStreamReader ( System.in ); BufferedReader br = new BufferedReader ( reader ); String chooce = br.readLine ( ); if ( "0".equals ( chooce ) ) server.exitSystem ( ); if ( "1".equals ( chooce ) ) server.startServer ( ); if ( "2".equals ( chooce ) ) server.stopServer ( ); if ( "3".equals ( chooce ) ) server.showmenu ( ); } } catch ( Exception e ) { e.printStackTrace ( ); } } public void startServer ( ) { if ( sign == true ) { try { serverSocket = new ServerSocket ( 8888 ); serverThread = new ServerThread ( serverSocket ); serverThread.start ( ); sign = false; System.out.println ( "\n 服务器--启动成功。\n" ); } catch ( IOException e ) { System.out.println ( "\n 服务器--启动失败!\n" ); } } else { System.out.println ( "\n 服务器--已经启动" ); } } public void stopServer ( ) { if ( sign == false ) { try { if ( serverThread != null ) { serverThread.flag = false;// 关闭服务器线程 serverThread.serverSocket.close ( ); serverThread = null; } this.serverSocket.close ( ); sign = true; System.out.println ( "服务器--关闭成功" ); } catch ( IOException e ) { System.out.println ( "服务器关闭出现异常!" ); e.printStackTrace ( ); } } else { System.out.println ( "服务器--未启动" ); } } public void exitSystem ( ) { this.stopServer ( ); System.out.println ( "服务器线程关闭----退出程序" ); System.exit ( 0 ); } public void showmenu ( ) { System.out.println ( " 服务器菜单" ); System.out.println ( " 请选择输入相应菜单对应的标号" ); System.out.println ( " 1 启动服务器" ); System.out.println ( " 2 关闭服务器" ); System.out.println ( " 3 显示菜单" ); System.out.println ( " 0 关闭程序" ); } }
package net.xiaoxiang.socket; import java.net.ServerSocket; import java.net.Socket; /** * @author weishaoxiang */ public class ServerThread extends Thread { ServerSocket serverSocket; boolean flag = true; public ServerThread( ServerSocket serverSocket ){ this.serverSocket = serverSocket; } public void run( ){ while( flag ){ try{ Socket socket = serverSocket.accept( ); ServerThreadAgent serverThreadAgent = new ServerThreadAgent( socket ); serverThreadAgent.start( ); } catch( Exception e ){ e.printStackTrace( ); } } } }
package net.xiaoxiang.socket; import java.net.Socket; import net.xiaoxiang.utils.SocketUtil; /** * @author weishaoxiang */ public class ServerThreadAgent extends Thread { Socket socket; public ServerThreadAgent ( Socket socket ){ this.socket = socket; } /** * 在代理线程中进行业务处理 */ public void run ( ) { try { byte[] message = SocketUtil.readStream ( socket );// 接收信息 System.out.println ( socket.getInetAddress ( ) + "发来信息:" + new String ( message, "GBK" ) ); /* 在此处就可以进行自己的业务处理 */ String sendMessage = "信息已经收到。"; SocketUtil.writeStream ( sendMessage.getBytes ( ), socket );// 发送信息 } catch ( Exception e ) { e.printStackTrace ( ); } } }
package net.xiaoxiang.socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; import net.xiaoxiang.utils.SocketUtil; /** * @author weishaoxiang */ public class Client { Socket socket; ClientThreadAgent clientThreadAgent; boolean sign = true; public static void main ( String[] args ) { Client client = new Client ( ); InputStreamReader reader = new InputStreamReader ( System.in ); BufferedReader br = new BufferedReader ( reader ); try { client.showmenu ( ); while ( true ) { String menu = br.readLine ( ); if ( "0".equals ( menu ) ) { client.exitSystem ( ); continue; } if ( "1".equals ( menu ) ) { client.showmenu ( ); continue; } if ( "2".equals ( menu ) ) { for ( int i = 0; i < 100; i++ ) client.send ( "发送第 " + i + " 条信息" ); continue; } System.out.println ( "输入错误!请查看菜单:3" ); } } catch ( Exception e ) { e.printStackTrace ( ); } } private void showmenu ( ) { System.out.println ( " 系统菜单" ); System.out.println ( " 请选择输入相应菜单对应的标号" ); System.out.println ( " 1-------显示菜单" ); System.out.println ( " 0-------关闭程序" ); System.out.println ( " 2----发送信息" ); } private void exitSystem ( ) { try { System.out.println ( "程序已经关闭。" ); System.exit ( 0 ); } catch ( Exception e ) { e.printStackTrace ( ); } } private void startClientServer ( ) { try { socket = new Socket ( "127.0.0.1", 8888 ); clientThreadAgent = new ClientThreadAgent ( socket ); clientThreadAgent.start ( ); } catch ( Exception ee ) { ee.printStackTrace ( ); } } private void send ( String message ) { this.startClientServer ( ); SocketUtil.writeStream ( message.getBytes ( ), socket );// 发送信息 } }
package net.xiaoxiang.socket; import java.net.Socket; import net.xiaoxiang.utils.SocketUtil; /** * @author weishaoxiang */ public class ClientThreadAgent extends Thread { Socket socket; public ClientThreadAgent ( Socket socket ){ this.socket = socket; System.out.println ( "连接服务器成功 IP: " + socket.getInetAddress ( ) + " 端口:" + socket.getPort ( ) ); } public void run ( ) { try { byte[] message = SocketUtil.readStream ( socket );// 接收信息 System.out.println ( new String ( message, "GBK" ) ); socket.close ( ); } catch ( Exception e ) { e.printStackTrace ( ); } } }
发表评论
-
Linux系统下的项目部署
2012-07-20 11:03 836Linux系统下的项目部署 博客分类: ... -
Oracle 常用日期格式
2012-07-20 11:03 1071------------------------------- ... -
Oracle 常用性能监控SQL语句
2012-07-20 11:03 48741. --查看表锁 SELECT * FROM S ... -
Oracle 日期时间范围查询
2012-07-17 15:13 1043/* 日期时间范围查询 */ -------- ... -
Oracle 按日期统计
2012-07-17 15:12 1021---------------按日期统计----------- ... -
Oracle 常用日期型函数
2012-07-17 15:00 720----------------------ORACLE 常用 ... -
Oracle 日期时间运算
2012-07-17 14:57 1217---------------------oracle 时间运 ... -
Oracle 多表查询
2012-07-17 14:51 6681. SQL语句的执行顺序 SELECT DNAME ...
相关推荐
聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是...
聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是...
《Java网络通信系统的研究与开发》是指利用Java编程语言进行网络通信系统的设计、开发和实现的过程。以下是该过程的描述: 技术概述: Java网络通信系统是指利用Java语言及其相关技术实现的,用于在网络环境下进行...
2、使用Java 的多线程机制,深入理解Java多线程技术的应用。 3、使用GUI,对JFrame的深入学习。 4、使用网络编程,掌握基于TCP协议的Socket编程,了解Socket编程的协议约定,掌握简单应用协议的开发。 5、使用C...
Java实现 C/S架构简单例子 实现服务器与多个客户端之间的聊天功能,以及 客户端与客户端之间的聊天功能。
计算机网络课程设计 聊天室软件 基于C/S架构 采用多线程方法实现客户端与服务器之间消息的传送与转发
网络聊天室是一种应用广泛网络聊天方式,操作简单,功能丰富,本论文是JAVA语言设计和实现一个网络聊天室的过程,采用C/S架构设计,整个项目分为服务器和客户端。使用了JAVA 2中SWING组件,开发出简洁美观的用户和...
该系统采用先进的Java技术,实现了客户端与服务器之间的稳定、高效通信,适用于各种网络应用场景。 **论文部分**: * 详细阐述了系统的设计背景、目标和技术选型,为后续开发提供了坚实的理论基础。 * 深入分析了...
聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是...
(3)与服务器端进行通信 (4)关闭套接字 四、系统流程图 五、系统设计 本课程设计按照系统的具体功能要求,首先应用Socket编程创建客户端和服务器端, 每多个客户端服务器端就会相因的创建一个线程,它们之间通过这个...
系统采用c/s架构,不是简单的单机版! 当然,你可以服务端、客户端都在同一台电脑上...通过此项目,可以学习了解到C/S模式、java Swing图形界面编程、java 多线程、java Socket网络编程、java对数据库的操作等知识。
本文用跨平台且具有强大网络编程功能的JAVA语言,实现了一个聊天系统。本系统采用客户机/服务器架构模式,数据库管理系统用SQL Server2000完成,并通过JDBC-ODBC桥访问数据库。本聊天系统可以实现多人对多人的聊天,...
它具有简单的、完全面向对象以及与平台无关的结构,也具有可移植性、高性能和安全性,并提供了多线程的功能,而Java语言最大的成功之处在于它的平台无关性和具有强大的网络编程功能,基于Java网络编程的强大功能,...
网络通信:使用Java的Socket编程实现客户端与服务器之间的通信,可以选择TCP或UDP协议。 图形界面:可以使用JavaFX或Swing等GUI库来实现客户端的用户界面设计。 数据存储:可以使用关系型数据库如MySQL或非关系型...
它具有简单的、完全面向对象以及与平台无关的结构,也具有可移植性、高性能和安全性,并提供了多线程的功能,而Java语言最大的成功之处在于它的平台无关性和具有强大的网络编程功能,基于Java网络编程的强大功能,...
它具有简单的、完全面向对象以及与平台无关的结构,也具有可移植性、高性能和安全性,并提供了多线程的功能,而Java语言最大的成功之处在于它的平台无关性和具有强大的网络编程功能,基于Java网络编程的强大功能,...
客户端:使用Java Swing或JavaFX实现客户端界面,通过Socket与服务器建立连接,实现消息的发送和接收。 服务器端:使用Java Socket编程实现服务器端,监听客户端连接请求,接收和处理客户端发送的消息,并进行转发...
网络通信:使用Java的Socket编程实现客户端与服务器之间的通信,可以选择TCP或UDP协议。 图形界面:可以使用JavaFX或Swing等GUI库来实现客户端的用户界面设计。 数据存储:可以使用关系型数据库如MySQL或非关系型...