`
weishaoxiang
  • 浏览: 96588 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

java网络编程 多线程服务器与客户端系统架构 socket应用

    博客分类:
  • J2EE
阅读更多

    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 ( );
		}
	}
}

 

 

 

分享到:
评论

相关推荐

    Java多线程技术及其在网络编程中的应用.pdf

    ### Java多线程技术及其在网络编程中的应用 #### 引言 Java作为一种强大的面向对象的编程语言,由SUN公司开发,旨在支持分布式计算。它不仅具备简单的语法、面向对象的特点,还拥有跨平台的特性、高可靠性和安全性...

    客户端服务器,多线程服务器,远程RMI会议

    在IT领域,客户端-服务器架构、多线程服务器和远程方法调用(RMI)是构建分布式系统中的关键概念。让我们深入探讨这三个主题,并了解它们如何在Java编程中实现。 首先,客户端-服务器架构是一种通信模型,其中...

    多线程socket服务器及客户端解决方案.rar_socket_多线程传播

    在这个"多线程socket服务器及客户端解决方案"中,我们主要探讨的是如何利用多线程技术增强socket服务的并发处理能力,以及在传输过程中如何确保数据的安全性。 首先,让我们了解什么是Socket。Socket是操作系统提供...

    Java 客户端服务器程序 学习笔记

    在Java编程领域,客户端-服务器(Client-Server)程序是一种常见的架构模式,它涉及两个主要组件:客户端应用程序和服务器端应用程序。在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何...

    多线程和网络编程

    在实际应用中,多线程和网络编程常常结合使用,比如在服务器端,一个线程可以负责处理一个客户端的连接,多个线程则可以同时处理多个连接,提高服务的并发能力。但是,多线程并不总是最佳解决方案,有时使用异步I/O...

    Java多线程技术在网络通信系统中的应用.pdf

    总结来说,Java多线程技术在网络通信系统中的应用包括了线程间通信的原理、多线程实现网络通信的原理、线程安全及同步控制的有效途径,以及网络通信编程中的Socket类实现。掌握这些技术要点,对于进行高效、稳定、...

    多线程 服务器端-客户端 c

    总结来说,多线程服务器端-客户端C编程涉及到网络编程基础,如套接字、连接处理、I/O多路复用,以及多线程编程,包括线程创建、同步与通信。通过这些技术,我们可以构建高效、可扩展的网络应用。

    Socket服务器端断开后重新打开,客户端将自动完成链接

    Socket通信技术是网络编程中的重要组成部分,特别是在分布式系统和客户端-服务器架构中广泛使用。它提供了进程间的网络通信能力,允许不同计算机上的程序通过互联网进行数据交换。在本场景中,我们关注的是如何处理...

    Java网络编程例子

    本示例主要展示了如何使用Java实现一个基于C/S(客户端/服务器)架构的简单聊天应用,其中包括服务器端与多个客户端之间的通信,以及客户端间的信息传递。以下是相关的Java网络编程知识点: 1. **C/S架构**:客户端...

    基于Java的多线程并发服务器的设计与应用

    ### 基于Java的多线程并发服务器的设计与应用 #### 1. 引言 随着网络技术的发展,服务器端的设计变得越来越复杂且高效。其中,多线程并发服务器因其能够同时处理多个用户请求而受到广泛的关注。本文将探讨多线程...

    Java网络编程精解(孙卫琴)电子教案

    这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等网络应用协议的实现。下面我们将围绕这些知识点进行详细讲解。 1. **Java网络编程基础** - **网络...

    ATM自动取款系统(服务器端客户端+多线程+TCP网络通信)

    ATM自动取款系统是一个典型的企业级应用,它涉及到服务器端和客户端的交互,多线程处理以及TCP网络通信技术。下面将详细讲解这些关键知识点。 1. **三层架构分层技术**: 三层架构是一种常见的软件设计模式,包括...

    C# socket多线程编程

    总的来说,C#的Socket多线程编程结合了网络通信与并发处理的能力,使得开发者可以构建高效、稳定的网络应用。通过理解和掌握相关的同步机制以及Socket工作原理,开发者能够设计出复杂且健壮的网络系统。

    Java网络编程 Socket编程

    本篇将详细解析Java网络编程中Socket编程的关键知识点,包括TCP实现、多线程在Socket编程中的应用、UDP程序的实现以及网络编程的基本概念。 首先,我们来了解网络的基本概念。网络是由相互连接的计算机组成的系统,...

    JAVA_C- S聊天程序 Socket 多线程 点对点 点对多

    Java_C-S聊天程序是基于Socket通信技术实现的一种网络应用程序,它允许客户端(C)与服务器端(S)进行实时的数据交换。在这个项目中,我们主要关注的是如何利用Socket编程来构建一个点对点(P2P)以及点对多(P2M)...

    基于Socket网络聊天系统的设计与实现

    基于Socket网络聊天系统的设计与实现是指使用Java应用程序设计,基于Client/Server模型,使用Eclipse作为开发环境,MySQL作为后台数据库,利用JDBC连接数据库的网络聊天系统。该系统主要包括服务器模块和客户端模块...

    Java Socket网络编程研究.pdf

    在Java中,Socket编程是实现网络通信的基本手段,它允许应用程序之间通过网络进行数据交换。本文将详细探讨Java Socket网络编程中的关键知识点。 首先,我们回顾一下网络通信的发展历史。通信技术的发展经历了从...

    java socket 编程文档

    Java套接字编程是网络通信的核心技术之一,它允许Java应用程序之间或应用程序与远程服务器之间的双向数据传输。本文将深入探讨Java Socket编程的基础知识、关键概念以及如何在实践中应用。 一、Socket概述 Socket,...

Global site tag (gtag.js) - Google Analytics