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读取文件的方式

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

时间: 2024-10-27 08:21:43

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

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

windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先写了个简单的winSocket网路通信的例子,以便以后用到的时候有个参考. windows下使用winsock编程与linux/unix的区别在于windows下需要先有一个初始化的操作,结束的时候需要一个清理的操作.还有windows下编译的时候需要连接ws32_lib库. 大致过程如下 1.初始

Linux Socket 网络编程

Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后,过段时间不看,重新拾起这些知识的时候又要从头开始,所以,在这里做个笔记也算是做个模板,以后可以直接从某一个阶段开始接着玩... 1. socket套接字介绍 socket机制其实就是包括socket, bind, listen, connect, accept等函数的方法,其通过指定的函数实现不同

Socket网络编程 详细过程(转)

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().co

Socket网络编程--epoll小结

以前使用的用于I/O多路复用为了方便就使用select函数,但select这个函数是有缺陷的.因为它所支持的并发连接数是有限的(一般小于1024),因为用户处理的数组是使用硬编码的.这个最大值为FD_SETSIZE,这是在<sys/select.h>中的一个常量,它说明了最大的描述符数.但是对于大多数应用程序而言,这个数是够用的,而且有可能还是太大的,多数应用程序只使用3~10个描述符.而如今的网络服务器小小的都有几万的连接,虽然可以使用多线程多进程(也就有N*1024个).但是这样处理起来既

Python Socket 网络编程

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用 Python 进行 TCP Socket 网络编程,假设你已

day7 socket网络编程

Python Socket网络编程 Socket是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的,例如我们每天浏览网页.QQ聊天.收发emali等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在TCP/IP网络协议中,就是通过(IP地址,协议,端口号)三元组来识别进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python进行TCP Socket网络编程,

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

python进阶之Socket 网络编程

 一:网络编程介绍   自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信. 举个例子,当你使用浏览器访问新浪网时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后,新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上. 由于你的电脑上可能不止浏览器,还有QQ.Skype.Dropbox.邮件客户端等,不同的程序连接的别的计算机也会不同,所以,更

socket网络编程的一些基础知识

源地址:http://blog.csdn.net/roger_77/article/details/1453049 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数