`

socket服务与客户对接

阅读更多
现在贴工程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();
}

}
分享到:
评论

相关推荐

    C#收发二进制数据比如图片,声音、文件、视频等基于流的tcp协议socket服务端和客户端

    C#开发的Socket通信源码。包含客户端和服务端。基于windows系统的IOCP模型开发,吞吐性能高,稳定性强。也非常容易和第三方系统进行对接。基于SharpSocket开发。使用TCP协议,可以自动重连。

    Radware中国银行银企对接及B2B对接解决方案

    此外,Radware还提供了 CertainT100 设备来加速银企对接及B2B平台的SSL(Secure Socket Layer)过程,进一步提升了系统的安全性和性能。CertainT100同样采用冗余配置,两台设备并行工作,确保在一台设备出现故障时,...

    中国银行银企对接接口规范V2.20(基础金融服务类交易).pdf

    中国银行银企对接接口规范是中国银行针对企业客户提供的一套标准化接口规范,旨在使银行系统与企业系统之间能够实现安全、高效的电子数据交换。从提供的文件内容来看,该接口规范自2012年7月22日首次发布以来,已经...

    基于java的modbus TCP通信

    Modbus 协议是一项应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,包括 ASCII、RTU、TCP 三种报文类型。 Modbus TCP 数据帧由 MBAP 和 PDU 两部分组成。MBAP 是报文头,长度为...

    STM32 LWIP 并发服务器

    端口适配器则是将LWIP的抽象接口与STM32的具体硬件接口对接,比如以太网控制器的读写操作。 然后,建立并发服务器的关键在于理解和使用LWIP的TCP服务器API。TCP服务器需要监听特定端口,当客户端连接请求到达时,...

    基于C++的FTP服务器程序的设计说明.doc

    同时,服务器需能与现有的FTP客户端无缝对接。 FTP服务器的实现依赖于TCP/IP网络基础,尤其是Socket编程。Socket是一种通信接口,允许两个进程通过网络交换数据。在设计中,服务器端首先创建Socket,监听指定端口,...

    (原万能客服)聚合客服+聚合客服PC插件包 V24.5.0+V5.6.0版本

    聚合客服是强大的微信公众号客户服务功能模块,无缝对接人人商城等其他类型的商城,优化前端管理员可查询任意粉丝查看聊天记录,其他优化! 系统特点: 1、多渠道接入:wpb、手机app、电话、微信,整合到一个客服系统...

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

    服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 数据在Internet中是以有限大小的包形式传输的,...

    JAVA网络编程常见问题与答案

    监控端口扫描使用 new Socket(host, port) 方法和 new ServerSocket(ListeningPort) 进程下的 ServerSocket.accept() 方法对接,port 值从 1 到 65535 循环。全端口扫描只有本地意义,使用 new ServerSocket(port) ...

    (完整版)短信平台软件需求分析说明.doc

    - 项目需求:百货业希望通过短信平台改进传统的管理和服务方式,实现与业务系统的无缝对接,提高办公效率,增强客户服务体验。 - 系统接口:平台需提供WebService、Socket、HTTP等标准接口,允许第三方系统接入,...

    短信平台软件需求分析

    - **系统接口**:为了与其他系统对接,短信平台需要提供多种接口,如WebService、Socket、HTTP,以便第三方系统接入。这些接口分别适应不同场景,如WebService的跨平台性,Socket的低带宽占用和实时性,HTTP的易用...

    聚合客服V24.5.0+PC端插件V5.6.0开源版 增加语音转换时候列队功能

    2、采用客服系统主流的socket机制技术,实时对话实时刷新,并非ajax轮询查询数据库(消耗大量服务器资源) 3、可对接N个公众号、小程序,且每个公众号、小程序还可添加N个客服(客服组) 4、客服一个工作台,回复...

    全网智能客服平台小程序v5.3完整包源码

    简单说:如果你辛苦推广了一个客户,第二年到期了后,系统会自动提示他续费,而不用跑去收费.你也可以免费不限量的开试用账号,到期自动收费.系统还支持朋友推荐注册,通过朋友圈邀请传播,快速扩散宣传。

    最新短信平台软件需求分析说明.pdf

    因此,本公司准备采取建设短信平台的方法改变原有的管理方法和客服机制,实现短信平台与业务系统的对接。 3.2 需求分析 3.2.1. 系统接口 考虑到建成的短信平台需要和其他进行连接,或者接收其他系统设备的故障...

    最新短信平台软件需求分析说明

    - **项目需求**:百货公司希望通过短信平台改进客户服务和管理方式,对接业务系统,提升办公自动化水平。 - **接口需求**: - **二次开发接口**:提供WebService、Socket、HTTP接口,允许不同系统接入。...

    客户开发岗位职责15篇.docx

    【客户开发岗位职责】在互联网行业中,客户开发岗位涵盖了多个技术领域,主要涉及软件开发、硬件接口对接、应用软件设计和市场拓展等多个方面。以下是基于提供的内容,对这些职责的详细解析: 1. **深度学习软件...

    电信SMGP协议开发包源码

    1. **连接管理**:API提供了建立和维护与短信网关连接的类,如Socket连接,通常需要设置TCP/IP参数,如服务器地址、端口号等。 2. **消息编码解码**:SMGP协议的消息是二进制格式的,因此API中会包含将业务数据转换...

    Java网络开发--TCP协议

    TCP协议在处理客户-服务器事务时存在两个主要问题。一是三次握手过程会增加一个往返时间(RTT),导致事务响应时间增加。二是由于客户端首先发起FIN报文关闭连接,客户端会在TIME_WAIT状态停留约240秒,这限制了同一...

    客户开发岗位职责15篇.pdf

    这个岗位主要涉及深度学习相关的应用程序开发,包括深度学习框架的移植与优化以及辅助工具的开发。理想的候选人需要有3年以上的纯开发经验,拥有电子工程、计算机或自动化等相关专业的本科及以上学历。必须热爱编程...

Global site tag (gtag.js) - Google Analytics