`
robinsoncrusoe
  • 浏览: 736725 次
  • 性别: 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 实验名称 基于Java RMI的C/S编程实验

    实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验

    Java语言程序设计教程(Java 7)——入门与提高篇06

    第6章介绍了几个Java的高级应用,包括多线程、网络编程和GUI编程。...网络编程,介绍如何通过HTTP协议访问Web应用,如何通过Socket编程实现C/S结构的应用程序;GUI,介绍如何编写图形用户界面。最后给出了3个综合实例。

    JAVA程序设计实验指导书

    掌握JDK调试和运行程序的方法、面向对象编程的思想、Java中的基本方法和技术,能够熟练使用Java设计、编写程序,特别是基于TCP/IP的Socket编程,并能运用这些知识方法完成C/S和B/S结构程序的设计工作。通过实验,...

    JAVA网络通信系统的研究与开发(论文+源代码+开题报告)-jsp-java源程序代码.rar

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    JAVA网络通信系统的研究与开发(论文+源代码+开题报告+论文)

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    基于java的网络通信系统设计与实现毕业设计(项目报告+源代码+开题报告).zip

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    [计算机毕设]基于java的网络通信系统设计与实现(项目报告+源代码+开题报告).zip

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

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

    而基于TCP/IP协议网络环境下的应用程序 是通过客户机/服务器(C/S)作用方式模式在网络(应用)编程界面实现的。本次实验采用 java语言设计一个基于C/S模式的TCP网络通讯程序。实现客户端与服务器端之间的数据 传输。 ...

    基于Java的网络聊天系统的设计与实现(源码+说明文档)

    本文使用的网络编程模型是客户端/服务端(C/S)结构,遵循TCP和UDP协议,网络聊天功能通过socket模块实现,用户在客户端上登录到指定端口的服务端与其他用户进行网络聊天。服务器启动后,等待客户端的连接,转发客户端指定...

    JAVA网络通信系统设计(源代码)

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    基于java的网络通信系统设计与实现毕业设计(说明报告+源代码+开题报告)

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    JAVA网络通信系统的研究与开发

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    Java聊天系统实训报告

    1、理解C/S模式的软件系统结构,掌握网络编程的基本概念; 2、了解Java 的多线程机制,掌握Java多线程技术的应用; 3、熟练掌握基于TCP协议的Socket编程; 4、熟练掌握基于UDP协议的Socket编程; 5、了解Socket编程...

    毕业设计-JAVA网络通信系统的研究与开发(论文+源代码+开题报告)

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

    网络实训基于Java的网络聊天软件的设计与实现

    本文使用的网络编程模型是客户端/服务端(C/S)结构,遵循TCP和UDP协议,网络聊天功能通过socket模块实现,用户在客户端上登录到指定端口的服务端与其他用户进行网络聊天。服务器启动后,等待客户端的连接,转发客户端指定...

    JAVA网络通信系统的研究与开发的设计

    系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的...

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

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    基于Java的视频会议系统(软件程序+WORD论文文档).zip

    用到多媒体技术(JAVA 多媒体框架JMF),视频和音频用TRP协议传输,用到Socket编程技术,多播技术。网络视频会议首先是基于网络传输的,那么就必然要依托于JAVA网络编程的相关知识。在这基础上,由于相关音频、视频...

Global site tag (gtag.js) - Google Analytics