`
robinsoncrusoe
  • 浏览: 747094 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

Java的socket编程实现c/s结构程序

    博客分类:
  • JAVA
阅读更多
利用SOCKET通信技术开发一个C/S结构的程序,要求客户端具有登录验证界面,服务器端采用多线程,用户命和密码的验证在服务器端执行。

用的是swing的技术.不是web的.

现在给贴出我的代码: 整个结构分两个工程
1。服务端工程NioServer.java: 采用nio 方式的异步socket通信,不仅可以实现你的服务器还可以让你多学习一下什么是nio
2。客户端工程UserClient.java: 采用Swing技术画了一个简单的UI界面,比较土,原因是我没那么多时间去设计界面,你需要的话可以自己去修改得漂亮点,相信不难


现在贴工程1:
package com.net;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NioServer {
 public static final int SERVERPORT=5555;
 public static final String USERNAME="wangzhirong";
 public static final String PASSWORD="123456";
 public static final String ISACK="ACK";
 public static final String ISNAK="NAK!";
// Selector selector;//选择器
// SelectionKey key;//key。 一个key代表一个Selector 在NIO通道上的注册,类似主键;
//      //取得这个Key后就可以对Selector在通道上进行操作
 private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );// 通道数据缓冲区
 public NioServer(){
 }
 public static void main(String[] args) throws IOException {
  NioServer ns=new NioServer();
  ns.BuildNioServer();
 }
 public void BuildNioServer() throws IOException{
  /////////////////////////////////////////////////////////
  ///////先对服务端的ServerSocket进行注册,注册到Selector ////
  /////////////////////////////////////////////////////////
  ServerSocketChannel ssc = ServerSocketChannel.open();//新建NIO通道
  ssc.configureBlocking( false );//使通道为非阻塞
  ServerSocket ss = ssc.socket();//创建基于NIO通道的socket连接
  //新建socket通道的端口
  ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT));
  Selector selector=Selector.open();//获取一个选择器
  //将NIO通道选绑定到择器,当然绑定后分配的主键为skey
  SelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT );
  ////////////////////////////////////////////////////////////////////
  ////   接收客户端的连接Socket,并将此Socket也接连注册到Selector   ////
  ///////////////////////////////////////////////////////////////////
  while(true){
   int num = selector.select();//获取通道内是否有选择器的关心事件
   if(num<1){continue; }
   Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合
   Iterator it = selectedKeys.iterator();
   while (it.hasNext()) {//遍历每个事件
    try{
     SelectionKey key = (SelectionKey)it.next();
     //有一个新联接接入事件,服务端事件
     if ((key.readyOps() & SelectionKey.OP_ACCEPT)
               == SelectionKey.OP_ACCEPT) {
              // 接收这个新连接
              ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();
              //从serverSocketChannel中创建出与客户端的连接socketChannel
              SocketChannel sc = serverChanel.accept();
              sc.configureBlocking( false );
              // Add the new connection to the selector
              // 把新连接注册到选择器
              SelectionKey newKey = sc.register( selector, 
                SelectionKey.OP_READ );
              it.remove();
              System.out.println( "Got connection from "+sc );
     }else
     //读客户端数据的事件,此时有客户端发数据过来,客户端事件 
     if((key.readyOps() & SelectionKey.OP_READ)
               == SelectionKey.OP_READ){
              // 读取数据
              SocketChannel sc = (SocketChannel)key.channel();
              int bytesEchoed = 0;
              while((bytesEchoed = sc.read(echoBuffer))> 0){
               System.out.println("bytesEchoed:"+bytesEchoed);
              }
              echoBuffer.flip();
              System.out.println("limet:"+echoBuffer.limit());
              byte [] content = new byte[echoBuffer.limit()]; 
              echoBuffer.get(content);
              String result=new String(content);
              doPost(result,sc);
              echoBuffer.clear();
              it.remove();
     }   
    }catch(Exception e){}
   }
  }
 }
 
 public void doPost(String str,SocketChannel sc){
  boolean isok=false;
  int index=str.indexOf('|');
  if(index>0){
   String name=str.substring(0,index);
   String pswd=str.substring(index+1); 
   if(pswd==null){pswd="";}
   if(name!=null){
    if(name.equals(USERNAME)
     && pswd.equals(PASSWORD) 
    ){
     isok=true;     
    }else{
     isok=false;
    }    
   }else{
    isok=false;
   }   
  }else{
   isok=false;
  }
  String result="";
  if(isok){
   result="ACK";
  }else{
   result="NAK!";
  }
  ByteBuffer bb = ByteBuffer.allocate( result.length() );
  bb.put(result.getBytes());
  bb.flip();
  try {
   sc.write(bb);
  } catch (IOException e) {
   e.printStackTrace();
  }
  bb.clear();
 }
 
}


下面贴工程2
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class UserClient implements  ActionListener{
 JFrame jf;
 JPanel jp;
 JLabel label_name;
 JLabel label_pswd;
 JTextField userName;
 JButton jb;
 JPasswordField paswrd;
 JLabel hintStr;
 public UserClient  (){
  jf=new JFrame("XXX 登陆系统");
  jp=new JPanel();
  jf.setContentPane(jp);
  jf.setPreferredSize(new Dimension(350,220));
  jp.setPreferredSize(new Dimension(350,220));
  jp.setBackground(Color.gray);
  label_name=new JLabel();
  label_name.setPreferredSize(new Dimension(150,30));
  label_name.setText("请输入帐户(数字或英文):");
  userName=new JTextField();
  userName.setPreferredSize(new Dimension(150,30));
  jp.add(label_name);
  jp.add(userName);  
  label_pswd=new JLabel();
  label_pswd.setPreferredSize(new Dimension(150,30));
  label_pswd.setText("请输入密码:");
  jp.add(label_pswd);
  paswrd=new JPasswordField();
  paswrd.setPreferredSize(new Dimension(150,30));
  jp.add(paswrd);
  jb=new JButton("OK");
  jb.setPreferredSize(new Dimension(150,30));
  jb.setText("确  定");
  jb.addActionListener( this);
  jp.add(jb);
  hintStr=new JLabel();
  hintStr.setPreferredSize(new Dimension(210,40));
  hintStr.setText("");
  hintStr.setForeground(Color.RED);
  jp.add(hintStr);
  jf.pack();
  jf.setVisible(true);
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 
 private String name;
 private String pswd;
 public void actionPerformed(ActionEvent e) {
  name=userName.getText().trim();
  pswd=new String(paswrd.getPassword());
  if(pswd==null){
   pswd="";
  }else{
   pswd=pswd.trim();
  }
  if(name!=null && name.length()>0){
   hintStr.setText("正在验证客户端,请稍候...");
   start();
  }
 }
 
 OutputStream os;
 Socket s;
 InputStream is;
 public void start(){
  //建立联网线程
  new Thread(new Runnable(){
   public void run() {
    try {
     s=new Socket("127.0.0.1",5555);
     //写
     os=s.getOutputStream(); 
     os.write(name.getBytes());
     os.write('|');//用户名与密码用"|"分隔
     os.write(pswd.getBytes());
     os.flush();
     //读内容
     Thread.sleep(1000);
     is=s.getInputStream();
     int len=is.available();
     System.out.println("len:"+len);
     byte[] bytes=new byte[len];
     is.read(bytes);
     String resut=new String(bytes);
     System.out.println("resut:"+resut);
     //TODO 这里通过返回结果处理
     if(resut.equals("ACK")){
      hintStr.setText("验证成功,欢迎光临!");
     }else{
      paswrd.setText(null);
      hintStr.setText("用户名或密码错误,请重新输入");
     }
    } catch (UnknownHostException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }finally{
//     try {
//      os.close();
//      is.close();
//      s.close();
//     } catch (IOException e) {
//      e.printStackTrace();
//     }
    }
   }    
  }).start();
 }
 
 public static void main(String[] args) {
  new UserClient();
 }

}

本回答对我有帮助
6

分享到:
评论
1 楼 Mix_Devil 2011-04-20  
刚好在学习java C/S架构软件的开发,并在做一个IM练手,您的文章给了我很重要的参考,祝您工作愉快!

相关推荐

    java课程设计(c/s)

    【Java课程设计(C/S)】是针对计算机科学与技术专业学生的一项实践任务,旨在让学生深入理解客户端/服务器(Client/Server,C/S)架构,并掌握使用Java编程语言进行系统开发的技术。在这个项目中,学生们通常会被...

    java课程设计c/s结构的图书管理系统

    6. **网络编程**:在C/S架构中,客户端和服务器之间的通信涉及到网络编程,Java的Socket编程接口(如TCP/IP)可能被用到。 7. **MVC设计模式**:Model-View-Controller模式是Java Web开发中常见的设计模式,可能被...

    socket实现c/s结构示例代码

    在C/S结构中,服务器创建一个监听Socket,等待客户端的连接请求,一旦客户端连接,双方就可以通过Socket交换数据。 2. **ServerSocket类**:在服务器端,我们需要创建一个ServerSocket实例,指定一个端口号来监听...

    socket编程,C/S结构,Swing编写的小代码---考试系统

    C/S结构通常分为两部分:服务器端(Server)和客户端(Client)。服务器端运行特定的服务,等待客户端发起连接请求;客户端则向服务器发送请求,并接收服务器响应。在这个考试系统中,服务器端可能负责验证用户的...

    Java实现C/S架构的聊天系统

    Java的Socket编程是实现C/S通信的关键。Socket是TCP/IP协议的一部分,用于两个网络应用程序之间建立连接,进行双向通信。在聊天系统中,服务器会创建一个监听Socket,等待客户端的连接请求。一旦连接建立,客户端和...

    学习JAVA—网络编程之Socket、ServerSocket、C/S模式

    在实际应用中,Java的Socket编程还需要考虑到异常处理、多线程、数据编码与解码等问题。例如,为了确保网络通信的健壮性,你需要捕获并处理IOException。多线程则用于同时处理多个客户端连接,避免服务器因等待单个...

    Java网络编程(18个Socket C/S实例)

    Java网络编程是构建分布式应用程序的关键技术,特别是在服务器端与客户端之间进行数据交换时。本压缩包包含了一系列关于Socket通信的实例,涵盖了从基础的单客户服务器通信到复杂的多客户服务器相互通信,以及对象...

    分布式程序java 实验名称 基于Java RMI的C/S编程实验

    总的来说,这个实验旨在让学生掌握Java中分布式编程的基本概念和技术,包括Socket编程和RMI,同时也会接触到Swing GUI的开发。通过实践,学生将能够理解如何在分布式环境中设计和实现高效的客户端-服务器通信,以及...

    基于c/s架构的JAVA聊天程序 ,服务端和客户端都有

    1. **Socket编程**:Java的java.net.Socket和ServerSocket类用于建立客户端和服务器之间的连接,实现数据的双向传输。 2. **多线程**:服务器通常需要同时处理多个客户端的请求,因此会用到多线程技术,每个客户端...

    java实现C/S模式聊天室

    Java实现的C/S模式聊天室是一个典型的网络编程项目,它涉及到多线程、Socket通信、IO流处理以及用户界面设计等多个重要知识点。在这个项目中,我们将深入探讨这些关键概念。 首先,C/S(Client/Server)模式是...

    java网络文件传输(c/s)

    本文将深入探讨使用Java实现客户端/服务器(C/S)模式的文件传输协议,并解析其实现细节。 1. **消息协议设计** - 在Java中,为了实现文件传输,我们需要定义一套消息协议。协议主要包括两种消息类型:聊天文本...

    基于c/s架构的JAVA聊天程序

    在IT领域,C/S(Client/Server)架构是一种常见的分布式应用结构,主要用于构建网络应用程序,如我们这里的"基于C/S架构的JAVA聊天程序"。在这个系统中,客户端(Client)负责用户交互,而服务器端(Server)处理...

    c/s结构的javaQQ聊天程序

    在这个项目中,我们将深入探讨如何使用Java语言来实现一个C/S结构的QQ聊天程序,该程序模拟了真实的即时通讯体验。 【描述】:“主要是模仿QQ聊天程序,分为服务器和客户端” 模仿QQ聊天程序意味着我们需要实现...

    基于c/s结构的聊天程序

    【基于C/S结构的聊天程序】是一种典型的客户端-服务器(Client/Server,简称C/S)架构的通信系统,主要用于实现用户间的实时交互。在这种架构中,客户端是用户直接操作的界面,而服务器端则负责处理客户端发送的请求...

    SuperVCD java编写的小的C/S架构程序源代码

    Java的网络编程API使得构建C/S系统变得简单,Socket和ServerSocket类是实现客户端和服务器通信的核心。客户端通过Socket连接到服务器端的特定端口,然后通过输入/输出流交换数据。服务器端则使用ServerSocket监听...

    基于C/S模式的Java聊天室

    【标题】"基于C/S模式的Java聊天室"是一个典型的网络通信项目,它采用客户机/服务器(Client/Server,简称C/S)架构,通过Java编程语言实现。在这个模式下,客户端作为用户交互的界面,负责发送和接收聊天信息;而...

    c/s结构的订票系统

    总的来说,“c/s结构的订票系统”是一个典型的分布式应用程序,结合了Java Swing的GUI设计与Java网络编程技术,实现了用户友好的订票流程和高效的服务器处理能力。开发者需要具备扎实的Java基础知识,理解C/S架构的...

    基于Socket架构的C/S模式Java聊天室代码

    Java聊天室是网络编程中的一个常见应用场景,它利用Socket通信机制实现客户端(Client)与服务器端(Server)的实时交互。本项目是一个基于Socket架构的C/S(客户端/服务器)模式的Java聊天室,提供了基本的聊天功能...

    java C/S聊天程序

    3. **Socket编程**:Java中的Socket类是实现C/S架构的基础,它提供了在两台机器之间建立连接并交换数据的接口。在这个聊天程序中,客户端通过Socket连接到服务器,发送和接收消息。 4. **多线程**:为了实现并发...

    java课程设计标准教程 java课程设计

    9. **网络编程**:Java提供了Socket和ServerSocket类进行网络通信,学习网络编程需要理解TCP/IP协议的基础知识,以及如何创建客户端和服务端进行数据交换。 10. **实践应用**:理论知识结合实际项目进行练习是巩固...

Global site tag (gtag.js) - Google Analytics