`
amornio19840908
  • 浏览: 57081 次
  • 性别: 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();
        }

    }
}
分享到:
评论

相关推荐

    java编写socket服务端和客户端给予cmpp3.0

    Java 编写基于 CMPP3.0 的 Socket 服务端和客户端是移动通讯领域中常见的技术实践,主要用于实现与移动运营商的短信网关进行数据交互。CMPP(China Mobile Short Message Peer-to-Peer)是中国移动制定的一种短消息...

    java socket服务端和客户端

    在这个"java socket服务端和客户端"的项目中,我们可以探讨以下几个关键知识点: 1. **Socket类和ServerSocket类**: - `Socket`类代表了网络上的一个连接,它用于建立客户端到服务器的连接,并进行数据传输。通过...

    java socket长连接客户端服务端(标准实例)

    ### Java Socket 长连接客户端和服务端实现 在Java中,使用Socket进行网络通信是一种非常常见的技术手段。本文将详细解读“Java Socket长连接客户端服务端(标准实例)”的相关知识点,包括其实现原理、代码解析及...

    j2me socket 服务端与 客户端聊天

    5. **关闭资源**:服务器端在完成与客户端的交互后,也需要关闭输入流、输出流和 Socket。 **测试与模拟器** 项目中的 "testProject" 可能包含了服务端的测试代码,而 "j2me与j2se聊天" 可能是客户端的 J2ME 代码...

    基于Android的简单Socket服务端与客户端

    在这个项目中,"基于Android的简单Socket服务端与客户端"实现了两个Android应用程序:一个作为服务端,另一个作为客户端,它们通过Socket进行数据交换。 首先,我们要理解Socket的工作原理。Socket是网络编程的基本...

    自己写的Java Socket服务端

    本项目是一个自己编写的Java多线程Socket服务端,能够接收来自网络调试助手或其他客户端的数据。 首先,我们需要理解Java Socket的基本概念。Socket是网络上的两个进程间通信的端点,就像电话线两端的电话一样。在...

    Socket服务端和客户端代码

    标题中的"Socket服务端和客户端代码"是指使用C#编写的服务端程序与客户端程序,它们通过Socket进行交互。 服务端通常负责监听特定IP地址和端口,等待客户端连接。描述中提到"一个服务端对应多个客户端",这是典型的...

    flex的socket客户端连接java多线程socket服务端demo

    本示例探讨了如何使用Adobe Flex作为客户端,通过Socket接口与Java实现的多线程Socket服务端进行通信。以下是对这个主题的详细解释: 首先,Flex是一种开放源代码的富互联网应用程序(RIA)开发框架,它允许开发者...

    SOCKET 服务端 多线程处理客户端例子

    在"SOCKET服务端多线程处理客户端例子"中,核心在于如何有效地处理来自多个客户端的并发请求。传统的单线程模型在面对大量并发请求时,性能会显著下降,因为服务器需要依次处理每个请求,无法同时处理多个。为解决这...

    java_socket服务端和客户端编程.doc

    ### Java Socket 服务端与客户端编程详解 #### 一、网络编程中的主要问题及解决方案 在进行网络编程时,我们面临着两大核心问题:如何精确地定位网络中的主机以及如何高效可靠地进行数据传输。 1. **主机定位**:...

    java_socket服务端和客户端编程[借鉴].pdf

    Java Socket服务端和客户端编程是Java软件开发中的一个重要部分,主要涉及网络通信和TCP/IP协议。网络编程的主要目标是定位网络主机并实现可靠的数据传输。TCP/IP协议族在这两方面都扮演了关键角色,其中IP层负责...

    c#多线程socket开发(一个服务器对多个客户端)

    "C#多线程Socket开发" C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。这里,我们将详细讲解如何使用C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话...

    Java课程设计(客户端和服务端交互下载器)

    Java课程设计中的“客户端和服务端交互下载器”是一个典型的网络编程项目,它涉及到Java的核心概念和技术,包括网络通信、多线程以及文件操作等。在这个项目中,客户端和服务器通过TCP/IP协议进行通信,实现文件的...

    C语言实现TCP服务端与客户端交互

    本教程将深入探讨如何使用C语言实现TCP(Transmission Control Protocol)服务端与客户端的交互。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保数据的正确顺序传输和无损传输。 首先,我们来看`...

    supersocket 服务端控制台与客户端winform案例

    《SuperSocket服务端控制台与客户端WinForm案例详解》 在.NET开发领域,SuperSocket是一个功能强大且易于使用的开源套接字服务器框架,它为开发者提供了构建基于TCP/IP协议的应用程序的强大工具。本案例主要围绕...

    Socket服务器与客户端编程(链表)

    在这个场景中,我们将讨论如何使用Socket实现服务器与客户端的交互,并结合链表数据结构来处理连接请求。链表作为一种动态数据结构,能有效地管理多个客户端连接,尤其是在服务器需要处理大量并发连接时。 首先,...

    socket服务端和客户端通讯

    在本主题中,我们将深入探讨"socket服务端和客户端通讯"的核心概念、步骤以及关键知识点。 首先,Socket是Internet上的应用程序之间进行通信的一种机制,它提供了一种标准接口,使得应用层可以直接与传输层进行交互...

    JAVA聊天 服务端 客户端

    总结来说,"JAVA聊天服务端客户端"是一个涵盖Java网络编程、多线程、用户界面设计、数据传输安全等多个领域的项目。服务端和客户端通过Socket通信,处理并发连接,并确保数据的安全传输。了解这些知识点对于开发和...

    java 售票系统 服务端与客户端

    **服务端**:服务端通常由Java的Servlet或Spring Boot等框架构建,它负责处理来自多个客户端的请求,例如购票、退票、查询票务信息等。服务端需要确保并发控制,因为多个网点可能同时尝试购买同一张票。这可能涉及...

    C# Socket_服务端向指定的客户端发送消息(包含服务器)

    - 可能还包括多线程或异步处理,以处理多个并发客户端 总的来说,C# Socket编程为我们提供了一种强大的工具来构建网络通信应用。无论是简单的聊天室还是复杂的分布式系统,理解如何创建和管理Socket,以及如何在...

Global site tag (gtag.js) - Google Analytics