`
amornio19840908
  • 浏览: 55875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java socket , 服务端与客户端多线程交互

    博客分类:
  • java
阅读更多
Socket服务端,用一个池对象来保存SocketServer接收到的socket链接。

实现过程中注意

接收客户端连接,只要客户端进行了连接,就会触发accept();从而建立连接。如下:
socket=serverSocket.accept(); 

此时需要new Handler(socket)一个对象,并将其放入线程池中。如下:
executorService.execute(new Handler(socket));

socket服务端,可做的内容如下:

1)根据与客户端约定好的数据格式,例如:数据的前4位代表userName,5-8位代表客户端请求服务端的methodName。等等,提供相应服务。

2)可以根据socket服务端机器的能力强弱,控制线程池大小。并提供实时的服务器链接数,从而让客户端用户能够选择压力较小的服务器进行链接。提供稳定流畅的服务。

3)可自己封装一个java.net.Socket类MySocket,在其对象里放入一个唯一标志例如客服端传递过来userName,进而实现一个userName,同时只能一个点连接上服务端。

下面是代码:

MultiThreadServer
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadServer {
    private int port=8888;
    private ServerSocket serverSocket;
    private ExecutorService executorService;//线程池
    private final int POOL_SIZE=5;//单个CPU线程池大小
    
    public MultiThreadServer() throws IOException{
        serverSocket=new ServerSocket(port);
        //Runtime的availableProcessor()方法返回当前系统的CPU数目.
        executorService=Executors.newFixedThreadPool(POOL_SIZE);
        System.out.println("服务器启动");
    }
    
    public void service(){
        while(true){
            Socket socket=null;
            try {
                //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
                socket=serverSocket.accept();
                executorService.execute(new Handler(socket));
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        new MultiThreadServer().service();
    }

}

class Handler implements Runnable{
    private Socket socket;
    public Handler(Socket socket){
        this.socket=socket;
    }
    private BufferedOutputStream getWriter(Socket socket) throws IOException
    {
        OutputStream socketOut = socket.getOutputStream();
        BufferedOutputStream buff = new BufferedOutputStream(socketOut);
        return buff;
    }

    private BufferedInputStream getReader(Socket socket) throws IOException
    {
        InputStream socketIn = socket.getInputStream();
        return new BufferedInputStream(socketIn);
    }
    public String echo(String msg){
        return "echo:"+msg;
    }
    public void run(){
        try {
            System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
            BufferedInputStream bis = getReader(socket);
            BufferedOutputStream bos = getWriter(socket);
            
            while (true)
            {
                byte[] sizeb = new byte[1024];
                bis.read(sizeb);
                // 根据于客户端约定好的数据格式,执行对应业务。
                System.out.println(new String(sizeb));
                
                String echo = " Hi " + socket.getInetAddress();
                byte[] response = echo.getBytes();
                
                bos.write(response); // 
                bos.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
}


由于我们项目的客户端是C#项目,所以我就直接copy了网络上的一个例子,如下:

ClientThread
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

class ClientThread implements Runnable
{

    Socket socket = null;

    int    id     = 0;

    public ClientThread(Socket socket, int id)
    {

        this.socket = socket;

        this.id = id;

    }

    @Override
    public void run()
    {

        OutputStream out = null;

        InputStream in = null;

        System.out.println("Begin to Chat to server...");

        try
        {

            out = socket.getOutputStream();

            in = socket.getInputStream();

            // 循环发送与服务端不停的交互数据

            while (true)
            {

                try
                {

                    Thread.sleep(1000);

                }
                catch (InterruptedException e)
                {

                    e.printStackTrace();

                }

                doWrite(out);

                System.out.println("begin read message from server.");

                doRead(in);

            }

        }
        catch (IOException e)
        {

            e.printStackTrace();

        }

        finally
        {

            try
            {

                in.close();

                out.close();

            }
            catch (IOException e)
            {

                e.printStackTrace();

            }

        }

    }

    /**
     * 
     * 读取服务端数据
     * 
     * @param in
     * 
     * @return
     */

    public static boolean doRead(InputStream in)
    {

        // 引用关系,不要在此处关闭流

        byte[] bytes = new byte[1024];

        try
        {

            in.read(bytes);

            System.out.println("line:" + new String(bytes).trim());

        }
        catch (IOException e)
        {

            e.printStackTrace();

        }

        return true;

    }

    /**
     * 
     * 发送数据到服务端
     * 
     * @param out
     * 
     * @return
     */

    public boolean doWrite(OutputStream out)
    {

        // 引用关系,不要在此处关闭流

        String line = "Hello server, I am client = " + id + "\n";

        line = line + "I want you to do something for me";

        try
        {

            out.write(line.getBytes());

            out.flush();

        }
        catch (IOException e)
        {

            e.printStackTrace();

        }

        return true;

    }

}


ClientMain
import java.io.IOException;
import java.net.Socket;

public class ClientMain
{

    public static void main(String[] args)
    {

        Socket socket = null;

        System.out.println("ClientSocket Begin........");

        try
        {

            for (int i = 0; i < 5; i++)
            {

                socket = new Socket("192.168.6.168", 8888);

                new Thread(new ClientThread(socket, i), "ClientThread " + i).start();

            }

        }
        catch (IOException e)
        {

            e.printStackTrace();
        }

    }
}
分享到:
评论

相关推荐

    基于TCP用于模拟UDP广播的Socket服务端程序

    该Demo基于TCP用于模拟UDP广播的Socket服务端程序,能够实时监听基于TCP协议的socket客户端的连接和断开,可以用于简单的实现服务端向多客户端发送信息,进行交互

    java Socket多线程通讯实例

    Java tcp通讯,运用多线程,一个服务端与多个客户端进行交互

    java多线程QQ聊天

    多线程实现QQ聊天,socket实现客户端与服务端的交互,可以显示在线人数,在线好友等等。

    服务器程序

    采用多线程技术解决了服务端由于需要 等待客户端链接与客户端进行数据交互致使服务端不可进行其他操作的弊端。 客户端: 客户端可以向服务端发出请求信息,要求服务端从数据库中查询数据并发送到客户端。...

    winfrom程序通过socket来完成程序段和服务器端交互实例

    这两天参考网上资料做的一个基础的winfrom程序通过socket来完成程序段和服务器端交互实例,希望可以帮到有需要的童鞋。

    C/C++多线程文件传输v2.2完整源码(断点续传 网络消息收发 高效率 界面与后台线程交互)

    多线程socket文件传输/支持断点续传/收发消息/点对多点 使用阻塞方式的socket,使用多线程,有较高的性能. 在局域网中测试达到极限速度. 支持断点续传. 服务端可同时接收多个文件. 传输文件的同时可以发送网络消息. ...

    socket.rar

    里面包含的三组Linux下的socket编程,过程从简单到复杂,有服务端和客户端,生产者消费者,上锁,以及多线程的交互

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    多线程文件传输V2.2 支持断点续传 收发消息 点对多点 完整源代码(C/C++)

    使用阻塞方式的socket,使用多线程,有较高的性能. 在局域网中测试达到极限速度. 支持断点续传. 服务端可同时接收多个文件. 传输文件的同时可以发送网络消息. 用户界面与后台线程交互 如有问题请与我联系: hongxing777...

    java多线程tcpsocketserver源码-simple-rpc:基于netty的具有服务发现的RPC

    java多线程tcp socket server源码 simple-rpc - RPC with service discovery BASED ON NETTY ======================================================== Quick Start 本地下载启动Zookeeper 运行 ClientBuilderTest...

    JAVA聊天室实验报告.doc

    所需知识包括java程序设计语言、swing基本GUI组 件、多线程编程、socket编程、集成开发环境使用eclipse。系统采用两层C/S体系结构 ,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能; S端是聊天...

    popen 实现c/s模式shell功能

    采用多线程架构,每个线程可与客户端连接。通过接受客户端从管道中写入的命令,执行,并将返回结果写入管道由客户端读出。 Server端通过socket套接字接收client 端发出的信息,发送到套接字中的内容包括数据的...

    chatRoom 聊天室

    聊天室聊天室服务端 package chatroom; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import ...

    Silverlight2.0功能展示Demo源码

    Silverlight 2.0 使用Thread, Timer, BackgroundWorker, ThreadPool来实现多线程开发。 Thread - 用于线程的创建和控制的类 Timer - 用于以指定的时间间隔执行指定的方法的类 BackgroundWorker - 用于在单独的线程上...

    C++Builder 6.0设计师之路 pdf版

    书中详细介绍了关键的编程概念和利用vcl环境来开发应用程序的基础知识,还提供了上百个如何在vcl环境下使用c++ builder功能的技巧、具有实践性的建议...windows窗体、图形编程、多线程技术、数据库应用、分布式应用、web等等...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    Socket实现简单的ssh服务端 积极思考正能量 Socket实现简单的ssh2 Socket粘包 Socket粘包深入编码 SocketServer SocketServer多并发 多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 ...

    vc++ 开发实例源码包

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    python网络编程之五子棋游戏

    本案例基于UDP的socket编程方法来制作五子棋程序,网络五子棋采用C/S架构,分为服务器端和客户端,游戏时服务端首先启动,当客户端启动连接后,服务器端可以走棋,轮到自己棋才可以在棋盘上落子,同时下方标签会显示...

Global site tag (gtag.js) - Google Analytics