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. ORALCE 游标简单的实例

    --取简单的游标 declare cursor sp is select * from user_tables; myrecord user_tables%ROWTYPE; begin open sp ...

  2. 程序员书单_java web编程篇

    李兴华JavaWeb开发实战经典 http://download.csdn.net/detail/shenzhq1980/9137653 Servlet与JSP核心编程 第2版_1 http://do ...

  3. 【jmeter】JMeter测试MongoDB

    JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: pa ...

  4. 【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计

    架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由kee ...

  5. bzoj4702: 装箱游戏

    Description Alice和Bob正在玩一个非常无聊的游戏以打发时间.游戏是这样的.初始的时候,有n个箱子和m个物品.箱子.物 品都是不同的.因此有nm种方法把这些物品放到箱子里.两个人轮流操 ...

  6. 51nod 1411 矩阵取数问题 V3

    给定一个m行n列的矩阵,你可以从任意位置开始取数,到达任意位置都可以结束,每次可以走到的数是当前这个数上下左右的邻居之一,唯一的限制是每个位置只能经过一次,也就是说你的路径不自交.所经过的数的总作为你 ...

  7. flash builder 启动ios模拟器失败是什么原因?

    参考知乎:http://www.zhihu.com/question/22537362 在mac os设置-安全性与隐私-隐私-辅助功能 找到flash bulder 打上前面的勾,如下图:

  8. C#使用ConditionalAttribute特性来实现代码调试

    转自:http://www.csharpwin.com/csharpspace/10729r8541.shtml #if/#endif条件编译常用来由同一份源代码生成不同的结果文件,最常见的有debu ...

  9. java处理日期时间

    java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作 ...

  10. Redis内存使用优化与存储(转)

    Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部 ...