Socket网络编程例子
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网络编程例子的更多相关文章
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
- 项目总结——深入浅出socket网络编程
前言: 为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求. 首先大家应该明确的是s ...
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...
- SOCKET网络编程5
SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢 ...
- SOCKET网络编程细节问题(4)
SOCKET网络编程快速上手(二)——细节问题(4) 5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号 ...
随机推荐
- 并行计算之OpenMP入门简介
在上一篇文章中介绍了并行计算的基础概念,也顺便介绍了OpenMP. OpenMp提供了对于并行描述的高层抽象,降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现 ...
- OpenSSL进行SSL通讯的一些问题
这两个星期真是被OpenSSL给烦透了,几个很简单基本的问题(如果没人告诉你真的很难测出来)把我搞的..哎,有时候真是不知道自己该不该搞技术,发现自己头脑真是蠢得很... 直接上正题. 第一个问题: ...
- object-单例设计模式
1.什么是单例? 单例是一种数据共享的方法,其实就是等同于c语言中的全局变量.在整个程序生命周期内,该对象只有一份存在内存中,可以在多个对象之间共享数据 单例其实就相当于一个类只能有一个实 ...
- for循环内 执行$ajax(){}
真是郁闷,在for 循环里添加了ajax异步传输之后,for循环是单线程处理,就是里面执行的是ajax,也不异步处理数据.而是执行完for循环的次数后,一起把ajax的数据处理掉. 解决办法.分开吧! ...
- HackerRank "The Indian Job"
A sly knapsack problem in disguise! Thanks to https://github.com/bhajunsingh/programming-challanges/ ...
- bzoj3545: [ONTAK2010]Peaks
Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询 ...
- Python 派生类子类继承类
1.创建list类的子类Namedlist,初始化新类,创建新对象实例johnny,检查对象类型,并使用list的一些功能来存储数据 >>> class Namedlist(list ...
- Linux下的ntpd和ntpdate
两者有个比较实质性的差异是,ntpd在实际同步时间时是一点点的校准过来时间的,最终把时间慢慢的校正对.而ntpdate不会考虑其他程序是否会阵痛,直接调整时间.一个是校准,一个是调整.另外ntpd 在 ...
- 怎样进行Android UI元素设计
Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...
- Accounting_权责发生制和收付实现值的区别(概念)
2014-07-11 BaoXinjian