1.为了安全的进行通信,基于ACK确认机制----重传机制

使用selector机制的多路复用的IO通信机制,此外还有epoll控制

业务挂接点或者接入点:

常见的接入点:

  RDBMS进行CRUD

  MQ消息服务器接入

  SOA接入点

如果统一,最好使用adapter适配器接入,方便扩展

package com.text.thread;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
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.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level; public class SocketUtil { ExecutorService excu = Executors.newFixedThreadPool(100);
private volatile boolean status = true; void startServer(int port, String message) {
try {
ServerSocket serverSocket = new ServerSocket(port);
if (status) {
serverSocket.close();
} while (status) {
Socket socket = serverSocket.accept();
Runnable task = new ServerTask(socket, message);
excu.submit(task);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
} void startNioServer(int port, String messages) {
Selector selector = null;
ServerSocketChannel serverSocketChannel = null; try {
selector = Selector.open(); serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false); serverSocketChannel.socket().setReuseAddress(true);
serverSocketChannel.socket().bind(new InetSocketAddress(port)); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (selector.select() > 0) {
Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while (it.hasNext()) {
SelectionKey readyKey = it.next();
it.remove(); ServerSocketChannel sChannel = (ServerSocketChannel) readyKey.channel();
SocketChannel schannel = sChannel.accept(); String messgae = "";
ByteBuffer dsts = ByteBuffer.allocate(256);
int flag = -1;
while((flag = schannel.read(dsts))!=-1){
String msg = new String(dsts.array(),"GBK");
messgae+="\n" + msg;
} System.out.println("server:" + messgae);//此处就是具体的业务挂节点或者接入点--比如执行DB操作或者执行MQ操作

ByteBuffer bf = ByteBuffer.wrap(messages.getBytes());
schannel.write(bf); schannel.close();
}
}
} catch (Exception e) { }
} void requestNio(String host,int port,String msg){ SocketChannel socketChannel;
try {
socketChannel = SocketChannel.open();
SocketAddress socketAddress = new InetSocketAddress(host, port);
socketChannel.connect(socketAddress); ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
socketChannel.write(buffer);
socketChannel.socket().shutdownOutput(); ByteBuffer dsts = ByteBuffer.allocate(100);
socketChannel.read(dsts); System.out.println(new String(dsts.array())); socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
} } private void executeTask(ServerSocketChannel serverSocketChannel,String msg) {
SocketChannel socketChannel = null;
try {
socketChannel = serverSocketChannel.accept(); socketChannel.socket().shutdownOutput(); } catch (IOException e) {
e.printStackTrace();
} finally {
try {
socketChannel.close();
} catch(Exception ex) {}
}
} void stopServer() {
status = false;
} String request(String ip, int port, String message) {
String result = "";
try {
Socket socket = new Socket(ip, port); OutputStream out = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out);
BufferedWriter bufferedWriter = new BufferedWriter(
outputStreamWriter); bufferedWriter.write("new Msg");// 换行
bufferedWriter.newLine();// 换行
bufferedWriter.write(message);
bufferedWriter.newLine();// 换行
bufferedWriter.flush();
socket.shutdownOutput();
System.out.println("client:发送成功!!!"); InputStream in = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader); System.out.println("client:" + bufferedReader.readLine());
result = bufferedReader.readLine();
bufferedReader.close();
bufferedWriter.close(); } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
} static class ServerTask implements Runnable { Socket socket;
String message; public ServerTask(Socket socket, String message) {
this.socket = socket;
this.message = message;
} @Override
public void run() {
InputStream in;
try {
in = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader); String temp = "";
String msg = "";
String str = bufferedReader.readLine();
if (str != null && !str.equals("new Msg")) {
System.out.println("此消息已经接收!!!");
temp = "!已经接受过";
} else { while (str != null) {
msg += str + "\n";
str = bufferedReader.readLine();
}
System.out.println("server:\n" + msg);
}
OutputStream out = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
out);
BufferedWriter bufferedWriter = new BufferedWriter(
outputStreamWriter); bufferedWriter.write(message + temp);
bufferedWriter.newLine();// 换行
bufferedWriter.flush(); System.out.println("server:完成");
bufferedWriter.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
} } } }
        SocketUtil socketUtil = new SocketUtil();
String message = "1001-102401-骨科一病区-李四-20140908|20140925-3786.98元!";
socketUtil.request("127.0.0.1", 9999, message );
SocketUtil socketUtil = new SocketUtil();
socketUtil.startServer( 9999, "ack"); 消息:(协议自己按照业务需求进行定义,只要双方可以交流通信即可!!!)

MSH|^~\&|LIS||HIS|DEP|201106271801||ACK^O13|MSG11O1O5OOO001|P|2.4|| MSG11O1O5OOO001||||utf-8

MSA|AE|MSG11O1O5OOO001||||103

 

 MSH|^~\&|LIS||HIS|DEP|201106271801||ACK^O13|MSG11O1O5OOO001|P|2.4|| MSG11O1O5OOO001||||utf-8

 MSA|AA|MSG11O1O5OOO001||||0

对于文件的传输,把文件压缩进行传输,为了安全,可以生成摘要信息,采取MD5或者RAS加密传输更加安全

对于大文件,分割多线程传输,采取Random读取文件的方式

服务器端接受到请求,必须发送收到的标识码,否则客户重新发送,加一个重发的标示符

Socket网络编程例子的更多相关文章

  1. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  4. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  5. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

  6. 项目总结——深入浅出socket网络编程

    前言: 为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求. 首先大家应该明确的是s ...

  7. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  8. SOCKET网络编程5

    SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢 ...

  9. SOCKET网络编程细节问题(4)

    SOCKET网络编程快速上手(二)——细节问题(4) 5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号 ...

随机推荐

  1. HTTP请求方法对照表

    根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...

  2. 在.net中悄悄执行dos命令,并获取执行的结果(转)

    一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = ...

  3. PERCENT_RANK

    1. percent_rank() over (order by .....) 返回某列或某列组合后每行的百分比排序 如下: with cte as(  SELECT ROWNUM as n  FRO ...

  4. 基于jQuery动态创建html元素

    在做web前端开发的时候,经常遇到一些数据多少或则类型不能在运行之前就确定下来的情况,此时,数据的展示,就要借助于动态创建html元素来展示了. 常见的动态创建HTML元素的方式,有如下几种,大体都差 ...

  5. windows p12(pfx)个人证书安装过程

    证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及C ...

  6. 清理java环境

    system32中存在3个java*.exe文件,分别是: c:/windows/system32/java.exe c:/windows/system32/javaw.exe c:/windows/ ...

  7. MySQL优化—工欲善其事,必先利其器之EXPLAIN

    最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下EXPLAIN. 内容导航 id select_t ...

  8. PLSQL_性能优化系列06_Oracle Soft Parse / Hard Parse软硬解析

    2014-08-11 Createed By BaoXinjian

  9. VMware和CentOS7安装和配置

    准备工作: 下载: 1.VMware-workstation-full-10.0.0-1295980 2.CentOS-7-x86_64-DVD-1511.iso 安装: 1.VMware-works ...

  10. Linux 链接(转载)

    来源:http://www.cnblogs.com/sonic4x/archive/2011/08/05/2128543.html 1.Linux链接概念Linux链接分两种,一种被称为硬链接(Har ...